一、模数转换器的选择

工欲善其事必先利其器,要将模拟信号精准转换为数字信号,一个高精度的模数转换器不可或缺,选用合适的模数转换芯片对实现设计应用要求尤为重要。

本设计要求高精度和高稳定性的测量,主要用于温度传感器,预留了多个温度传感器接口,所以相应的ADC的通道数也要预留几个,不然要添加额外的多路开关选择器。

本设计选择ADI公司的AD7794作为模数转换器,片内集成了放大器,程序控制信号放大倍数,避免放大电路设计, AD7794内部架构如图所示。

采集平台功能架构设计图 采集系统设计_温度测量


AD7794具有低功耗、低噪声、高精度的特性,满足高精度测量应用要求,如图,内置24位低噪声的多路差分输入 型ADC。 每款模数转换器均内置一个低噪声、低温漂、高精度的基准源,除此之外可以采用差分型外部基准源。

AD7794 电流最大为400uA,是一款低噪声可编程增益仪表放大器,更新速度为4.17Hz至470Hz,与SPI、QSPI、MICROWIRE、DSP兼容,适用温度范围为-40℃至+105℃。

二、温度采集电路设计

本设计CPU采用的STM32,这块芯片也是目前高精度传感器普遍使用的。温度传感器种类繁多,但是精度及稳定性相差较大。本设计选择A级PT100铂电阻作为温度传感器,它精度较高,稳定性好。

温度采集电路设计如图所示。LM4040A41基准电压源给AD7794的外部参考电压以及四线制接法的温度传感器电路的恒压源供电,温度的差分信号经过片内放大器进入AD7794。

测温模块测量PT100阻值依据的是恒压源激励分压的原理,温度传感器接口电路采用四线制接线方法,四线制可以有效的消除导线自身阻值对PT100阻值的影响,四根线中,外侧的两根线为四线制电路提供电流,内侧两线连接AD7794通道采集PT100两端的电压值,AD7794开启片内输入缓冲的模式将会产生较高的输入阻抗,电流就不经过AD7794,而是全部流经PT100铂电阻,这样就能精确采集铂电阻的电压值,进而算出铂电阻的阻值。

采集平台功能架构设计图 采集系统设计_高精度_02


本设计采用比率方式得出铂电阻的阻值。如图所示,电阻R2是精度为 ±0.1%,温漂为5ppm/℃的直插式RJ711精密电阻。之所以采用直插式,是因为表贴封装的精密电阻在焊接时容易受到烙铁高温而引起特性改变。

由于是串联电路,电阻比值就是电压之比,经过Fluke测温电桥测得实际的精密电阻的阻值为99.987472Ω。首先通过采样R2的上的电压值得到UR2,再通过采样PT100上的电压值得到UPT100,通过公式

R2/RPT100= UR2/ UPT100

计算出PT100的电阻值。

三、铂电阻测温电路程序设计

铂电阻测温电路中,CPU是通过SPI协议与AD7794通信的。CPU与AD7794的读写具体通过CS、SCLK、DOUT、DIN四个引脚实现。CS是片选输入引脚,低电平有效。SCLK是时钟输入或输出引脚,通过它可以提供内部时钟。DOUT和DIN分别是数据输出和数据输入引脚。AD7794读写时序分别如图所示。

采集平台功能架构设计图 采集系统设计_温度测量_03


采集平台功能架构设计图 采集系统设计_高精度_04


要让AD7794工作,首先需要编写程序对AD7794的寄存器进行初始化配置,本设计采用4.17Hz采样频率,信号增益倍数设置为16,基准源选择4.096V外部基准源,具体初始化程序如下所示:

void AD7794INIT(void)
{
	AD7794Reset();
	delay_us(700);
	AD7794Write(0x10); 					//选择AD7794的配置寄存器AD7794Write(0x04);					//			单极性编码,增益设置为16
	AD7794Write(0x10);					//选择外部基准源,采集通道1
	AD7794Write(0x08);					//选择模式寄存器
	AD7794Write(0x00);					//采用连续转换模式
	AD7794Write(0x0F);					//AD7794更新速率设置为4.17Hz
}

初始化设置完毕后,AD7794按照SPI协议将采集的数据输出到CPU,由于AD7794数据采集完后会产生下降沿信号并将DOUT所在IO口电平拉低,所以我们在程序中将DOUT引脚设置为下降沿中断触发。然后就可以在与之对应的中断服务函数中读取采集的数据并进行处理。
铂电阻测温模块在采集到PT100的阻值后需要将其转换成温度值。本设计摈弃普遍使用但精度不高的查表法,而利用国家标准的温度和阻值关系式以及牛顿迭代法的非线性补偿算法将阻值转化为温度值。我们将上述关系以及算法以C语言的形式编写成程序并写入STM32,主要程序如下:

double func(double res,double t);			//定义函数
double funcDao(double t) ;         		//定义函数求导
double root(double res,double t)			//牛顿迭代法,res为阻值,t是温度
{	
	double x0,x1;
	x1=t;
	while(fabs(x1-x0)>=0.01)				//误差大于0.01则迭代,否则跳出
	{
	x0=x1;
	x1=x0-func(res,x0)/func1(x0); 		    //牛顿迭代方程
	}
	return x1;
}
	Temperature=root(RES,t0);              //阻值转换为温度值

最后,通过参考国家标准的温度和阻值关系式以及牛顿迭代法的非线性补偿将阻值转化为温度,精度可达±0.05℃,满足高精度温度测量的需求。