尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于CH32X035的USB双K型热电偶温度计:硬件设计、冷端补偿与信号放大详解

基于CH32X035的USB双K型热电偶温度计:硬件设计、冷端补偿与信号放大详解 基于CH32X035的USB双K型热电偶温度计硬件设计、冷端补偿与信号放大详解最近在做一个需要同时监测两个点温度的小项目要求精度高、能直接连电脑看数据。市面上现成的模块要么精度不够要么价格太高于是决定自己动手做一个。我选择了国产的CH32X035单片机搭配K型热电偶做了一个USB供电和通信的双通道温度计。今天就把这个项目的硬件设计思路、热电偶测温的关键技术——冷端补偿以及如何用精密运放放大微弱信号掰开揉碎了跟大家聊聊。无论你是刚入门的电子爱好者还是想了解精密模拟信号处理的工程师相信都能从这篇分享里找到有用的东西。1. 项目概览我们要做一个什么东西简单来说这个项目就是一个能插在电脑USB口上用的双路温度计。它用两条K型热电偶探头去测两个不同位置的温度然后用三个数码管把两路温度实时显示出来。同时它通过USB虚拟成一个串口电脑可以每秒读取一次包含两个热电偶温度和冷端温度的数据。核心功能与参数主控芯片CH32X035G8U6。这是一颗国产的ARM Cortex-M0内核单片机性价比很高。温度传感器两条K型热电偶。测温范围宽是工业上最常用的热电偶类型之一。显示两个三位0.28英寸的共阳数码管分别显示两路温度。信号放大采用GS8552-SR精密运算放大器专门用来放大热电偶产生的极其微小的电压信号。电源主电源由USB Type-C接口提供通过一颗高精度的ME6217C33M5G稳压芯片输出稳定的3.3V。板子上还预留了9-24V直流输入接口和相应的降压电路以备没有USB电源的场合使用。通信USB Type-C接口同时负责供电和数据传输。扩展板子上预留了UART串口和几个GPIO的排针方便后续添加其他功能比如连接Wi-Fi模块或者输出控制信号。2. 热电偶测温原理与核心挑战2.1 热电偶是怎么测温度的热电偶测温靠的是一个叫做“塞贝克效应”也叫热电效应的物理现象。咱们可以这么理解把两种不同的金属比如镍铬和镍硅这就是K型热电偶的材料的一端焊接在一起做成一个“测量端”也叫热端。当这个测量端和被测量的物体接触温度升高时相对于两根金属丝的另一端“参考端”或“冷端”它们之间就会产生一个非常微小的电压。关键点热电偶测量的其实是热端和冷端之间的温度差ΔT而不是热端的绝对温度。公式可以简化为热电动势 E ≈ α * (T_热端 - T_冷端)其中α是热电偶材料决定的系数。所以要想知道热端的真实温度T_热端你必须先知道冷端的温度T_冷端然后通过T_热端 T_冷端 ΔT来计算。2.2 为什么不用公式算要用查表法热电偶的电压和温差之间的关系并不是一条完美的直线而是一条复杂的曲线。用单片机去实时解算这个曲线方程计算量非常大对像CH32X035这类资源有限的MCU来说负担太重。因此工业上和我们的项目里普遍采用“查表法”。国家有标准比如项目中提到的JJG 351-84已经把K型热电偶在不同温差下对应的输出电压精确测量并制成了表格。我们把这个表格预先存到单片机的程序里通常做成一个数组。工作时先测出热电偶产生的电压然后去这个表里查找最接近的电压值对应的温度就是温差。这个方法又快又准。3. 硬件设计核心冷端补偿与信号放大知道了原理接下来就是如何用电路实现。这里有两个最大的难点冷端补偿和信号放大。3.1 冷端补偿给热电偶一个“温度参考点”既然热电偶测的是温差那冷端的温度就必须精确知道。在我们的设计里冷端就是热电偶的线接入电路板的那两个接线端子。电路板的环境温度就是冷端温度。如何测量冷端温度我们用一个10K NTC热敏电阻贴在接线端子附近来测量。热敏电阻的阻值会随温度变化我们通过一个简单的分压电路用单片机的ADC模数转换器去测量它上面的电压就能反推出当前的温度。注意这里同样用了查表法。因为热敏电阻的阻值-温度关系也是非线性的。我们会预先根据热敏电阻的数据手册把不同温度对应的ADC值计算好做成一个数组存起来。电路与计算下图是冷端测温的电路原理图中Rt是热敏电阻R73是一个固定的分压电阻比如10K。Vrtc是热敏电阻上的分压Vcc是3.3V参考电压。ADC测量的是Vrtc。计算关系如下ADC的读数RT_ADC与电压的关系是Vrtc (RT_ADC / 4096) * Vcc因为CH32X035的ADC是12位最大值是4095。根据分压原理Vrtc Vcc * [Rt / (Rt R73)]联立上面两个公式可以得到RT_ADC 4096 * [Rt / (Rt R73)]工作流程单片机读取热敏电阻通道的ADC值得到RT_ADC。在预先存储的“ADC-温度”对照表里查找找到与当前RT_ADC值最接近的项该项对应的温度就是冷端温度T_冷端。根据T_冷端去JJG 351-84热电偶分度表中查找得到在这个冷端温度下热电偶理论上应该产生的电压V_补偿。最后将实际测量到的热电偶电压V_测量加上这个补偿电压V_补偿就得到了相当于冷端为0°C时的热电偶总电压V_真实。再用V_真实去查分度表得到的就是热端的真实绝对温度。3.2 信号放大把微伏级的信号“放大”给ADC看K型热电偶的灵敏度大约为40微伏/摄氏度μV/°C。也就是说温度变化1度电压才变化0.00004伏特。而单片机的ADC通常需要输入电压在毫伏mV甚至伏特V级别才能准确分辨。所以必须对信号进行放大。第一版的教训内置运放不靠谱项目第一版尝试使用了CH32X035芯片内部集成的运算放大器OPA。它的性能和常见的LM358类似。但实际测试发现它的失调电压和温漂太大了。失调电压好比是运放自己“凭空”产生的一个小电压误差温漂是指这个误差还会随着温度变化。对于热电偶这种微伏级信号内置运放的这些误差足以“淹没”真实的温度信号导致测量完全不准。所以这个方案被放弃了。第二版的方案精密运放GS8552-SR后来换用了GS8552-SR这颗精密运算放大器。它的数据手册参数非常“漂亮”失调电压极低温漂很小非常适合做这种微小直流信号的放大。放大电路设计我们采用差分放大电路。这种电路的优点是能抑制“共模干扰”。什么是共模干扰比如你的热电偶引线很长周围有电磁场会在两根线上感应出相同的噪声电压。差分放大只放大两根线之间的电压差这正是我们需要的信号而会抵消掉这两根线上相同的噪声抗干扰能力大大增强。下图是其中一路热电偶的放大电路电路分析差分放大热电偶的正负极分别接到运放的反相-和同相输入端。放大倍数由电阻决定放大倍数 R150 / R1.2 1 150k / 1.2k 1 ≈ 126倍。经过它微伏级的信号就被放大到了毫伏级。低通滤波运放输出后接了一个由R和C图中R和C1组成的电路这是一个低通滤波器它的作用是滤除高频杂波让输出信号更稳定。电平抬升关键热电偶测的温度有可能比冷端温度还低这时产生的电压就是负的。但单片机的ADC通常只能测量0V到正电压如3.3V。为了解决这个问题我们在运放的同相输入端加了一个1.25V的参考电压。这个电压由TL431基准源芯片产生电路图下半部分。这样一来运放的输出就被整体“抬高”了1.25V。即使热电偶输入负电压输出也不会低于0V确保了ADC能正常采样。最终ADC值的计算经过126倍放大和1.25V抬升后运放的输出电压为V_out V_tc * 126 1250 (mV)。 单片机ADC读到的数值是ADC_原始 (V_out / 3300) * 4096。在程序里我们先读取这个ADC_原始值然后减去当输入为0即V_tc0时ADC的理论值根据计算这个值大约是1551。得到的结果才是纯粹由热电偶信号放大126倍后对应的ADC值。最后再通过这个值反推出V_tc进行后续查表计算。4. 主控与系统软件设计4.1 主控芯片CH32X035G8U6的任务分配这颗芯片是项目的“大脑”它要同时处理好几件事驱动数码管用GPIO口直接驱动两个三位数码管。为了提供足够的电流数码管的公共端COM通过PMOS管来控制。用一个定时器TIM3产生中断在中断服务程序里轮流刷新6个数码管段码实现稳定显示。采集温度数据使用内置的12位ADC配合DMA直接存储器访问功能。通道10 (CH10)采集热敏电阻电压用于冷端补偿。通道8 (CH8)采集第一路热电偶放大后的电压。通道9 (CH9)采集第二路热电偶放大后的电压。ADC设置为规则扫描模式自动轮流采集这三个通道每采集完一组三个通道数据DMA就自动把数据存到指定的内存数组里。采集满100组后触发一个中断在中断里对这100次数据进行平均处理这样可以有效减少随机噪声的影响。USB通信芯片内置USB功能。我们参考沁恒官方提供的CDC虚拟串口例程将设备枚举成电脑上的一个串口如COM3。程序里设置一个1秒的定时每秒通过这个虚拟串口发送一次数据格式例如[序号], [冷端温度], [热电偶1温度], [热电偶2温度]。使用DMA和规则扫描ADC采集几乎不占用CPU时间让主控能轻松地同时处理显示、计算和通信任务。4.2 软件流程与关键技巧初始化配置系统时钟、GPIO数码管、LED、定时器用于数码管扫描和1秒定时、ADC与DMA、USB。主循环主程序通常是一个空循环或执行低优先级任务。主要工作都在中断里完成。ADC采集完成中断当DMA搬运完100组数据后进入中断。对三个通道的100个数据分别求平均值。调用温度计算函数。温度计算函数核心// 伪代码逻辑 float calculate_temperature(int adc_value_thermocouple, int adc_value_thermistor) { // 1. 根据热敏电阻ADC值查表得到冷端温度 T_cold float T_cold lookup_thermistor_table(adc_value_thermistor); // 2. 根据 T_cold查热电偶分度表得到冷端补偿电压 V_comp float V_comp lookup_thermocouple_table(T_cold); // 3. 处理热电偶ADC值减去零点偏移换算成电压 float V_amplified (adc_value_thermocouple - 1551) * (3300.0 / 4096.0); // 单位mV float V_tc V_amplified / 126.0; // 除以放大倍数得到真实热电偶电压 // 4. 补偿V_real V_tc V_comp float V_real V_tc V_comp; // 5. 根据 V_real 查分度表得到最终热端温度 T_hot float T_hot lookup_thermocouple_table_reverse(V_real); return T_hot; }显示与通信将计算出的温度值更新到数码管显示缓冲区。每秒定时中断触发时将三个温度值通过USB虚拟串口发送出去。5. 电源与其他细节电源升级最初用的LM1117稳压芯片精度和温漂一般后来换成了ME6217C33M5G它的输出电压精度更高温度稳定性更好为ADC参考电压和运放供电提供了更干净的“基石”。双电源输入除了USB Type-C供电板子上还有一个DC接口和一套9-24V转5V的降压电路比如使用MP2451等开关稳压芯片。通过焊接0欧姆电阻作为“跳线”可以选择不同的供电来源适应性更强。调试接口预留了WCH-LinkE的10Pin调试接口方便下载程序和在线调试。扩展接口将UART2和PA5、PA6等GPIO用排针引出未来可以接蓝牙模块、OLED屏幕等外设。6. 实物制作与测试项目外壳可以选用835833mm的有耳防水盒在侧面开孔引出热电偶线和USB线。安装使用M3*5的盘头螺丝。将设备通过USB连接到电脑后电脑会识别出一个新的串口。用串口助手工具如Putty、SecureCRT或沁恒的调试助手打开这个串口设置正确的波特率根据代码设置通常是115200就能看到每秒一行发送过来的温度数据了。最后的小提示热电偶测温的精度除了取决于这里的电路和软件补偿热电偶探头本身的品质、接线端子的材料尽量使用与热电偶丝相匹配的补偿导线或端子以及实际使用环境的热传导都会产生影响。在要求极高的场合还需要进行系统的校准。但这个项目作为一个开源参考设计已经清晰地展示了从传感器原理到单片机实现的完整链路为你搭建自己的高精度测温系统提供了一个可靠的起点。
返回列表