尧图精选

基于CW32L012的电压电流表设计:从硬件到软件全解析

🕒 发布时间:2026/10/2 16:22:32 📁 来源:尧图网络
CW32L012这颗芯片我盯了有一阵子最近把手头一个可调电源项目里需要配套的电压电流表模块重做了一版方案就直接选了CW32L012。市面上做电压电流表的主流方案不少STM32、51、甚至纯硬件运放搭的都有但CW32L012有几个点确实戳中了我Cortex-M0内核够用、内部集成LCD驱动、还有比较丰富的模拟外设关键是价格和供货在国产芯片里算是很稳的。这篇文章就把我这版电压电流表的设计思路完整捋一遍从硬件拓扑到软件算法再到实际调试中踩过的坑给准备上手这颗料的朋友做个参考。这款电压电流表定位是“嵌入到现有电源模块里的测量前端”测量范围定在电压0-30V、电流0-5A分辨率要能做到1mV/1mA级别显示用段码LCD整体供电由被测系统辅助电源提供。整个项目比较适合有单片机基础、想低成本自制约DC电源测量模块的电子爱好者或者做仪器仪表的工程师评估CW32L012这颗料。1. CW32L012选型分析与整体设计方案1.1 为什么选CW32L012而不是传统方案先说说选型逻辑。做电压电流表MCU的核心工作就是“采模拟量-算数值-送显示”外加少量按键交互和通信。我用过ST的STM32F030系列也用过赛元、辉芒微这些国产M0CW32L012吸引我主要有几点第一它内部带了段码LCD控制器可以直接驱动4x32的段码屏。传统方案如果是单片机配外部LCD驱动芯片比如HT1621要额外增加一颗IC、外围电容电阻还要多占三根IO口线。CW32L012这个集成的LCD驱动支持1/3偏置、1/4占空比内部有电阻分压偏置软件配置一下就能出显示成本直接降一截PCB面积也能省出来一块。对于电压电流表这种“显示就是命根子”的产品来说这个集成度非常舒服。第二它的ADC是12位逐次逼近型内部有可编程增益放大器PGA和多种参考电压源选择。电压电流表对ADC的要求就是分辨率要够、采样速度不需要太快几十K就足够、稳定性要OK。12位配合PGA在低量程下我可以把微弱信号放大到满量程范围省掉外部运放或者至少降低运放的设计难度。而且它内置了温度传感器和VDD/VDDA分压通道可以做简单自检和参考源校准这在便携表头里是很实用的功能。第三低功耗特性。虽然是做电工仪表但很多场景是电池供电的便携设备CW32L012在休眠模式下功耗极低配合内部低速时钟做定时唤醒可以在“睡眠-测量-显示-再睡眠”的周期里跑平均电流能做到几十微安级别。这个优势在手持式电压电流表里特别明显。1.2 系统框架与数据流整个系统的数据流是这样的电压输入经过精密电阻分压电流输入经过采样电阻转电压信号后由运放做电平搬移和放大两路信号分别进入CW32L012的ADC通道在MCU内部做采集和数据处理数据经过滤波、校准、工程量换算之后通过段码LCD显示按键负责量程切换、校准参数设定和峰值保持模式切换预留UART接口可以输出实时测量数据或接收上位机指令。整体拓扑上看这是一个典型的“单MCU信号链”方案传感器分压网络/采样电阻→信号调理PGA/外部运放→ADC→MCU算法→显示/通信。在设计框架时就定了一个原则模拟前端尽量简洁能用MCU内部资源解决的就不用外部器件。原因很简单仪表类产品的一致性才是最大的痛点内部集成模块的一致性通常优于分立的运放基准组合而且在温漂控制上内部资源跟MCU同步校准一次能同时校正ADC和基准的偏差。2. 模拟前端电路设计与量程规划2.1 电压采样通道分压网络与输入保护电压测量范围0-30VCW32L012的ADC参考电压我打算用内部基准2.5V也可以选择VDDA但内部基准温漂指标更好。30V直接送ADC肯定不行必须分压。常规做法是两个精密电阻分压把30V映射到2.5V以内。这里有个细节值分压比选12:1比较合适这样30V对应2.5V留给ADC接近满量程的利用空间但在考虑10%超量程时输入33V对应2.75V会超出内部2.5V基准的量程。所以我留了两档低量程0-6V分压比2.4:1直接测锂电池、单节电源、USB电压这类低压信号高量程0-30V分压比12:1测开关电源输出、铅酸电池组。分压电阻的选型要注意功率和温漂。高量程档在30V输入时分压电阻链上的功耗是30V*30V/总阻值。如果我用两颗1206封装电阻串联总阻值200K欧功耗约4.5mW非常安全。但如果是10倍分压配10K/1K这种低阻值功耗就上到90mW发热会直接导致电阻值漂移测量误差就上来了。做电压电流表采样电阻的功率余量一定要给足否则测出来数字跳来跳去不是ADC的锅是电阻自热温漂的锅。输入保护方面我用的是双向钳位二极管BAV99到VREF和GND还有一颗100欧的串联限流电阻。32V以内的输入直接靠分压电阻限流超过32V则二极管钳位。这里有个经验不要把钳位二极管接到VDDA上要接到ADC的参考电压上因为参考电压是2.5V钳位在这个电平才能保护ADC输入不会超过VREF太多否则即使没烧MCU采样数据也会因为输入超过参考电压而错乱。2.2 电流采样通道采样电阻与运放方案对比电流测量0-5A这部分的电路设计比电压复杂得多。核心问题是采样电压的幅度和电平搬移。方案A是低边采样在负载回流到地之间串一个采样电阻比如10毫欧5A电流时压降50mV。这个压降直接送到MCU内部PGA放大后进ADC。低边采样最大的问题是采样电阻上的地电位浮动会影响负载的地参考对某些敏感的负载电路不友好但作为测量仪表模块被测系统通常有自己的参考地低边采样简化了电平搬移电路可以省掉运放。方案B是高边采样采样电阻在电源正端到负载之间压降信号相对地是浮空的需要差分运放把信号转成对地的单端信号。好处是地平面干净适合需要严格参考地的场景但成本高一点多一颗精密运放。我最终选了低边采样PGA的方案配合CW32L012内部PGA做增益放大。采样电阻选了标称10毫欧、1%精度、功率3W的合金电阻长边焊盘散热设计。5A电流时压降50mV功率0.25W3W的封装温升很小阻值漂移可以忽略。这里有个关键计算50mV输入PGA增益选择多少才能最大化ADC的分辨率我的ADC参考用2.5V满量程12位1LSB对应约0.61mV。如果把PGA增益设为32倍50mV放大到1.6V电流分辨率就是5A / (1.6V/0.61mV) ≈ 1.9mA。如果增益设为16倍50mV放大到0.8V分辨率约3.8mA。既然分辨率指标写的是1mA那就选32倍增益。但PGA失调电压也是问题后文校准部分会说怎么处理。2.3 量程自动切换与按键手动切换自动量程听起来高大上实际上就是双ADC通道不同分压比的背后切换。CW32L012的ADC可以序列扫描多个通道但它的外部引脚就那些所以我在电路上做的是两个分压电阻网络分别接到两路ADC输入而不是用模拟开关动态切换。具体配置PA0接高量程分压点12:1直接覆盖0-30VPA1接低量程分压点2.4:1覆盖0-6V软件上先读PA0通道如果换算出来的电压低于6V再读PA1通道以PA1的结果为准分辨率更高因为同样的12位ADC低量程档1LSB对应电压是0.61mV2.41.4mV高量程是0.61mV127.3mV如果电压高于6V则只采用PA0结果。这种方式避免了模拟开关的导通电阻和漏电流干扰代价是多占一个ADC通道和一组分压电阻但精度和可靠性更好。仪表类产品我不太愿意用模拟开关切换量程因为导通电阻会引入不确定的误差源。3. 软件核心ADC采集、滤波与校准算法3.1 ADC配置与序列扫描CW32L012的ADC支持规则序列和注入序列我用的就是规则序列自动扫描PA0和PA1外加一个内部温度传感器通道用于温度补偿校准。配置时有个点要注意ADC的采样时间要设置足够长因为分压网络的输出阻抗较高如果采样电容还没充到稳定电压就开始转换读数会偏低。分压电阻网络等效源阻抗大概在几十K欧量级30V档的总阻值200K分压点到ADC的等效电阻约16K虽然芯片内部有采样电容但采样时间短了还是会有建立误差。我实测过采样时间配置为1us和10us读同一个电压源结果能差出十几个LSB。所以我最后把采样周期配置为约10us多花一点采样时间换来稳定读数绝对值。ADC转换完成用中断标志触发DMA搬运。DMA配置成循环模式连续把ADC结果搬到一个buffer里CPU不用一次次进中断省下来的时间可以做显示刷新和按键扫描。这个架构在仪表类应用里很常见也是低功耗设计的基础。3.2 数字滤波滑动平均中位值滤波组合ADC原始数据直接显示肯定不行会有噪声跳动。我试过几种滤波算法最终用的是去极值滑动平均中位值滑动平均组合每通道连续采12个样本去掉最大值和最小值剩余10个样本取算术平均。这个组合滤波的响应时间目前是12个样本*10us采样时间转换时间大约一两个毫秒对电压电流表来说完全够用且不拖沓。如果只做简单滑动平均一旦有开关电源的尖峰干扰显示值会被拉偏中位值滤波剔除极值后这个问题基本消失。这里我踩过一个坑滤波窗口太大比如64点滑动平均显示很稳定但负载突变时数值迟钝得让人抓狂看起来完全不像在实时测量。所以滤波窗口的设计要结合应用场景电源测量表头还是得保留一定的实时性。3.3 两点校准法与映射关系理论上ADC的线性度足够好只需要零点和增益两个点校准。实际电路里的误差来源主要有分压电阻的精度误差1%阻值误差造成比例偏差采样电阻的精度误差3瓦合金电阻通常是1%PGA的增益误差内部PGA增益有正负几个百分比的偏差ADC本身的偏移误差和增益误差参考电压的实际值与标称值的偏差。对一台仪表来说单纯依赖电阻精度绝对是不够的。我做的校准是两点线性标定零点和满量程点软件里存两个校准系数对一个电压通道一个电流通道。校准流程是这样的电压通道在校准模式下输入端接标准电压源先给0.000V记录ADC代码平均值作为零点Zv再给30.000V或接近满量程的值记录ADC代码平均值作为增益点Sv。实际测量时实际电压 (ADC原始代码 - Zv) / (Sv - Zv) * 校准满量程电压电流通道同理输入端通过恒流源给0A和5A记录对应的ADC代码Zc和Sc然后实际电流 (ADC原始代码 - Zc) / (Sc - Zc) * 5.000这个线性映射的精度上限取决于ADC线性度和参考源稳定性。CW32L012的12位ADC积分非线性指标大概在正负2.5LSB左右对应电压档大约是18mV勉强可以接受。如果要做更高精度就得考虑过采样技术16倍过采样可以额外获得2位分辨率把有效分辨率从12位推到14位代价是转换时间增加但电压电流表不追求高速采样这个代价完全可以接受。3.4 温度补偿与内部基准自检CW32L012内置温度传感器这个模块我在项目里用来做温漂补偿。分压电阻的温漂系数是25ppm每度采样电阻是50ppm每度当环境温度从25度变到55度采样电阻阻值漂移了0.15%对应5A量程会引入7.5mA的误差。不补偿的话高低温测试肯定过不了。我的做法是上电时读温度传感器之后每10秒读一次根据当前温度计算补偿系数。补偿公式很简单补偿系数 1 TC * (T_current - T_ref)TC是采样电阻的温漂系数50ppmT_ref是校准时温度。电压通道的分压电阻温漂小一些但因为有功率型电阻和严格的精度要求我也做了同样的补偿。顺便说一句CW32L012内部参考电压的温漂在数据手册里是正负几十ppm的量级对于0.1%精度级别的表头来说可以忽略不计但如果你追求0.05%以上的精度最好还是外接一个基准源比如REF3333用ADC的外部参考通道。我这版由于成本和面积考量还是用了内部2.5V基准校准的时候把基准偏差一并校准掉。4. 显示与交互段码LCD和按键逻辑4.1 LCD驱动配置的几个细节CW32L012的LCD控制器要配置的寄存器不少但核心就几件事工作模式1/3偏置、1/4占空比、时钟分频决定刷新频率、引脚功能映射、以及显示内存的映射关系。我用的屏是4位COM、32个SEG的段码LCD正好支持8个数字位或者更灵活的字符段。初始化代码看起来很多但实际配置逻辑很套路无非是把引脚复用为LCD功能然后按位往显示寄存器里写段码数据。标题上这个点我特别想说一下LCD的COM/SEG脚别选错。CW32L012的LCD脚是和一些GPIO复用在一起的如果其他外设占用了这些脚LCD就死活不亮。我在第一版布局里把UART的TX/RX脚设置成了LCD引脚附近的位置结果布线的时候冲突后来改了一块PCB才解决。做设计之前一定要先查datasheet的引脚复用表把所有外设的引脚规划放在一个表里核对一遍。LCD显示内容规划电压值显示5位整数3位小数2位单位V电流值显示5位整数1位小数3位单位A功能指示符号MAX峰值保持、CAL校准模式、BAT低电量指示如果板子用电池供电会用。还要考虑LCD的偏置电压生成。CW32L012内部集成了电荷泵产生LCD偏置电压不需要外部负压电路这就比多年前常用的HT1621方案清爽太多了外接电容都少了好几个。4.2 按键设计短按/长按/组合键因为面板空间有限我总共放了两个按键KEY1为功能键短按切换显示模式实际值 → 峰值保持 → 平均值显示KEY2为设置键长按2秒进入校准菜单短按切换校准点位电压零点、电压满量程、电流零点、电流满量程配合KEY1调整数值。按键扫描不能直接读GPIO就完事要做消抖。我用的方法是系统定时器每隔5ms扫描一次按键连续3次读到相同状态才算有效这样能滤掉机械抖动同时用状态机处理短按和长按的逻辑。这个状态机代码大概三十行但逻辑清晰扩展性也好后面如果想加双击操作在这个框架上加状态就行。校准时用按键增减数值的交互方式有点土但纯按键方案里这不失为最可靠的方式。如果产品要量产建议预留I2C接口用上位机或者蓝牙模块来做无线校准效率会高很多。我这版为了快速迭代还是按键方案。5. 低功耗策略与实际功耗测试5.1 工作模式规划CW32L012支持Sleep、DeepSleep、PowerDown等几种模式。对于电压电流表这种“间歇性测量连续显示”的设备功耗优化的思路是把大部分时间放在Sleep模式让定时器周期性唤醒MCU做ADC采样和LCD刷新。我实测了一下如果LCD一直亮着MCU在Active模式下的电流大约2.8mA24MHz主频开启LCD和ADC这样如果是1000mAh的电池供电大约能跑350小时左右连续开机大约两周。但如果采用“每200ms唤醒一次采样和刷新显示后立刻Sleep”平均电流能降到0.6mA左右续航直接提升到近70天。这个思路对电压电流表设计很有价值特别是做便携式设备你不能让表头比被测设备还耗电。5.2 定时唤醒与LCD保持这里有一个很多人容易忽略的细节在DeepSleep模式下段码LCD显示内容是不会自己保持的因为LCD的刷新信号必须持续提供尤其对于非静态LCD。所以我的做法是在进入Sleep前把要显示的数据全部锁存好睡眠期间用LCD的低功耗刷新模式继续驱动。CW32L012的数据手册里专门有LCD模块在低功耗模式下的使用方法把LCD的时钟源切换到低功耗时钟同时保持LCM使能屏幕就能在低功耗状态下持续显示。实际测下来整机睡眠LCD保持定时器唤醒平均电流能做到0.4mA左右对于一个带显示功能的仪器表头来说这个数字算是相当漂亮了。5.3 供电路径与抗干扰电源设计上用了两级结构输入端是一个宽压LDO输入范围6-36V输出3.3V给MCU和模拟电路LDO前后加磁珠和TVS管防止电源线上的高频噪声干扰ADC参考源。实测中我发现如果LDO的高频纹波抑制不够ADC读数的噪声会明显增大特别是电流通道在PGA增益32倍时电源纹波被放大后直接进ADC噪声惨不忍睹。后来我把模拟供电和数字供电分开走线ADC的VREF引脚到LDO输出端加了一个10欧电阻10uF电容的RC滤波情况立刻好转噪声峰峰值从十几个LSB降到三四个LSB这个细节比换更高精度的基准还管用。6. 调试记录常见问题与避坑清单6.1 采样数据跳变、显示不稳排查思路先用万用表量ADC引脚的直流电压是否稳定如果电压本身不稳问题一定在前端如果电压稳再查ADC配置。我遇到过一次比较隐蔽的情况PGA增益打开后ADC的采样数据周期性跳动查了半天发现是PGA的建立时间不够每次切换通道后立即启动转换PGA还没稳。解决方案是在通道切换后插入一段延时几百微秒等PGA稳定再转换。这类问题光看datasheet不一定能发现多试几个采样时序就知道门道了。6.2 电流零点漂移表现为输入端短路0A输入时LCD显示的不是0.000而是一个不稳定的几十毫安的值。原因有两个一是PGA的输入失调电压典型值1-3mV折算到32倍增益前端就是几十微伏输入失调在采样电阻上等效为几毫安的电流误差二是PCB走线的地线环路噪声。解决方法软件校准里做零点扣除是必需的但还有一个技巧是硬件上将采样电阻的Kelvin走线接法做好信号线从采样电阻两端单独引出不要在采样电阻的焊盘上直接并联一段走线到放大器输入端否则铜箔电阻的压降直接叠加在信号上会产生不可控的零位偏移。我用的是4线开尔文接法效果立竿见影。6.3 高电压输入导致读数异常如果你用低量程档测高电压输入端分压网络会把电压降下来但ADC引脚上可能还是有残余的风险特别是在输入电压超过32V时钳位二极管动作电流会通过限流电阻灌到参考电压节点导致参考电压被拉高读数直接就不对了。针对这个问题我在参考电压节点上加了一颗10uF电容和几欧的电阻做隔离把钳位电流吸收掉避免参考漂移。另外在电路板布局上ADC输入引脚周围不要走开关节点信号减少容性耦合。超压测试的极限值我也试过输入40V直流持续一分钟板子除了参考电压略微拉升后恢复整体功能正常保护电路起到了作用。6.4 校准操作不可逆、参数丢失一个比较尴尬的小问题我做按键校准时没做参数存储前的CRC校验有几次调试过程中按键序列乱按把校准参数区域写成了错误数据导致设备显示值严重偏离。后来在Flash存储结构里加了帧头和CRC校验并且做了双备份区域写完第一区后校验校验失败自动回退到第二区。这个机制不算新颖但在MCU仪表类设计里非常实用。7. 实测数据与精度评价调试完毕后我做了几组简单的对比实验用的是实验室的Fluke 8846A六位半台式万用表作为参考标准。电压通道测试数据5个采样点标准电压V本表显示V绝对误差mV0.0000.00115.0005.003312.00012.006624.00024.0121230.00030.01818最大误差出现在满量程30V处18mV相对误差约为0.06%。这个精度已经超过了0.1%级别的普通数字电压表用来做电源监控完全没问题。电流通道测试数据5个采样点标准电流A本表显示A绝对误差mA0.0000.00221.0001.00442.0002.00773.0003.00995.0005.013135A处误差13mA相对误差0.26%。导致这个误差的主要原因是采样电阻的剩余温漂和PGA增益的非线性考虑到我用了内部参考和未做流水线级校准这个成绩已经符合设计预期。如果要把电流精度再往上提下一步计划就是改用外置基准 0.1%低温漂采样电阻预计能把误差控制在0.1%以内。从选型到实际测完数据整个过程大概用了我两个周末的时间。CW32L012的库函数和例程包做得还算顺手特别是ADC和LCD的demo可以直接改省去了不少初始化代码的折腾。就这个项目来说最让我满意的是做低功耗时的效果——原来用STM32的时候开到睡眠模式还得各种折腾时钟树CW32L012的底层功耗管理和外设联动确实给应用层留了很大的优化空间。如果后面要扩展蓝牙通信或者加成USB接口这颗料也还有富余的资源。做仪器仪表的朋友不妨入手一块评估板试试成本不高回报率很划算。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →