内容
USB-CTR08的驱动程序
1、介绍
这是一个用于MeasurementComputing的USB-CTR04和USB-CTR08的EPICS驱动程序。
此驱动程序用C++编写,并且由一个从asynPortDriver继承的类组成,asynPortDriver是EPICS asyn模块的组成部分。
这个模块有以下功能:
a) 数字输入/输出:8个信号,独自可编程为输入或输出
b) 脉冲生成器,4个脉冲生成器,每一个都有
- 48Mz时钟,32比特寄存器
- 可编程周期,宽度,脉冲数,极性
c) 计数器,8个计数器(USB-CTR08)或4个计数器(USB-CTR04)
- 48MHz最大计数率
- 支持EPICS scaler记录(类似于Joerger VSC和SIS3820)
- 支持多通道Scaler(MCS)模式,类似SIS3820
2、配置
在用于USBCTR的EPICS启动脚本中需要以下行:
< envPaths
## 注册所有需要的组件
dbLoadDatabase "$(MEASCOMP)/dbd/measCompApp.dbd"
measCompApp_registerRecordDeviceDriver pdbbase
## 设置要用到的环境变量
epicsEnvSet("PREFIX", "USBCTR:")
epicsEnvSet("PORT", "USBCTR_1")
epicsEnvSet("UNIQUE_ID", "01DAB103")
epicsEnvSet("MCS_PREFIX", "$(PREFIX)MCS:")
epicsEnvSet("RNAME", "mca")
epicsEnvSet("MAX_COUNTERS", "9")
epicsEnvSet("MAX_POINTS", "2048")
epicsEnvSet("POLL_TIME", "0.01")
epicsEnvSet("PORT", "USBCTR")
# 对于MCA记录,FIELD=READ;对于waveform记录,FIELD=PROC
epicsEnvSet("FIELD", "PROC")
## 设置最小睡眠时间为1ms
asynSetMinTimerPeriod(0.001)
## 配置端口驱动程序
# USBCTRConfig(portName, # 这个asyn端口驱动程序的名称
# uniqueID, # 设备序列号
# maxTimePoints, # 对于MCS时间点的最大数目
# pollTime, # 轮询之间的睡眠时间
USBCTRConfig("$(PORT)", "$(UNIQUE_ID)", $(MAX_POINTS), $(POLL_TIME))
#asynSetTraceMask($(PORT), -1, ERROR|FLOW|DRIVER)
dbLoadTemplate("$(MEASCOMP)/db/USBCTR.substitutions", "P=$(PREFIX), PORT=$(PORT)")
# 这装载scaler记录和进行支持的记录
dbLoadRecords("$(SCALER)/db/scaler.db", "P=$(PREFIX), S=scaler1, DTYP=Asyn Scaler, OUT=@asyn(USBCTR), FREQ=10000000")
# 此数据库提供了对MCS功能的支持
dbLoadRecords("$(MEASCOMP)/db/measCompMCS.template", "P=$(MCS_PREFIX), PORT=$(PORT), MAX_POINTS=$(MAX_POINTS)")
# 以下装载MCA或者waveform记录
# 装载的记录数目必须与以上定义的MAX_COUNTERS相同
# 装载MCA记录
#dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(MCS_PREFIX), M=$(RNAME)1, DTYP=asynMCA, INP=@asyn($(PORT) 0), PREC=3, CHANS=$(MAX_POINTS)")
#dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(MCS_PREFIX), M=$(RNAME)2, DTYP=asynMCA, INP=@asyn($(PORT) 1), PREC=3, CHANS=$(MAX_POINTS)")
#dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(MCS_PREFIX), M=$(RNAME)3, DTYP=asynMCA, INP=@asyn($(PORT) 2), PREC=3, CHANS=$(MAX_POINTS)")
#dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(MCS_PREFIX), M=$(RNAME)4, DTYP=asynMCA, INP=@asyn($(PORT) 3), PREC=3, CHANS=$(MAX_POINTS)")
#dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(MCS_PREFIX), M=$(RNAME)5, DTYP=asynMCA, INP=@asyn($(PORT) 4), PREC=3, CHANS=$(MAX_POINTS)")
#dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(MCS_PREFIX), M=$(RNAME)6, DTYP=asynMCA, INP=@asyn($(PORT) 5), PREC=3, CHANS=$(MAX_POINTS)")
#dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(MCS_PREFIX), M=$(RNAME)7, DTYP=asynMCA, INP=@asyn($(PORT) 6), PREC=3, CHANS=$(MAX_POINTS)")
#dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(MCS_PREFIX), M=$(RNAME)8, DTYP=asynMCA, INP=@asyn($(PORT) 7), PREC=3, CHANS=$(MAX_POINTS)")
#dbLoadRecords("$(MCA)/mcaApp/Db/simple_mca.db", "P=$(MCS_PREFIX), M=$(RNAME)9, DTYP=asynMCA, INP=@asyn($(PORT) 8), PREC=3, CHANS=$(MAX_POINTS)")
# 这装载waveform记录
dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template", "P=$(MCS_PREFIX), R=$(RNAME)1, INP=@asyn($(PORT) 0), CHANS=$(MAX_POINTS)")
dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template", "P=$(MCS_PREFIX), R=$(RNAME)2, INP=@asyn($(PORT) 1), CHANS=$(MAX_POINTS)")
dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template", "P=$(MCS_PREFIX), R=$(RNAME)3, INP=@asyn($(PORT) 2), CHANS=$(MAX_POINTS)")
dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template", "P=$(MCS_PREFIX), R=$(RNAME)4, INP=@asyn($(PORT) 3), CHANS=$(MAX_POINTS)")
dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template", "P=$(MCS_PREFIX), R=$(RNAME)5, INP=@asyn($(PORT) 4), CHANS=$(MAX_POINTS)")
dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template", "P=$(MCS_PREFIX), R=$(RNAME)6, INP=@asyn($(PORT) 5), CHANS=$(MAX_POINTS)")
dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template", "P=$(MCS_PREFIX), R=$(RNAME)7, INP=@asyn($(PORT) 6), CHANS=$(MAX_POINTS)")
dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template", "P=$(MCS_PREFIX), R=$(RNAME)8, INP=@asyn($(PORT) 7), CHANS=$(MAX_POINTS)")
dbLoadRecords("$(MCA)/mcaApp/Db/SIS38XX_waveform.template", "P=$(MCS_PREFIX), R=$(RNAME)9, INP=@asyn($(PORT) 8), CHANS=$(MAX_POINTS)")
< ../save_restore.cmd
iocInit
seq(USBCTR_SNL, "P=$(MCS_PREFIX), R=$(RNAME), NUM_COUNTERS=$(MAX_COUNTERS), FIELD=$(FIELD)")
create_monitor_set("auto_settings.req",30,"P=$(PREFIX), MP=$(MCS_PREFIX)")
measComp模块带了一个示例iocBootUSBCTR目录,它包含了一个示例启动脚本(如以上内容)和示例替代文件(如以下内容):
file "$(MEASCOMP)/db/measCompLongIn.template"
{
pattern
{ R, MASK, ADDR}
{Li, 0xFF, 0}
}
file "$(MEASCOMP)/db/measCompBinaryIn.template"
{
pattern
{ R, MASK, ADDR}
{Bi1, 0x01, 0}
{Bi2, 0x02, 0}
{Bi3, 0x04, 0}
{Bi4, 0x08, 0}
{Bi5, 0x10, 0}
{Bi6, 0x20, 0}
{Bi7, 0x40, 0}
{Bi8, 0x80, 0}
}
file "$(MEASCOMP)/db/measCompLongOut.template"
{
pattern
{ R, MASK, ADDR}
{Lo, 0xFF, 0}
}
file "$(MEASCOMP)/db/measCompBinaryOut.template"
{
pattern
{ R, MASK, ADDR}
{Bo1, 0x01, 0}
{Bo2, 0x02, 0}
{Bo3, 0x04, 0}
{Bo4, 0x08, 0}
{Bo5, 0x10, 0}
{Bo6, 0x20, 0}
{Bo7, 0x40, 0}
{Bo8, 0x80, 0}
}
# Direction bits on binary I/O
# VAL 0=input, 1=output
file "$(MEASCOMP)/db/measCompBinaryDir.template"
{
pattern
{ R, MASK, VAL, ADDR}
{Bd1, 0x01, 0, 0}
{Bd2, 0x02, 0, 0}
{Bd3, 0x04, 0, 0}
{Bd4, 0x08, 0, 0}
{Bd5, 0x10, 1, 0}
{Bd6, 0x20, 1, 0}
{Bd7, 0x40, 1, 0}
{Bd8, 0x80, 1, 0}
}
file "$(MEASCOMP)/db/measCompPulseGen.template"
{
pattern
{ R, ADDR, PREC}
{PulseGen1, 0, 4}
{PulseGen2, 1, 4}
{PulseGen3, 2, 4}
{PulseGen4, 3, 4}
}
file "$(MEASCOMP)/db/measCompCounter.template"
{
pattern
{ R, ADDR}
{Counter1, 0}
{Counter2, 1}
{Counter3, 2}
{Counter4, 3}
{Counter5, 4}
{Counter6, 5}
{Counter7, 6}
{Counter8, 7}
}
3、数据库
以下表格列出了与USB-CTR04/08一起使用的数据库模板文件。
1)数字I/O功能
这些是在以下文件中定义的记录
- measCompBinaryIn.template:为每个二进制I/O位装载一次这个数据库。
- measCompLongIn.template:为每个二进制I/O寄存器装载一次此数据库。
- measCompBinaryOut.template:为每个二进制I/O位装载一次这个数据库。
- measCompLongOut.template:为每个二进制I/O寄存器装载一次此数据库。
- measCompBinaryDir.template:为每个二进制I/O位装载一次这个数据库。
EPICS 记录名 |
EPICS 记录类型 |
asyn接口 | drvInfo串 | 描述 |
$(P)$(R) | bi | asynUInt32Digital | DIGITAL _INPUT |
数字输入值。在INP链接中的MASK参数定义了哪一位被使用。由端口驱动poller线程查询二进制输入,因而这些记录应该设为"SCAN="I/O Intr"。 |
$(P)$(R) | longin | asynUInt32Digital | DIGITAL _INPUT |
数字输入值当作一个字节,而不是单独的位。在INP链接中的MASK参数定义了使用哪些位。由端口驱动poller线程查询二进制输入,因而这个记录应该设为"SCAN="I/O Intr"。 |
$(P)$(R) | bo | asynUInt32Digital | DIGITAL _OUTPUT |
数字输出值。在OUT链接的MASK参数定义了哪一位被使用。 |
$(P)$(R) _RBV |
bi | asynUInt32Digital | DIGITAL _OUTPUT |
数字输出值的回读。在INP链接中的MASK参数定义了哪个位被使用了。 |
$(P)$(R) | longout | asynUInt32Digital | DIGITAL _OUTPUT |
数字输出值作为一个字节,而不是单独的位。在INP链接中的MASK参数定义使用了哪些位。 |
$(P)$(R) _RBV |
longin | asynUInt32Digital | DIGITAL _OUTPUT |
数字输出值回读作为一个字节,而不是单独的位。在INP链接中的MASK定义了使用了哪些位。 |
$(P)$(R) | bo | asynUInt32Digital | DIGITAL _DIRECTION |
这个I/O线的方向,"In"(0)或"Out"(1)。在INP中的MASK参数定义使用了哪一位。 |
2) 脉冲生成器功能
注意:这些在Measurement Computing的文档中被称为"计时器"。
在measCompPulseGen.template中定义了这些记录。位每个脉冲生成器装载这个数据库一次。
EPICS 记录名 |
EPICS 记录类型 |
asyn接口 | drvInfo串 | 描述 |
$(P)$(R) Run |
bo | asynUInt32 | PULSE _RUN |
"RUN"(1)启动脉冲生成器,"Stop(0)"停止脉冲生成器。注意:理想地,这个记录正在输出一个有限脉冲数时,它在脉冲计时器结束时,应该变回0。但不幸地,MC库没有提供查询计时器状态来看它是否结束的方式,因而这是不可能的。 |
P)$(R) Period |
ao | asynFloat64 | PULSE _PERIOD |
脉冲周期(秒为单位)。可以用频率或周期定义脉冲之间的时间;当一个记录被更改时,用新计算的值更新另一个。 |
$(P)$(R) Frequency |
ao | N.A. | N.A | 脉冲频率 (秒为单位)。频率计算周期的一个新值,并且发送这个周期值给这个驱动程序。 |
$(P)$(R) Width |
ao | asynFloat64 | PULSE _WIDTH |
脉冲宽度(秒为单位)。可用范围是15.625ns到(周期-15.625ns) |
$(P)$(R) Delay |
ao | asynFloat64 | PULSE _DELAY |
在Run设置1后,初始的脉冲延时。 |
$(P)$(R) Count |
longout | asynInt32 | PULSE _COUNT |
要输出的脉冲数目。如果Count为0,则脉冲生成器在Run被设置为0前连续运行。 |
$(P)$(R)Idle | bo | asynInt32 | PULSE _IDLE _STATE |
脉冲输出线条的空闲状态。"Low"(0)或者"High"(1)。这决定了脉冲的极性,即是:正向或负向。 |
3) Scaler记录支持
USBCTR驱动程序支持通过devScalerAsyn.c设备支持(原先来自synApps std模块,但现在已经被放到了scaler模块)的EPICS scaler记录。它最多支持8个通道。为了使计数器1-7能被计数器0停止,必须进行以下连线:计数器0输出(C0O必须连接到计数器1-7的门输入GXGT,此处X表示1-7)。
.PR1预置是通过计数器0输出和计数器1-7门在硬件中被执行。计数器1-7也能被设置成预置计数器,并且scaler记录将在这些预置值(.PR2-.PR8)中任何值超过其自身预置值时停止计数。但不同于.PR1预置,这些预置是在驱动查询程序的软件中完成的。设备以100Hz发送读取,并且在一个预置被超过时,停止计数。每个计数器将完成完全相同的计时时间,但实际计时用时最长将长于预置时间的0.01秒。
计数器0通常用作预置计数器,并且它被连接到一个固定的频率源。例如,板上任意一个脉冲生成器可以用于提供这个频率源。设置scaler记录的.FREQ字段为那个脉冲生成器的Frequency_RBV的值(实际频率)而不是Frequency字段(请求频率)是重要的,因为这二者可能不同,尤其在频率大于1MHz时。
以下进行测试:
用TMR1用作计数器C0输入的频率,C0的输出连接C1GT,C2GT和C3GT
C1IN连接一个输入频率为50000Hz的信号,C2IN连接TMR2, C3IN连接TMR3
设置TMR1的频率为1000Hz,TMR2的频率为10000Hz,TMR3的频率为100000Hz
设置scaler中clock为1000Hz对应TMR1的FREQUNCY_RBV的值。设置count time为1.0,每次计时1秒钟,按下Count后,进行1s钟计数,TMR1, TMR2,TMR3分别显示了真实的测量频率。
4) 多通道Scaler支持(MCS)
USBCTR驱动提供了非常类似于synApps mca模块中SIS3820驱动的多通道scaler支持。这种支持有以下属性:
1)可以通过用FirstCounter和LastCount记录可以选择在MCS模式中使用的计数器数目。每个范围从0到7;LastCounter必须大于或等于FirstCount。有效计数器的数目因而可以从1到8。
2)无论使用内部或外部超前通道,最小停留时间是250ns乘以有效计数器的数目。例如,如果只使用2个计数器,计数器0上的时钟输入和计数器1上的信号,则最小停留时间是500ns。如果所有8个计数器都被使用,则最小停留时间是2毫秒。
3) MCS或waveform记录都能用于保存时序数据。
4)waveform记录或mca记录的长度是没有限制的,只是系统RAM大小的限制。
5) 通过连接一个外部通道超前信号到USB-CTR模块上外部时钟输入(CLKI),能够直接使用这个外部通道超前信号。这个信号的最小停留时间(周期)如上描述。
6)通过连接它到一个计数器输入,一个外部通道超前可以被"预先标定"(频率除以N)。这个计数器被分配给了PrescaleCounter记录。PrescaleCounter的计数器输出必须连接到USB-CTR模块的外部时钟输入。
6)要实现最短停留时间,计数器必须用16位模式而不是32位模式读入。这被驱动程序自动处理。如果停留时间短于100毫秒,用16位模式读取计数器,而对于更长的停留时间,用32位读取它们。因为最大计数率48MHz,在100微秒,仅能出现4800个计数,其比16位限制小得多,用16位模式读取时不可能丢失数据。注意:当使用外部通道超前时,Dwell记录应该被设置成近部脉冲之间的似外时间。这将使得正确的32位/16位切换发生,因而最小停留时间能够被达到,并且因此计数器对更长的停留时间不会溢出16位。
在measureCompMCS.template中定义了以下记录。每个模块装载一次这个数据库。
EPICS 记录名 |
EPICS 记录类型 |
asyn接口 | drvInfo串 | 描述 |
$(P)$(R) SNL _Connected |
bi | N.A. | N.A. | 如果在USBCR_SNL状态标记语言程序中的所有PVs已经连接了,这个记录是1("Connected")。 |
$(P)$(R) EraseAll |
bo | asynInt32 | MCA _ERASE |
擦除MCS数据,设置这个数组和消耗时间位0。 |
$(P)$(R) EraseStart |
bo | asynInt32 | MCA _ERASE |
擦除MCS数据并且接着通过指向StartAll的转发链接启动MCS采集。 |
$(P)$(R) StartAll |
bo | asynInt32 | MCA _START _ACQUIRE |
启动MCS采集。 |
$(P)$(R) Acquiring |
busy | N.A. | N.A. | 在MCS正在采集时,Busy记录是1("采集")。当结束时,"0"("完成")。 |
$(P)$(R) StopAll |
bo | asynInt32 | MCA_STOP _ACQUIRE |
停止MCS采集。 |
$(P)$(R) PresetReal |
ao | asynFloat64 | MCA _PRESET _REAL |
预设的实际时间。如果非0,在这个事件后采集将为停止。 |
$(P)$(R) ElapsedReal |
ai | asynFloat64 | MCA _ELAPSED _REAL |
消耗的实际时间。 |
$(P)$(R) ReadAll |
bo | N.A. | N.A. | 强制读取所有数组数据。这是由SNL程序完成。 |
$(P)$(R) NuseAll |
longout | asynInt32 | MCA _NUM _CHANNELS |
要采集的时间点数目。 |
$(P)$(R) Current Channel |
longin | asynInt32 | MCA _CURRENT _POINT |
在采集中的当前时间点。 |
$(P)$(R) Dwell |
ao | asynFloat64 | MCA _DWELL _TIME |
处于内部通道超前模式中每个时间点的停留时间 |
$(P)$(R) Channel Advance |
bo | asynInt32 | MCA _CH _ADV _SOURCE |
通道超前源。0=”Internal'“使用DWELL记录,1=”External“使用USB-CTR模块上外部时钟输入。 |
$(P)$(R) Prescale |
bo | asynInt32 | MCA _PRESCALE |
用于外部通道超前源的预缩放因子。要使用预缩放,外部时钟必须接入PrescaleCounter所选的计数器通道,并且PrescaleCounter计数器通道的输出必须连接到外部时钟输入。注意:由于硬件限制,Prescale必须大于1。对于没有预缩放,外部通道超前源必须直接连接到外部时钟输入。 |
$(P)$(R) MCSCounter NEnable (N=1-8) |
bo | asynInt32 | N.A. | 用MCS模式中启用计数器。选项是"No"(0)和"Yes"(1). |
$(P)$(R) MCSDIO Enable |
bo | asynInt32 | N.A. | 在MCS模式中使能采集数字I/O字。选项是"NO"(0)和"Yes"(1)。 |
$(P)$(R) PrescaleCounter |
mbbo | asynInt32 | MCS _PRESCALE _COUNTER |
在MCS模式中用于预先标定外部通道超前的计数器通道。0=”CNTR0“... 7="CNTR7"。 |
$(P)$(R) Point0Action |
mbbo | asynInt32 | MCS _POINT0 _ACTION |
在MCS扫描中控制如何处理第一个时间点。USB-CTR总是在MCS采集开始后立即读取当前的scaler计数,而不是在第一个通道超前发生后。这个记录选择以下三种模式之一: 1)"Clear"(0):在这种模式中,在读取scalers前,它们被清除为0。这表示在对应每个计数器的第一个时间点的计数将是0。 2)"No Clear"(0):在这种模式中,在读取scalers前,它们不被清除。这表示在第一个时间点将有大数值计数,因为计数器将从它们上次被清除以来一直计数。 3)"Skip(2)":在这种模式中,将忽略第一个时间点,即是:不被读入mca或waveform记录。因为第一个时间点包含MCS采集启动之后直到第一俄国通道超前信号被接收到的计数,无论内部或者外部。这可能是最有用的模式。但,它需要N+1个通道超前信号而不是N。这被用于内部通道超前的驱动程序处理。但对于外部通道超前,使用者必须确保N+1个脉冲被发送。例如,如果NUseAll=2000,则在采集停止前,2001个脉冲将被发送。 |
$(P)$(R) TrigMode |
mbbo | asynInt32 | TRIGGER _MODE |
控制MCS扫描的触发。选项是: 1)"上升沿"(0) 2) "下降沿"(1) 3) "高电平"(2) 4) "低电平"(3) 用于触发信号触发MCS采集的触发器。首次启动MCS必须用StartAll记录。当满足指定的触发条件时,采集将开始。MCS采集总是在被触发模式中进行。如果不需要被触发的采集,则只要不要连接任何信号到触发输入并且设置模式="Low"。这将引起触发条件总是被满足。 |
$(P)$(R) MaxChannles |
longin | asynInt32 | MCS_MAX _POINTS |
在MCS数组中最大点数。这是由在装载MCA或waveform记录时MAX_POINTS的值确定的。 |
$(P)$(R) Model |
mbbi | asynIn532 | MODEL | 计数器模块的模型号。0="USB-CTR08", 1="USB-CTR04"。 |
medm窗口
以下时用于控制USB-CTR04/08的主窗口。
以下时用于使用USB-CTR04/08的EPICS scaler记录的medm窗口。
以下时用于控制USB-CTR04/08的MCS模式的medm窗口:
性能测试
以100Hz轮询二进制输入位,并且这些输入记录设为SCAN=I/O Intr。因而在探测这些位的转变中有一个最坏的0.01秒延时。
如果scaler记录运行在以下条件下:
1) 计数器0输出连接到计数器1-7的门输入。
2)脉冲生成器0频率32MHz,连接到计数器0输入
3)脉冲生成器1频率32MHz,连接到计数器1输入
4)脉冲生成器2频率32MHz,连接到计数器2输入
5)脉冲生成器3频率32MHz,连接到计数器3输入
6)Scaler记录.FREQ字段=3.2e7
7)Scaler记录预设时间=1.0秒
8)仅scaler通道1是预设的(.G1=Y, .G2-.G8=N)
在每个计数周期后,.S1=32000000准确计数,.S2-.S4=32000000+=1计数。运行在32MHz的所有通道没有串扰,并且门信号按设计工作。
如果脉冲生成器2被更改位3.2MHz,.PR2设置成1600000,并且.G2设为Y,则scaler在软件轮询程序中被通道2停止。在这种情况下,它准确计数0.5秒。但,如果.PR2被增加为1600001,则它计数0.51秒。由于以100Hz读取scaler值,这对应最坏的情况。注意:所有计数器准确地活动了0.51秒,因而这些计数完全反应了这个计数时间。由于有限地轮询间隔,计数时间稍微长于请求时间。
在MCS模式中,在内部和外部通道超前模式中测量地最小停留时间符合数据表,即是:250ns * 活动计数器的数目。我不能在MCS模式中测量时间仓之间任何死时间。当用1ms内部停留时间以8MHz正好发送8000000脉冲给通道0,在MCA记录中计数总数是8000000。这表示在这段时间中在发生的1000个通道超前中,没有丢失脉冲。
限制
EPICS驱动仅使用这些计数器的Totalize模式。用scaler记录,它进行一次总计,而在MCS模式中,它总计为时间bins。USB-CTR08也能够在另3种模式中运行:
- 在周期模式中,它测量连续输入脉冲的上升或下降沿之间的时间。
- 在脉冲宽度测量模式中,它测量每一个脉冲的上升和下降沿之间的时间。
- 在Timing模式中,它测量在计数器输入上一个事件和在计数器门上另一个事件之间的时间。
这些模式当前不被EPICS驱动支持,但在未来发行中会添加它们。
在Totalize模式中,每个计数器在它如何运行中有很多选项:增量计数/减量计数,门清除计数器,门控制计数器方向,预设计数,在此选项中输出信号变高/低,输出的极性等。这些选项当前为在EPICS驱动中展现。
EPICS驱动仅在32位计数器深度模式中工作。USB-CTR08可以使用64位计数深度计数。asyn当前没有支持64位整数类型,因而不能支持这个。
要使用scaler记录,计数器0的输出必须被连接到如上讨论的计数器1-7的门输入。