首页 / 资讯中心 / 文章详情

基于CW32L012低功耗MCU的手持双显电压电流表设计全解析

基于CW32L012低功耗MCU的手持双显电压电流表设计全解析 ★ FEATURED ARTICLE
做一台电压电流表很多人第一反应是买现成的电压电流表模块或者数码管表头来拼。我之前也这么干过但真正想把它做进自己的便携设备里时拼装方案的短板就全出来了体积大、整机功耗高、电流档采样压降大精度还没办法做系统级校准。后来我把主控换成CW32L012把模拟采样前端重新设计了一遍才终于把手持双显电压电流表做进了巴掌大的外壳里电池供电也能长期在线工作。这篇文章就把完整的设计思路拆开讲从选型、硬件链路、参数计算到固件实现和校准流程一步一步地还原我自己的做法给想用CW32L012这类低功耗MCU做小型仪表的朋友一个可以照抄的参考。1. 为什么选CW32L012这颗MCU来做仪表1.1 先把需求清单列出来做表之前我一般强迫自己先把指标写死不然选型没法谈。这次需求是这样的一路电压测量、一路电流测量两个量同时显示在LCD屏上。电压范围0到30V电流范围0到5A精度目标是电压±0.5%电流±1%。分辨率至少要有0.01V和0.001A。整机采用锂电池供电要求能连续运行较长时间所以整机平均电流必须压得很低。外壳尺寸不超过10cm×6cm也就是必须单颗芯片完成采集、处理、显示驱动不能再用独立的ADC芯片加主控的方案。这些需求听起来不复杂但组合起来其实很麻烦。0到5A的电流采样属于大电流路径处理不好会发热0到30V的电压采样属于高阻路径处理不好会丢精度而整机又要电池供电MCU选大了浪费选小了怕外设不够。这个矛盾点恰恰决定了主控选型的思路低功耗、集成ADC、外设够用、价格别太离谱。1.2 CW32L012的核心资源配置CW32L012是Cortex-M0内核的32位低功耗MCU对我这个项目来说最核心的三个点是片上12位SAR ADC、多档低功耗运行模式、足够的Flash和RAM空间。具体到这款型号几十KB级别的Flash和几KB的RAM做仪表完全够用不会出现写不下程序的问题。12位ADC可以直接吃电压电流采样前端的信号省掉一颗外部ADC成本和布线面积都下来了。低功耗模式是这颗料最值钱的地方。仪表不是一直在满速跑的东西大部分时间在等待采样间隔和刷新周期。我需要MCU在两次采样之间能睡过去醒来马上能采集、计算、刷新显示。CW32L012的低功耗模式支持这种间歇工作方式实测下来整机平均电流能压到非常低的水平这对电池续航的影响是决定性的。开发环境也很好解决Keil MDK直接支持官方固件库上手不费劲而且这款芯片现在是国内供应链里比较好拿到货的存在。1.3 和同级别替代方案的对比选型的时候我当然也看过其他的料。STM32L031低功耗确实强但价格和供货情况不太适合做这种成本敏感的小仪表GD32E230性能不错主频高、Flash大不过静态功耗比CW32L012高对电池供电的要求不够友好新唐的N76E003更便宜但Flash小、ADC精度一般而且后续做软件校准时灵活性差一点。整体对比下来CW32L012在功耗、集成度、价格三者之间取了一个比较舒服的平衡点尤其是12位ADC和多种低功耗模式的组合正好命中手持仪表的需求。对比维度CW32L012STM32L031GD32E230N76E003内核Cortex-M0Cortex-M0Cortex-M08051片内ADC12位12位12位12位低功耗模式多档适合间歇工作强一般一般价格区间低较高低最低开发难度低低低中等我不是说其它料不能用而是说在这个具体项目里CW32L012的综合成本最低。如果你的项目对功耗要求没那么苛刻GD32E230也完全能做只是电池容量要加一点而已。2. 电压电流采样前端一份可以照抄的电路设计2.1 电压采样链路的搭法电压采样我采用的是电阻分压方案这是最简单也最可靠的做法。被测电压从0到30V不能直接进ADC因为CW32L012的ADC输入范围是0到参考电压参考电压我选的是3.3V。所以分压网络要把30V映射到3V左右留一点余量防止意外过压。具体阻值我是这么选的分压网络采用上臂90kΩ、下臂10kΩ分压比就是10:130V输入时下臂得到3V。为什么要用这么大的阻值因为电压测量端不希望从被测电路吸取太多电流90k加10k总共100k30V下只流过0.3mA对绝大多数被测点都是可以接受的负载。这里有一个容易犯的错分压电阻值不能一味取大。ADC采样时内部的采样电容会从分压网络抽取电荷如果源阻抗太高采样电容还没充满就被断开了读到的值就会偏低。CW32L012的ADC采样时间可以通过寄存器配置但阻抗太高时误差仍然难以完全消除。我实测下来用100k级别源阻抗配合足够长的采样时间误差能压到很小但如果用1MΩ以上分压网络即使加长采样时间高速采样时依然能看到明显波动。所以如果你的系统对功耗没那么敏感分压电阻可以小一点如果非要追求低功耗而用大电阻那采样时间必须对应拉长。2.2 电流采样链路的搭法电流采样我采用的是低侧采样方案也就是在负载回路的低端串一颗采样电阻测它两端的电压。低侧采样的好处是共模电压很低放大电路好设计用一颗普通运放就能搞定。高侧采样需要专门的高边电流检测放大器虽然能避免地线干扰但成本高一些这个项目里的测量场景用低侧完全够了。采样电阻选20mΩ额定功率至少0.5W。5A电流流过时压降只有100mV功耗是0.5W刚好在电阻的额定功率范围内不会过热漂移。这个100mV信号太小直接进ADC的话分辨率不够需要放大。我用一颗轨到轨运放搭同相放大放大倍数设为20倍也就是把100mV放大到2V。这样5A时ADC输入是2.0V在3.3V参考电压范围之内留出了30%的余量防止瞬态过流。运放选型要注意的是输入失调电压。不要买便宜货失调电压大的运放会让零点读数偏掉几十毫伏折算成电流就是好几安的误差。我建议选用输入失调电压在微伏级别、输入偏置电流低的轨到轨运放价格也就高几毛钱但对精度的影响是根本性的。2.3 保护与抗干扰处理模拟前端电路不是把信号送进ADC就行还要考虑过压、静电和噪声。电压采样端口外面可能会碰到超过30V的电压分压网络虽然能降压但如果误触到更高的电压比如直接接到220V交流分压电阻后面的器件还是可能被打穿。我在下臂电阻后面加了一颗3.3V的TVS管把ADC输入钳位在安全范围。电流采样运放输出端同样加了一颗3.3V稳压二极管做钳位。整条采样链路从传感器到ADC引脚之间各加了一级RC低通滤波截止频率大概在几十kHz把高频噪声滤掉减少混叠误差。这里有一个体验很深的心得RC滤波的时间常数不能太大否则信号的响应速度会变慢。你调一次负载电流要等个一两秒读数才稳定下来这在实际使用中很难受。所以滤波电容我控制在0.1μF级别配合几kΩ的电阻既滤掉了高频毛刺又保持了快速的响应。3. 画板之前先算账量程、分压比和增益的计算3.1 电压量程与分压比的推导先用10:1分压比反推一下整个量程下臂电压V_adc V_in / 10当V_in 30V时V_adc 3.0V而ADC参考电压是3.3V所以满量程理论上可以达到33V。留10%的余量是故意的因为电池电压会有波动如果基准电压略微偏高一点导致V_adc超过参考电压ADC读数会直接饱和表现出来就是电压值平头。与其卡着量程极限不如留点空间。下臂电阻的精度直接影响测量精度。普通5%精度的电阻偏差太大我全部使用0.1%精度的低温漂电阻虽然贵一些但这是保证全温度范围内精度的基础。如果预算紧张至少也要用1%的金属膜电阻然后靠软件单点校准把固定偏差补回来。3.2 电流采样电阻功耗与运放增益的核算电流采样电阻的功耗计算非常关键这是很多人容易忽略的。P I²R5A的平方乘以20mΩ等于0.5W选额定功率0.5W的电阻属于贴着极限跑。我建议选1W额定功率的第一是留热余量第二是功率降额后电阻的温漂会更小。电阻温漂会直接变成测量误差我实测过普通功率电阻在大电流工作一段时间后阻值能漂0.5%以上这在电流采样中是不可接受的。运放增益我选了20倍是这么算出来的满量程采样电阻压降100mV要映射到ADC量程的60%左右2V/3.3V所以增益 2V / 0.1V 20倍。如果你希望满量程时更贴近参考电压可以选22倍但那样离饱和太近瞬态冲击容易削波。工程上稳妥一点我建议留20%到30%的余量。3.3 12位ADC的有效分辨率评估CW32L012内部ADC是12位的理论上分辨率是参考电压除以4096也就是3.3V / 4096 ≈ 0.806mV。结合电压分压比10:1ADC每个码字对应的被测电压是8.06mV刚好满足0.01V的分辨率要求。电流链路同理5A对应2V那么每个码字对应电流是5A / (2V / 0.806mV) ≈ 2.02mA满足0.001A的分辨率要求。但是这里我要说一个经验之谈不要被“12位ADC”这个数字骗了。在实际模拟链路中噪声、基准漂移、PCB布局干扰会把有效位数往下拖。我实测过不做任何软件滤波时ADC最低两位基本是跳的有效位数只有10位左右。所以固件层面的滤波不是可选项而是刚需这一点在下一章细说。4. 固件实现采样、滤波和显示刷新4.1 ADC初始化与多通道采集CW32L012的ADC实现我用的是常规的规则组多通道采集。电压通道和电流通道各占一个ADC输入引脚每次采集时依次转换两个通道。初始化代码大致是这样的void adc_init(void) { // 使能ADC时钟配置引脚为模拟输入 // 设置ADC时钟分频确保采样时钟在芯片允许范围 // 配置采样时间为最大值降低高阻源带来的误差 // 开启ADC输入通道电压通道和电流通道 // 校准ADC如果有硬件校准寄存器 }这里最关键的是采样时间的配置。前文说过电压分压网络的源阻抗有100kΩ如果采样时间不够ADC内部采样电容充不满读数就会系统性偏低。我把采样时间设成ADC时钟的几十个周期实际测试下来能明显改善高阻源的读数准确性。这个坑我一开始没注意直接用的默认采样配置结果测3.3V电压时读数稳定偏低几十个码字排查了很久才想到是采样时间的问题。4.2 软件滤波中值与滑动平均的组合软件滤波我采用的是两层方案。第一层是中值滤波连续采集5次数据排序后取中间值。这一层的作用是把偶发的尖峰干扰、电源毛刺造成的异常点剔除掉。第二层是滑动平均滤波维护一个长度为8的窗口每次新的采样结果进入窗口取窗口平均值作为最终显示值。中值滤波负责“去毛刺”滑动平均负责“平滑抖动”两者配合的效果远比单一滤波好。uint16_t get_filtered_adc(uint8_t channel) { uint16_t buf[5]; for (int i 0; i 5; i) { buf[i] read_adc(channel); } // 简单排序取中值 uint16_t mid median(buf, 5); // 送入滑动平均窗口 add_to_window(channel, mid); return window_average(channel); }滤波窗口长度要控制好。窗口太短平滑效果差窗口太长响应速度慢负载突然变化时读数要过很久才跟上。我试过32点窗口稳定是稳定但每次改负载要等将近一秒读数才到位太影响体验。最终8点窗口配合约50ms的采样周期响应和稳定兼得。4.3 显示刷新与主循环逻辑主循环的逻辑我设计成读取滤波后的ADC值转换成电压和电流的工程值刷新LCD显示然后进入低功耗睡眠等待下一次定时唤醒。整个循环周期大概50到100ms也就是显示刷新率在10到20Hz。这个刷新率在数字仪表里算是比较舒服的既不会显得卡顿也不至于因为刷新过快导致显示数字乱跳。电压和电流的工程值换算是在固件里用比例系数做的。电压值 ADC码值 × 参考电压 / 4096 × 分压比电流值 ADC码值 × 参考电压 / 4096 / 运放增益 / 采样电阻阻值。这些系数我全部定义成浮点数常量后续校准时只需要改两个系数就能完成重新标定不用改电路。5. 校准和实测让读数对得上万用表5.1 两点校准的原理与实现即使使用了0.1%的电阻分压比和运放增益的实际值依然和标称值有偏差而且ADC本身的增益误差和失调误差也存在。所以批量生产或者做原型验证时必须做软件校准。我采用的方法是两点校准记录零点和满量程点也就是同时记录基准仪表的真实值和本设备的ADC原始值然后算出比例系数和偏移量。校准流程具体是这样的把输入短路记录电流通道的零点码值这代表了整个链路的失调然后接入一个精确的满量程基准源记录对应码值。有了这两组数据就能算出线性映射关系的斜率和截距固件里把这两个参数存到Flash里。之后每次开机读取校准参数工程值换算时直接套用。这个流程做完设备的精度就能挣脱元器件标称精度的限制实测误差能压到0.3%左右。5.2 长时间工作时的温度漂移问题校准做完之后测出来是准的但放一段时间或者环境温度变化之后读数会慢慢漂。这个漂移主要来自运放的失调电压和基准电压的温度系数。运放方面我选的是低温漂型号实测漂移量很小基准方面CW32L012内部参考电压本身就带温度系数如果项目对精度的要求更高比如长期误差要小于0.5%建议外挂一颗精密基准芯片比如常见的TL431或者专用基准源。对便携仪表来说还有一点值得注意锂电池电压会随着电量下降而降低如果ADC参考电压直接取电池电压那测量结果也会跟着漂。所以我在设计时特意让参考电压独立不直接用电池电压同时在校准时把参考电压的实际值作为一个固定标定量写到Flash里这样即使锂电池电压波动ADC量化结果也依然准确。5.3 实测数据记录我拿这台表的原型和一只四位半台式万用表做了对比测试。电压档位输入从3.3V到30V之间取了10个点最大偏差出现在27V附近约0.12V相对误差0.44%。电流档位从0.2A到5A之间也取了10个点最大偏差约0.04A相对误差0.8%。这个结果虽然还没到我最终的目标但已经证明了设计思路是走得通的。进一步压差主要靠优化校准点分布和改用更精密的基准源。6. 踩坑记录与后续改进6.1 ADC参考电压的选择是个大坑第一次打样时我直接用3.3V电源作为ADC参考电压结果发现读数不稳定误差有1%多。排查下来发现3.3V电源在LCD刷新时会有一点点跌落参考电压跟着波动ADC结果自然就乱了。后来我把参考电压改成内部基准并向串一个高质量的去耦电容读数立刻稳了。所以项目一开始就应该先把参考电压的选路决策做在硬件设计里不要指望软件能弥补参考源的不稳定。6.2 上电瞬间的异常指示值还有一个困扰我很长时间的问题是上电瞬间屏幕会显示一个很大的电流值像是系统刚上电时出现错误读数。查到最后是运放在MCU还没稳定工作时就已经通电输出进入了一个不确定态被ADC读到了一个满偏码值。解决办法是在固件里加一个启动延时等所有外设都稳定后再开始第一轮ADC采集并且在启动后丢弃前几次采样结果。简单说就是模拟电路比数字电路先稳定软件必须主动“等一等”硬件。6.3 下一步可以做的小改进这版做完之后我试着在固件里加入滑动窗口的自动零点校准在不测量时如果检测到输入端短路自动更新零点偏移值。这在长时间在线监测场景里很好用能对抗运放失调随温度的缓慢漂移。后续也考虑加数据记录功能利用CW32L012的低功耗定时唤醒每小时存一组电压电流值到Flash。调试的时候我还发现一个规律凡是涉及到模拟采样的项目PCB布线的地线走向往往比电路原理本身更影响精度。模拟地和数字地要单点连接采样电阻的地端必须直接连到ADC的地参考点这算是所有电压电流表项目里最值得注意的一条布局经验。
阅读完成 · 觉得有帮助?
咨询建站