本帖最后由 曹世鹏 于 2015-5-18 18:03 编辑
最近在做用STM32F103的SPI总线和TI的ADS1247通信读取三线制的PT100的温度值,要求精度为0.5摄氏度。
现在遇到了一些问题。不知道该怎么处理。下面我就把问题总结一下。希望能在论坛里帮我解决一下。谢谢大家。
事情是这样的,我也想好了方案。就是用恒流源设置一个电流流过PT100,然后测PT100两端的电压,从而得出电阻值,然后对应PT100的电阻温度表格就能得出温度值了。但是因为不能让PT100流经的电流过大,因为那样会发热,影响实际的温度值。而且电阻变化范围很窄,最低是18.5欧姆,最高是390.48欧姆。这是PT100的整个量程,就是-200摄氏度到850摄氏度。实际上我们用到的范围很窄,就是-40到100摄氏度之间变化,对应的电阻变化就是84欧姆到138欧姆之间。如果流经1mA的话,那么电压变化范围就是0.084V-0.138V之间变化。这么小的变化范围,必须用运放将电压放大的,不然检测到的范围太窄了。那么本来我是想用运放自己搭一个的。后来发现自己的水平有限,放弃了。
然后在TI的官网上查看看有没有对应的芯片。嗯,查到了就是现在正在调试的ADS1247。它是SPI总线的。精度也很高。自带恒流源和放大器。正好适合我的需求。而且看了下还有Demo板。原理图什么的。
Demo板
然后我就照着它的原理图画了一版板子。板子回来前就开始写程序。发现了一个问题。我在TI给的这个datasheet上面没有找到如何计算电阻值或者直接计算温度值的例子。我把我在这上面整理的资料压缩成一个文件共大家下载。这是我找到的唯一感觉是这个计算公式的东西。
计算公式
其中我在这二个公式里代入了一个值,也就是当0摄氏度的时候,PT100的电阻值是100欧。这两个等式的两边都是成立的。即RTD(T)=100欧姆,T=0℃
但是我将别的值代入的时候就不对了。我看不懂这个到底是怎么算的。
下面贴一下我的源码,其中完整的.c和.h文件在我的压缩包里。
ADS1247WREG(ADS1247_REG_MUX1,0x38); //内部参考电压打开。
bsp_DelayMS(1);
ADS1247WREG(ADS1247_REG_IDAC0,0x06); //DOUT/DRDY pin functions only as Data Out (default) 并且1mA。
bsp_DelayMS(1);
ADS1247WREG(ADS1247_REG_IDAC1,0x03); // IDAC1->AIN0 IDAC2->AIN3.
bsp_DelayMS(1);
ADS1247WREG(ADS1247_REG_SYS0,0x26); //增益4,320sps
bsp_DelayMS(1);
SPI_ADS1247_SendByte(ADS1247_CMD_SYNC); //同步AD转换
bsp_DelayMS(1);
data22=ADS1247_ReadData_Ave();//将转换的24位转换值取出。
bsp_DelayMS(1);
printf("通道:%x
",data22);
我这是接了一个100欧姆的电阻用来模拟PT100在0摄氏度时的样子。可是打出来的数据是这样的。不知道读取到的到底是什么。
读取到的24位转换值
打印出来的数据变化很大,而且不稳定。我是隔2秒钟打印一次的。
我现在也不理解这个ADS1247_ReadData_Ave()读出来的值是什么。做什么用的。到底是代表阻值还是电压呢,不知道。有用过这个芯片的朋友吗,给解释下吧,着实的弄不懂了。
此帖出自
小平头技术问答
和实际数据对应,需要标定,这要根据PGA设置及参考源电压决定。
例如,如果参考源电压为Vref,PGA 的增益为G,读出的数据为Dat,则实际电压Vx为:
Vx = Dat / ( G * 0xffffff ) * Vref
一周热门 更多>