📄 pm5320.cpp.bak
字号:
}
tempVal = tempVal + pResultArr[i-5];//累加结果
}
}
return (long)(tempVal/nCount);
}
//函数结束</5320>
//函数开始<5320>
long _stdcall ZT5320TimerAIfifo(unsigned long nAddr,\
unsigned long nChMode,\
unsigned long nCh,\
unsigned long AIRange,\
long *pResultArr,\
unsigned long nCount,\
unsigned long ADOverTime)
{
//函数功能:定时启动AD,使用外部FIFO,采一批数,求平均值
// 调用本函数之前,应该先确保已调用 ZT5320SetADfreq 设定了AD采样频率
//入口函数:
// nAddr :板卡基地址
// nChMode:通道方式
// 1 = 单通道
// 0 = 多通道扫描方式
// nCh: 当nChMode =1(单通道方式) 时,为通道号(1--16),通道号默认从1算起
// 当nChMode =0(多通道扫描方式)时,多通道扫描中止通道号(1-16),通道号默认从1算起,例如设为2表示,通道1和通道2被自动扫描
// AIRange:选择对采集到的AD原码值做何种变换,应该与AD采集量程(一般需跳线)相匹配:
// AIRange = 0,表示返回原码(0-65535),所有卡都有这种方式
// AIRange = 1,表示把原码值转化为 0 -- 5000mV 之间的值,如果此卡没有这种量程,不应选这种方式
// AIRange = 2,表示把原码值转化为 0 -- 10000mV 之间的值,如果此卡没有这种量程,不应选这种方式
// AIRange = 5,表示把原码值转化为 -5000 -- 5000mV 之间的值,如果此卡没有这种量程,不应选这种方式
// pResultArr:是一个含有至少 nCount 个long型元素的缓冲区的首地址
// nCount: 需要采集的次数,必须>0,并且不应超出缓冲区的长度
// ADOverTime:设置超时时间,防止地址不对时死机,是一个毫秒数
// 若 ADOverTime = 0 表不检查AD超时
//返回值:返回 nCount 次采样的平均值
// 若返回 -1 应该进一步调用 GetDll_LastErrNO 判断是否出错
//1. 检查参数
nAddr = CheckAddr(nAddr);//使地址在0x100--0x3F0之间
nChMode = (nChMode != 0) ? 1 : 0;
nCh = nCh - m_nCountFrom;
if( nCh > pm5320.MaxAISingleChannel ) m_errorLevel = ERR_PARAMETER_CH;
//从直接操作寄存器的层面上来说,单通道时,通道号从0-15
// 多通道扫描方式时,指定的是“中止通道号(0-15)+1”
nCh = (nChMode != 0) ? nCh : nCh+1;
if( AIRange > MAX_AI_RANGE || pm5320.AIRangeArr[AIRange] < 0 ) m_errorLevel = ERR_PARAMETER_AI_RANGE;
if( nCount< 1 ) m_errorLevel = ERR_PARAMETER6;
//若用户参数错,不继续执行
if(m_errorLevel != ZT_SUCCESS) return -1;
//清空FIFO
WriteW(nAddr, pm5320.AIW.ROff_ClearFIFO, 0);
//3. 要先设置AD通道,再设置AD控制寄存器,否则FIFO中可能会多出一些没用的数
WriteW( nAddr, pm5320.AIW.ROff_ADchannel, nCh);
//2. 设置为单通道方式或多通道扫描方式,使能FIFO,定时启动AD,不能用直接位或的方式
//读当前控制寄存器的状态
unsigned short regStatus = ReadW( nAddr, pm5320.AIW.ROff_ADctrlReg);
//BIT3 = 0:循环通道 1:单通道
//regStatus = (regStatus & 0xFFF1) + (unsigned short)(nChMode*0x8);
regStatus = (unsigned short)(nChMode*0x8) + 3;
WriteW( nAddr, pm5320.AIW.ROff_ADctrlReg, regStatus);
double tempVal = 0;//设为double型,防止溢出
for(unsigned long i=0; i<nCount; i++)
{
//5. 判断AD转换状态
//AD超时时间由用户指定
DWORD startTime,endTime;
if( ADOverTime != 0 ) startTime=GetTickCount();//记录开始时间
//需要防止死机,因为用户可能输入错误的IO地址,导致AD永远不能进行
while( (ReadW(nAddr,pm5320.AIW.ROff_FIFOstatus) & 0xE000) == 0x6000)//查询FIFO是否非空
{
if( ADOverTime != 0 )
{
endTime = GetTickCount();
if( endTime - startTime >= ADOverTime )//大于60ms比较保险,GetTickCount()只精确到55ms
{
m_errorLevel = ERR_AD_OVERTIME;//AD超时错
return -1;//如果超过60ms秒以上就退出
}
}
}
//6. 读AD结果,字读操作
unsigned short result16bit;
result16bit = ReadW( nAddr, pm5320.AIW.ROff_ADresultWord);//一次读出16位结果
// result16bit = result16bit & (pm5320.AIW.ADresultMask);//屏蔽无效位
//7. 转换结果
//if(i>=5)
{
if( AIRange != 0 )//如果为原码方式,不转换
{
pResultArr[i] = (long)changeToAIRange( result16bit, pm5320.MaxADinitCode, AIRange );
}
else
{
pResultArr[i]= result16bit;
}
tempVal = tempVal + pResultArr[i];//累加结果
}
}
return (long)(tempVal/nCount);
}
//函数结束</5320>
//函数开始<5320>
long _stdcall ZT5320TimerAIiFIFO(unsigned long nAddr,\
unsigned long nChMode,\
unsigned long nCh,\
unsigned long AIRange,\
long *pResultArr,\
unsigned long nCount,\
unsigned long ADOverTime)
{
//函数功能:定时启动AD,使用内部FIFO,采一批数,求平均值
// 调用本函数之前,应该先确保已调用 ZT5320SetADfreq 设定了AD采样频率
//入口函数:
// nAddr :板卡基地址
// nChMode:通道方式
// 1 = 单通道
// 0 = 多通道扫描方式
// nCh: 当nChMode =1(单通道方式) 时,为通道号(1--16),通道号默认从1算起
// 当nChMode =0(多通道扫描方式)时,多通道扫描中止通道号(1-16),通道号默认从1算起,例如设为2表示,通道1和通道2被自动扫描
// AIRange:选择对采集到的AD原码值做何种变换,应该与AD采集量程(一般需跳线)相匹配:
// AIRange = 0,表示返回原码(0-65535),所有卡都有这种方式
// AIRange = 1,表示把原码值转化为 0 -- 5000mV 之间的值,如果此卡没有这种量程,不应选这种方式
// AIRange = 2,表示把原码值转化为 0 -- 10000mV 之间的值,如果此卡没有这种量程,不应选这种方式
// AIRange = 5,表示把原码值转化为 -5000 -- 5000mV 之间的值,如果此卡没有这种量程,不应选这种方式
// pResultArr:是一个含有至少 nCount 个long型元素的缓冲区的首地址
// nCount: 需要采集的次数,必须>0,并且不应超出缓冲区的长度
// ADOverTime:设置超时时间,防止地址不对时死机,是一个毫秒数
// 若 ADOverTime = 0 表不检查AD超时
//返回值:返回 nCount 次采样的平均值
// 若返回 -1 应该进一步调用 GetDll_LastErrNO 判断是否出错
//1. 检查参数
nAddr = CheckAddr(nAddr);//使地址在0x100--0x3F0之间
nChMode = (nChMode != 0) ? 1 : 0;
nCh = nCh - m_nCountFrom;
if( nCh > pm5320.MaxAISingleChannel ) m_errorLevel = ERR_PARAMETER_CH;
//从直接操作寄存器的层面上来说,单通道时,通道号从0-15
// 多通道扫描方式时,指定的是“中止通道号(0-15)+1”
nCh = (nChMode != 0) ? nCh : nCh+1;
if( AIRange > MAX_AI_RANGE || pm5320.AIRangeArr[AIRange] < 0 ) m_errorLevel = ERR_PARAMETER_AI_RANGE;
if( nCount< 1 ) m_errorLevel = ERR_PARAMETER6;
//若用户参数错,不继续执行
if(m_errorLevel != ZT_SUCCESS) return -1;
//清空FIFO
WriteW(nAddr, pm5320.AIW.ROff_ClearFIFO, 0);
//3. 要先设置AD通道,再设置AD控制寄存器,否则FIFO中可能会多出一些没用的数
WriteW( nAddr, pm5320.AIW.ROff_ADchannel, nCh);
//2. 设置为单通道方式或多通道扫描方式,使能FIFO,定时启动AD,不能用直接位或的方式
//读当前控制寄存器的状态
unsigned short regStatus = ReadW( nAddr, pm5320.AIW.ROff_ADctrlReg);
//BIT3 = 0:循环通道 1:单通道
//regStatus = (regStatus & 0xFFF1) + (unsigned short)(nChMode*0x8);
regStatus = 0x20 + (unsigned short)(nChMode*0x8) + 2;
WriteW( nAddr, pm5320.AIW.ROff_ADctrlReg, regStatus);
double tempVal = 0;//设为double型,防止溢出
long erro=0;
for(unsigned long i=0; i<nCount+10; i++)
{
//5. 判断AD转换状态
//AD超时时间由用户指定
DWORD startTime,endTime;
if( ADOverTime != 0 ) startTime=GetTickCount();//记录开始时间
//需要防止死机,因为用户可能输入错误的IO地址,导致AD永远不能进行
while( (erro=ReadW(nAddr,pm5320.AIW.ROff_FIFOstatus) & 0x8000))//查询FIFO是否非空
{
if( ADOverTime != 0 )
{
endTime = GetTickCount();
if( endTime - startTime >= ADOverTime )//大于60ms比较保险,GetTickCount()只精确到55ms
{
m_errorLevel = ERR_AD_OVERTIME;//AD超时错
return -1;//如果超过60ms秒以上就退出
}
}
}
//6. 读AD结果,字读操作
unsigned short result16bit;
result16bit = ReadW( nAddr, pm5320.AIW.ROff_ADresultWord);//一次读出16位结果
// result16bit = result16bit & (pm5320.AIW.ADresultMask);//屏蔽无效位
//7. 转换结果
if(i>=10)
{
if( AIRange != 0 )//如果为原码方式,不转换
{
pResultArr[i-10] = (long)changeToAIRange( result16bit, pm5320.MaxADinitCode, AIRange );
}
else
{
pResultArr[i-10]= result16bit;
}
tempVal = tempVal + pResultArr[i-10];//累加结果
}
}
return (long)(tempVal/nCount);
}
//函数结束</5320>
//函数开始<5320>
long _stdcall ZT5320AOSingle(unsigned long nAddr,\
unsigned long nCh,\
long nValue,\
unsigned long AORange)
{
//函数功能:指定通道模拟量输出,针对5320
//入口函数:
// nAddr :板卡基地址
// nCh :通道号1-8(通道号默认从1开始)
// nValue :要输出的值,例如当AORange = 1时,nValue=3000表示输入3V
// AORange:
// AORange = 0,表示返回原码(0-4095)
// AORange = 1,表示把原码值转化为 0 -- 5000mV 之间的值,如果此卡没有这种量程,不应选这种方式
//返回值:0表成功,-1表失败,函数调用失败时应进一步调用 GetDll_LastErrNO 判断出错原因
//检查参数
nAddr = CheckAddr(nAddr);//使地址在0x100--0x3F0之间
nCh = nCh - m_nCountFrom;
if( nCh > pm5320.MaxAOChannel ) m_errorLevel = ERR_PARAMETER_CH;
if( AORange > MAX_AO_RANGE || pm5320.AORangeArr[AORange] < 0 ) m_errorLevel = ERR_PARAMETER_AO_RANGE;
//若用户参数错,不继续执行
if(m_errorLevel != ZT_SUCCESS) return -1;
unsigned long AOInitCode;
AOInitCode = getAOInitCode(nValue, pm5320.MaxDAinitCode, AORange);
//选DA通道
WriteW(nAddr, pm5320.AOW.ROff_DAchannel, nCh);
//输出DA数据0-4095
WriteW(nAddr, pm5320.AOW.ROff_DAWord, AOInitCode);
return ZT_SUCCESS;
}
//函数结束</5320>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -