ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

HR202湿敏电阻驱动方案对比:IO充放电法与交流方波ADC法实测解析

HR202湿敏电阻驱动方案对比:IO充放电法与交流方波ADC法实测解析 去年的一个小项目做环境记录仪需要测湿度。当时图省事把HR202湿敏电阻直接做电阻分压ADC采样结果数据烂得一塌糊涂。后来仔细查了资料才发现湿敏电阻这玩意儿根本不能像光敏电阻那样“简单粗暴”地接驱动方式不对测出来的都是幻觉。这次我把HR202常见的两种可靠驱动方案都做了实测对比IO充放电法和交流方波ADC法。两种方案都能绕开湿敏电阻最怕的“直流极化”问题但原理、电路复杂度、测出来的精度完全不是一个路子。这篇文章会把两种方案的原理、电路、代码思路、实测数据和坑全部摊开讲帮你在做选型的时候少走弯路。1. 项目概述与方案选型思路1.1 HR202湿敏电阻的特性HR202是一种高分子湿敏电阻它的阻值会随着环境湿度变化而变化典型的规律是湿度越高阻值越低。在25℃环境下手头这只HR202实测大概是这样的20%RH时阻值在300kΩ左右50%RH时大概40kΩ到了90%RH就降到几kΩ了。这和大多数湿敏电阻的“指数下降”曲线一致。问题是这种湿敏电阻本质上是一个“离子导电”型的元件。如果给它两端加上恒定的直流电压湿敏材料内部的水分子会发生电解迁移导致阻值逐渐漂移这就是常说的“直流极化”现象。用万用表电阻档直接量一下你会发现数值一直在慢慢往上跑就是这个原因。所以任何宣称“HR202直接分压接ADC”的电路都是不严谨的。要么你会遇到读数漂移要么传感器寿命严重缩短。为了解决这个问题工程上常用两种思路一种是“短时充放电”让直流作用时间非常短短到来不及极化另一种是“交流激励”让传感器两端电压的方向周期性地反转抵消极化效应。这就是IO充放电法和交流方波ADC法的本质区别。1.2 两种方案的适用边界先说结论IO充放电法胜在结构简单、成本极低适合功能单一、对精度要求不高的场景交流方波ADC法电路稍复杂但稳定性和可标定性都更好适合需要长期连续监测的项目。IO充放电法的核心就是利用单片机的GPIO配合一个已知容量的电容测量RC充电时间从而反推电阻值。它不需要任何额外芯片一个IO口加一个电容就能干活。交流方波ADC法的核心是让单片机输出一个方波信号经过分压网络加载到HR202上然后在方波的稳定阶段用ADC采集电压。这个方法虽然也多花一个参考电阻但对采样时序要求更高而且换来了“传感器两端没有长时间单向直流”的好处。两种方案我都在同一个测试板上跑过也分别记录了不同湿度点下的数据。下面详细拆解。2. 方案一IO充放电法深度拆解2.1 工作原理与测量时序IO充放电法的原理基于一个基础的物理公式一阶RC电路的充电时间常数。当一个电容通过电阻从0V开始充电电容两端的电压按照指数规律上升电压到达某个阈值比如MCU的输入高电平阈值所需的时间与电阻值成正比。这里的关键是我们用HR202自己充当那个“R”。单片机先让电容放电到零然后开始充电同时启动定时器计时直到输入引脚检测到高电平停止计时。计数值越大说明充电越慢即HR202的阻值越大也就是当前环境越干燥。具体到HR202这种阻值跨度大的传感器我推荐用两个IO口的接法。一个IO口这里叫PA0负责驱动充电另一个IO口PA1负责检测电压翻转。这个接法的好处是放电阶段可以同时把两个IO口都拉到低电平把电容里的电荷放得更彻底下一次测量的一致性会好很多。2.2 电路设计与驱动时序示例电路连接非常简洁你只需要一个电容和一个HR202。PA0连接到HR202的一端HR202的另一端连接到PA1同时PA1接电容C1到GND测量一段完整的时序如下放电阶段PA0设为推挽输出低电平PA1设为推挽输出低电平持续至少10ms确保C1两端电压接近0V。充电阶段PA1立即切换为浮空输入模式高阻态PA0切换为推挽输出高电平。此时VCC通过PA0经过HR202向C1充电。计时阶段在切换PA0为高电平的同时启动定时器计数。程序持续轮询PA1的电平直到PA1读到逻辑高电平立即停止定时器并记录计数值。换算阶段根据计数值和定时器频率算出充电时间T再通过已知的电容值C和阈值电压算出电阻值R。关键就在这里很多初学者会直接用公式R T / C但这个公式只有在阈值电压正好是0.632倍VCC时才成立。而单片机IO口的高电平阈值并不是精确的0.632VCC所以直接用公式会带来系统误差。在实际项目里我建议先接一个精密电阻比如100kΩ1%精度代替HR202测出软件计数值然后把人家的电阻值作为基准后续实测数据全部换算成相对基准的比例关系。这一步相当于软件校准能吃掉大部分IO口阈值误差非常有效。2.3 实测数据与精度分析我用了三组湿度环境做测试33%RH饱和氯化镁溶液、75%RH饱和氯化钠溶液、以及实验室自然空气当天温湿度计显示52%RH。测试MCU用的是STM32G030内置16MHz时钟定时器频率设为1MHz电容选用1μF的C0G贴片电容。实测的原始计数值和换算电阻如下环境湿度定时器计数值重复测试偏差换算电阻值33%RH约235000±1.2%约235kΩ52%RH约43000±0.8%约43kΩ75%RH约6000±2.5%约6kΩ从数据上可以看出低湿度时计数值很大分辨率很高但高湿度时计数值只有几千稍微有点噪声换算误差就放大了。这说明IO充放电法天生偏向“低湿度灵敏”如果要做高湿环境监测精度会有明显衰减。还有一个小问题高湿度下电阻只有几kΩ充电非常快计时分辨率就成了瓶颈。如果主频不够高建议把电容换成2.2μF能有效增加充电时间但代价是每次测量周期变长。2.4 长期使用要小心的三个坑很多人测出来数据漂移其实不是电路连错而是踩了下面几个坑。第一个坑用了瓷片电容或者电解电容做定时电容。这两种电容温漂很大温度变个10℃电容值就偏了5%以上测出来的湿度自然飘。我实测下来C0GNP0材质的贴片电容或者薄膜电容是最稳的。第二个坑反复连续测量。虽然IO充放电法每次充电时间只有几十毫秒但如果你把它放进for循环里每秒测100次HR202加电的总时间累计起来过几个小时数据就明显往下掉。我的处理办法是每次测量完成后把两个IO口都拉低让传感器两端都是0V同时设置测量间隔不低于1秒。项目里一般配上“300秒采一次”的频率长时间跑下来就稳定得多。第三个坑高湿环境下漏电。高湿时HR202阻值只有几kΩ这时候PCB走线之间的漏电阻可能达到几百kΩ影响不大。但如果是低湿环境HR202本身阻值几百kΩPCB上的任何水汽或助焊剂残留都可能并联一个几兆欧的漏电阻导致读数偏高。所以PCB焊接后必须用洗板水彻底清洗再涂一层三防漆尤其是传感器旁边的走线。3. 方案二交流方波ADC法深度拆解3.1 为什么交流激励更稳交流方波ADC法的出发点和实验室里测电解电容用交流电桥是类似的。既然湿敏电阻怕直流那就给它加一个方向不断反转的电压。单片机IO口虽然输出不了标准的正弦波但输出一个方波轻轻松松。方波本质上就是一组交流信号只是在基频上叠加了奇次谐波而对HR202这种纯阻性器件来说方波和正弦波的效果差别可以忽略。这样就解决了一个根本性问题传感器两端电压始终在交替正反带电粒子还没来得及往一个方向迁移电压方向已经反了宏观上大幅削弱了极化效应。长时间运行的稳定性比IO充放电法还要好。但随之而来的问题是方波状态下分压节点的电压不是稳定的直流而是“高电平时一个值低电平时另一个值”。ADC该怎么采样这就要引入“相位采样”的概念。3.2 分压网络设计与采样窗口电路连接如下PA0输出方波激励比如1kHz高电平3.3V低电平0VPA0串联参考电阻Rref连接到分压节点A节点A连接到HR202的一端HR202的另一端接GND节点A连接到MCU的ADC输入引脚先看方波的高电平阶段。此时分压节点A的电压是Va VCC * Rsensor / (Rref Rsensor)。低电平阶段节点A电压就是0V。如果我们用ADC一直不停地采样采到的值会一会儿高一会儿低直接平均没意义必须只在方波稳定后的高电平窗口里采样。实现方法很简单让方波频率和ADC采样触发信号同步。我用的是定时器的一个输出通道产生方波同时另一个通道产生延迟的触发信号去启动ADC转换。具体做法是定时器配置为PWM模式输出引脚产生1kHz方波周期1ms高电平0.5ms。配置定时器的另一个通道为“比较匹配触发ADC”把比较值设在高电平阶段的中间位置。高电平持续到约0.25ms时节点电压已经完全稳定此时触发ADC采样连续采8次取平均。关于Rref的取值这里有一个权衡。如果Rref取值和传感器阻值跨度不匹配ADC分辨率会很差。我实测发现HR202从20%RH到90%RH阻值大约从300kΩ变化到3kΩ跨度接近两个数量级单一的Rref很难全范围兼顾。解决思路是分档。我用GPIO控制两个参考电阻低湿度档Rref100kΩ高湿度档Rref10kΩ。初测时先用100kΩ档如果ADC读数超过4/5量程说明当前阻值很小改切10kΩ档重新测量。这个逻辑写起来不复杂但确实能明显提升高湿段的测量分辨率。3.3 实测数据与标定流程同样的三组湿度环境交流方波ADC法测出来的数据长这样环境湿度激励频率Rref档位ADC码值换算电阻值33%RH1kHz100kΩ约1950约238kΩ52%RH1kHz100kΩ约1020约44kΩ75%RH1kHz10kΩ约2400约6.3kΩ和IO充放电法对比同湿度点的电阻值差别不大说明两种方案在“测电阻”这个层面都没问题。但交流方波ADC法在高湿度的ADC码值高得多分辨率优势一目了然。再说标定。我强烈不建议拿datasheet里的公式硬套。每个HR202传感器的一致性并没有那么理想尤其在不同湿度区间非线性也不同。我自己的做法是用电阻箱模拟传感器做初步验证再用饱和盐溶液做最终标定。饱和盐溶液标定的流程准备几个密封罐分别放入不同饱和盐溶液氯化镁33%RH、碳酸钾43%RH、氯化钠75%RH、硫酸钾97%RH。把传感器悬在罐内不能接触液体密封起来。等至少30分钟让罐内湿度完全稳定。记录每个湿度点下对应的电阻值。得到4到5个标定点之后用分段线性插值建一张查表。查表之外再加一阶低通滤波软件里存一个“上一次湿度值”变量每次新测量值只往实际值方向移动一小步这样读数就不会剧烈跳变。3.4 校准表构建从ADC值到湿度值有的读者可能觉得有了电阻值之后查表就完事了。但ADC值直接对应的是电压而电压和电阻的关系是非线性的所以更稳妥的做法是将AD码值直接作为查表索引的输入而不是先转成电阻再转成湿度。我在代码里维护了一个结构体数组typedef struct { uint16_t adcCode; // 校准点对应的原始ADC码 int16_t humidity; // 对应的湿度值单位0.1%RH } CalPoint; const CalPoint calTable[] { {1950, 330}, // 33.0%RH {1280, 430}, // 43.0%RH {1020, 520}, // 52.0%RH { 600, 750}, // 75.0%RH { 120, 970}, // 97.0%RH };测量时先找到ADC码值落在哪两个标定点之间然后用线性插值算出湿度int16_t calcHumidity(uint16_t adcVal) { uint8_t n sizeof(calTable) / sizeof(CalPoint); if (adcVal calTable[0].adcCode) return calTable[0].humidity; if (adcVal calTable[n-1].adcCode) return calTable[n-1].humidity; for (uint8_t i 0; i n-1; i) { if (adcVal calTable[i].adcCode adcVal calTable[i1].adcCode) { uint16_t codeSpan calTable[i].adcCode - calTable[i1].adcCode; int16_t humSpan calTable[i].humidity - calTable[i1].humidity; return calTable[i1].humidity (int32_t)(adcVal - calTable[i1].adcCode) * humSpan / codeSpan; } } return calTable[n-1].humidity; }这段逻辑本身不复杂但它把所有非线性误差都“吃”在了查表里只要标定点足够密精度就足够好。4. 横向对比与选型建议4.1 参数对比为了更直观我把两个方案的核心参数放在同一张表里对比项IO充放电法交流方波ADC法额外硬件成本1个电容1到2个精密电阻传感器直流暴露时间毫秒级理论为零测量分辨率低湿度好高湿度差全范围均衡软件复杂度低中抗长期漂移能力中高对MCU资源要求仅需通用IO和定时器需要ADC、定时器同步触发校准难度需要基准电阻做软件校准需要多标定点建表注意我这里的“传感器直流暴露时间”写的毫秒级不代表IO充放电法就绝对安全。如果项目要求传感器7x24小时连续在线每分钟测一次每次通电20毫秒一天的累计通电时间接近30秒。而交流方波ADC法虽然也通电但电压方向每秒翻转几千次净直流分量接近零对传感器寿命友好得多。4.2 场景选型建议如果你做的是纽扣电池供电的温湿度计、低成本物联网节点这种产品MCU资源紧张成本敏感IO充放电法更合适。它不需要ADC外设只要是带GPIO和定时器的单片机都能做甚至8脚的OTP单片机都可以。如果你做的是温室大棚监测、培养箱、气象站、需要长期稳定数据曲线的系统直接上交流方波ADC法。多花的成本不过是一两个电阻而已但换来的长期稳定性能让你在服役半年后省心很多。有的朋友可能会问如果MCU没有硬件定时器触发ADC怎么办也有办法方波输出用软件延时翻转然后在延时中间调用ADC转换但这样会占用CPU。我试过在STC8G系列上这么干频率降到500Hz勉强能应付采样但不推荐。4.3 混合冗余思路如果做的是稍微高端一点的设备我建议把两种方案都放上去走冗余路线。原理也很简单用两个IO口加一个电容实现充放电测量再用另一个定时器通道实现交流方波激励和ADC采样。平时以交流方波ADC法的数据为主定时用IO充放电法做个交叉校验。如果两种方法算出来的湿度差值超过5%RH就判定传感器异常主动上报故障。这种双方案设计增加的成本几乎可以忽略但在可靠性上能提升一个档次。尤其是设备在野外无人值守的场景传感器老化是不可避免的双路校验能提前发现问题。5. 常见问题与避坑手册5.1 典型故障与解决现象可能原因解决办法读数缓慢上升且不停止HR202受到直流极化改用交流方波或缩短单次测量时间高湿时读数跳动剧烈参考电阻档位不合适切换到低阻值Rref档位从湿环境换到干环境读数恢复很慢湿敏电阻吸湿后的脱湿滞后等10分钟以上或做软件去滞后处理同一湿度点往返读取差5%以上吸湿和脱湿曲线不一致标定时统一从干燥状态开始所有湿度点读数整体偏高参考电阻或电容精度不足换成1%精度低温漂元件加电瞬间数据异常传感器尚未稳定或电容残留电荷启动延时预热30秒后再采样5.2 关于标定的几句实话市面上很多文章会告诉你“用公式算一下就行。”但实际上同一型号湿敏电阻在不同湿度点的非线性、不同批次的一致性差异很大用公式硬算的误差常常超过10%RH这显然达不到大多数项目的要求。在我自己做的几个产品里湿敏电阻标定从来都是按“个体”来的。批量生产时每片PCB刷完三防漆之后都要做一次单点或多点校准把校准系数写进EEPROM。如果只要求5%RH精度至少也要做2个湿度点的标定覆盖你要用的湿度范围两端。还有一点不要把HR202当作精密仪器看待。它更适合做“趋势监测”或“阈值判定”比如“湿度是否超过70%RH”这种场景。如果追求±2%RH的高精度老老实实改用数字式的温湿度传感器会省心很多。就我个人体会而言IO充放电法和交流方波ADC法并不是谁绝对取代谁的关系。我在低成本电池方案上一直用IO充放电法在产品级的长期监测项目里坚定不移地选交流方波ADC法。很多时候传感器不准不是算法不够花哨而是激励方式从一开始就走错了方向。搞清楚“湿敏电阻怕直流”这个底层逻辑剩下的就是按自己的项目资源做取舍了。
返回列表