采用K型热电偶,mv电压信号经过放大以后作为AD7705的输入。
AD7705的工作模式是单通道,有缓冲,双极性,选择内部增益为32,环境温度用LM75A测量。
首先想请教大家的是以下工作原理对不对:
第一步是通过LM75A采集到环境温度,通过查表,将温度转换成对应的mv电压值;然后再利用AD7705采集到K型热电偶热端的采样值,通过线性转换得到对应的mv电压值;第三步就是把两个电压值加起来,得到的结果通过查表得出实际的温度值。
如果上述工作的原理是对的,我在这个过程中遇到以下几个问题想请教:
1. 将AD7705第一通道的两个输入端AIN+和AIN-短接,即输入端为0mv时,能得到的采样值,假定为0x8020(因为会随着温度变动),在输入端为参考电压2.5V时得到的采样值是0xFFFF(这个是确定的,而且不论增益是多大都是一样),假设我现在采样得到的一个值是0x9000,那我要计算输入电压时是否就按照下面这个线性转换公式计算:
realmvlot=(0x9000-0x8020)*2500/(0xFFFF-0x8020)?
还是需要考虑增益?
总感觉这里的0x8020和0x9000是经过32倍放大的,而0xFFFF却好像和增益没有什么关系,所以不应该这样线性化,而应该是另外再找到一点来取代满标度这点来做线性化?
2. 我在采样0mv电压对应的AD值时,直接用导线将输入端短接得到的采样值(0x8020)和在室温下接上热电偶的热端得到的采样值(0x83xx)有一定的差距,我的理解是:此时热电偶的热端和冷端同处一个室温环境,热端输出应该也是0mv(实际测量也是0mv),那此时得到的采样值应该也是0x8020才对。这样的理解不知是否正确,请各位指正。
3. 即使在用导线直接将输入端短接时,随着温度的变化,采样得到的值总有一定的变化(温度相差一度时,值相差10左右),这是不是就是所谓的温漂?虽然热电偶的冷端和热端有一点距离,但是不超过一米,而且也是用补偿线连接过来的,另外在每次读取7705的数据前都有做一个自校准,不知道该怎么解决这个问题(主要是从软件上)?
4. 在看7705的datasheet的时候除了看到自校准,还看到系统校准,于是在开始的时候也试着做过零标度和满标度校准,做零标度时能够读到一个24位的数据,但是做满标度校准的时候始终无法得到一个24位的数据,后来在网上也看到有人说温漂不是靠校准来解决的,所以就放弃了。
但还是把校准的程序贴出来,请做过的大虾们指教一下。
ResetAD7705();
//首先做自校准
WriteByte7705( SETREG_WCMD );
WriteByte7705( SLFClb ); //自校准,32倍增益,buf=1,双极性
DelayNS(5);
while( (IO1PIN & AD_DRDY) == AD_DRDY)
{
;
}
//然后做零标度校准
WriteByte7705( SETREG_WCMD ); //select setup register for writing
WriteByte7705( ZSClb ); //zero calibration
DelayNS(5);
while( (IO1PIN & AD_DRDY) == AD_DRDY)
{
;
}
//读取24位零标度数据并将它写入零标度寄存器
WriteByte7705( OFFSET_RCMD );
ZSData = ReaddWord7705();
WriteByte7705(OFFSET_WCMD);
WriteddWord7705(ZSData);
//做满标度校准
WriteByte7705( SETREG_WCMD ); //select setup register for writing
WriteByte7705( FSClb ); //full calibration
DelayNS(5);
while( (IO1PIN & AD_DRDY) == AD_DRDY)
{
;
}
//读取24位满标度数据并写入满标度寄存器
WriteByte7705( GAIN_RCMD );
FSData = ReaddWord7705();
WriteByte7705(GAIN_WCMD);
WriteddWord7705(FSData);
不知道上面出现偏差的问题是否必须要用系统校准来消除?
从开始做这个东西断断续续都有快半年了,始终过不去,请达人释疑,万分感谢! |