STM32+AD7124+热电偶方案+Pt100冷端补偿解析工程源码:支持8种热电偶类型T、J...

张开发
2026/4/17 3:36:28 15 分钟阅读

分享文章

STM32+AD7124+热电偶方案+Pt100冷端补偿解析工程源码:支持8种热电偶类型T、J...
STM32AD7124热电偶方案Pt100冷端补偿解析工程源码源码包含Pt100、NTC热敏、热电偶处理驱动源码 支持热电偶类型T、J、E、N、K、B、如果用于别的R、S 8种类型并有Pt100测温方案 原理图含三线制 四线制 三线制双恒流源比例法消除导线电阻误差最近在折腾一套高精度温度采集方案用STM32F4搭配ADI的AD7124-4搞定了热电偶和Pt100的冷端补偿。这玩意儿实测能跑到0.1℃级别的精度特别适合工业现场那些难搞的测温场景。今天就把干货掏出来从硬件设计到代码实现都拆开讲讲。先说热电偶处理模块。AD7124自带的PGA和24位ADC是真香直接省了运放电路。配置时重点搞这两个寄存器// 设置通道1为热电偶输入增益128 AD7124_RegisterWrite(CH0_SETUP, 0x0C01); // 启用内部基准电压并配置滤波器 AD7124_RegisterWrite(ADC_CTRL, 0x0584);这里增益选128是为了适配mV级的热电偶信号。冷端补偿用Pt100实现代码里专门做了非线性补偿float Calc_Pt100_Temp(float resistance) { // 三阶多项式拟合 const float A 3.9083e-3; const float B -5.775e-7; return (sqrt(A*A - 4*B*(1 - resistance/100.0)) - A)/(2*B); }注意这个sqrt运算要开硬件FPU才够快用F4系列刚刚好。实测在-50~150℃范围内误差小于0.3℃。三线制Pt100的驱动最有意思双恒流源设计才是精髓。原理图上两个0.5mA的恒流源交替工作通过比例测量法自动抵消线阻void PT100_3Wire_Measure(void) { SET_CURRENT_SOURCE(SOURCE_A); // 开启电流源A Delay_us(100); float V1 Read_ADC_Voltage(); SET_CURRENT_SOURCE(SOURCE_B); // 切换电流源B Delay_us(100); float V2 Read_ADC_Voltage(); // 关键的比例计算公式 float Rt (V1 * R_REF) / (V2 - V1); }这个算法妙在把导线电阻Rw消掉了实测即使用普通杜邦线接Pt1002米长的线误差也不超过0.1℃。热电偶处理部分支持8种类型用查表法线性插值实现。比如K型热电偶的处理函数float K_Type_ColdCompensate(float mv, float cold_temp) { static const float table[] { /*...900个点的微伏值...*/ }; int index (mv 6.000) / 0.025; // -6mV~16.5mV范围 float uv table[index] (table[index1]-table[index])*((mv*1000 - (-6000 index*25))/25); return uv cold_temp * 40.7; // 冷端补偿系数 }这个查表法比多项式拟合快3倍FLASH占用约3.6KB。注意补偿系数每种热电偶都不一样B型的热电偶补偿系数甚至要做分段处理。STM32AD7124热电偶方案Pt100冷端补偿解析工程源码源码包含Pt100、NTC热敏、热电偶处理驱动源码 支持热电偶类型T、J、E、N、K、B、如果用于别的R、S 8种类型并有Pt100测温方案 原理图含三线制 四线制 三线制双恒流源比例法消除导线电阻误差四线制Pt100的驱动就简单粗暴了直接上1mA恒流源#define PT100_4WIRE_CURRENT 0.0005 // 0.5mA float Read_Pt100_4Wire(void) { float voltage Read_ADC_Differential(); return (voltage / (PT100_4WIRE_CURRENT * GAIN)) - WIRE_RESISTANCE; }但实测发现四线制对PCB布局要求更高电流路径和电压检测路径必须严格分开。工程源码里最实用的要数传感器自动识别功能上电时轮流检测各通道的阻抗void Sensor_AutoDetect(void) { for(int ch0; ch8; ch){ float impedance Measure_InputImpedance(ch); if(impedance 500) sensor_type[ch] THERMOCOUPLE; else if(impedance 300) sensor_type[ch] PT100; else sensor_type[ch] NTC; } }这个方法能自动区分接的是热电偶、Pt100还是NTC省去手动配置的麻烦。注意阻抗阈值要根据实际线阻调整我们项目中遇到过长电缆导致的误判后来加了二次验证逻辑。最后说下硬件设计的坑点AD7124的基准电压必须用低漂移的之前用普通LDO导致温度漂移超标。现在用ADR441能控制在2ppm/℃以内。原理图里的抗混叠滤波器不能省特别是当有变频器这类干扰源时建议在ADC输入端加个二阶RC滤波。完整工程已经扔在Github上包含全套KiCad原理图和CubeMX工程。实测连续采样时功耗仅3.8mA做手持设备也hold住。下次准备试试用这款方案搞个高温炉温控系统有同需求的可以一起交流。

更多文章