ARTICLE DETAIL

资讯详情

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

用触摸屏自制便携功率分析仪:波形显示与功率测量一体化设计

用触摸屏自制便携功率分析仪:波形显示与功率测量一体化设计 项目概述与核心设计思路功率分析仪Power Analyzer一直是电子工程师和硬件调试人员桌上不可或缺的工具但市面上的商用功率分析仪价格动辄几千上万而且操作界面老旧、交互逻辑复杂。这个项目要做的事情很明确用一块带触摸屏的开发板自己动手做一个集电压电流波形显示、功率参数测量于一体的便携工具让示波器可视化能力与功率分析功能合二为一。项目的核心是解决三个痛点一是成本问题用几十元的硬件实现基础功率分析功能二是交互问题传统仪器旋钮按键多学习成本高而触控操作天然更直观三是便携问题把原本堆在实验室台面上的设备变成手掌大小。适合的读者群体很宽无论是电源工程师、嵌入式开发者、电子爱好者还是学校里正在学电力电子、信号处理相关课程的学生都能从这个项目里拿到思路。从技术角度看这个项目横跨模拟信号调理、ADC高速采样、嵌入式GUI开发、数字信号处理几个方向是一个典型的软硬结合练手项目。我选择的主控是带硬件浮点单元和充足RAM的MCU屏幕用了一块支持电容触摸的TFT LCD采样端用了独立的双通道同步采样架构确保电压和电流数据在时间上严格对齐——这一点对功率计算至关重要。在做整体方案设计时我先想清楚了一个问题测量对象是什么样的信号这里定位的是常见的交直流电源、电器负载、小型开关电源等场景电压范围在正负几十伏电流范围在几安培以内频率覆盖直流到几十千赫兹的开关纹波。基于这个定位我不需要做成像泰克、横河那种宽带功率分析仪而是把一个实用的、精度够用的便携版本做好。1. 内容整体设计与方案选型考量1.1 为什么选触摸屏而不是物理按键早期做仪器类项目大家习惯用物理按键加编码器因为稳定、反馈明确。但实际用下来就会发现功率分析仪需要展示的数据维度太多了电压波形、电流波形、功率数值、频谱信息、历史趋势如果全靠按键切换至少要做三级菜单操作效率非常低。触摸屏的核心优势在于“所见即所得”。波形的缩放、拖拽、双通道的开关、量程切换都可以直接用手指完成这正好契合示波器类工具的使用习惯。我采用的电容触摸方案配合LVGL图形库把界面的响应延迟控制在100毫秒以内实测下来和手机的操作体验非常接近。当然触摸方案也有代价一是功耗比按键高屏幕背光和触摸扫描都会耗电二是在强电磁干扰环境下电容触摸可能受耦合噪声影响。但作为桌面调试工具这两点影响不大。如果后续要做成便携电池版可以增加休眠策略来缓解功耗问题。1.2 主控选型与架构分工主控选型的核心约束有三条ADC采样率和分辨率要够、要能流畅驱动TFT屏、要有足够算力做实时信号处理。我选的是STM32F429ZET6主频168MHz内置3个12位ADC采样率最高2.4Msps带有浮点运算单元这对RMS计算和FFT运算很有帮助。更重要的是它内置LCD控制器和DMA可以直接驱动RGB接口的TFT屏不需要额外的显示控制芯片数据带宽也足够支撑波形刷新。架构分工是这样的定时器触发ADC规则采样DMA自动搬运数据到内存缓冲区CPU在采样的间歇完成功率参数计算和界面刷新触摸屏的事件通过外部中断处理。整个流程形成一个流水线前面采样的同时后面在算数和画图互不阻塞。这里要重点提一下为什么选定时器触发的硬件采样而不是在while循环里用软件延时采样。电路中的电压电流信号是连续变化的软件采样受中断响应时间影响采样间隔会抖动导致波形显示出现毛刺。定时器触发ADC加DMA传输的方式采样间隔由硬件保证抖动在纳秒级别这也是示波器类项目必须满足的基础条件。1.3 整体功能边界与参数定位在动手画板子之前我把功能边界划得很清楚避免项目无限膨胀。最终确定的核心功能有五项双通道波形实时显示、触摸缩放与拖拽、交直流电压电流真有效值测量、有功功率视在功率功率因数计算、简单FFT频谱分析。设计的参数指标如下参数设计值说明电压测量范围正负25V可扩展分压覆盖常见低压电路电流测量范围正负3A使用0.1欧姆采样电阻输入带宽0-50kHz满足开关电源纹波观察ADC分辨率12位配合过采样提升有效位数采样率最高200ksps双通道定时器触发DMA传输波形刷新率30fpsLVGL局部重绘实现功率计算精度优于2%校准后实测有读者可能会问为什么不用几个毫欧的采样电阻这样损耗更小。这里要解释一个矛盾采样电阻越小信噪比越差小电流测量时误差会非常大。我用0.1欧姆在3A满量程时功耗为0.9W选功率电阻可以承受而信噪比方面3A电流产生0.3V压降对12位ADC来说相当于满量程的1.2%分辨率足够。这个取舍适合我这个项目定位如果是测更大电流就得换成霍尔传感器或者互感器了。2. 硬件设计与信号链搭建2.1 电压采样通道设计电压采样通道看似简单实际是最容易出错的地方。直接用电阻分压接ADC是新手常见的做法但忽略了两个问题一是ADC输入阻抗对分压网络的影响二是高频噪声的混叠。我的做法是两级结构第一级是精密电阻分压网络把正负25V信号衰减到正负1.65V第二级是运算放大器构成的跟随器利用运放的高输入阻抗隔离分压网络和ADC输入端。运放选的是LMV358轨到轨输出单电源3.3V供电正好匹配ADC输入范围。运放部分关键的一个设计细节是直流偏置。因为ADC只能采样0到3.3V的正电压而交流信号有正有负必须把信号整体抬升1.65V到ADC量程的中点。这个偏置电压不能直接用电阻分压获取因为运放的偏置电流和电源纹波都会影响偏置精度。我用了一个精密的1.65V基准芯片经过缓冲后接到运放的同相端实测零输入时ADC读数稳定在2048附近波动只有正负1个LSB。很多人会忽略输入保护电路。调试开关电源时一个过压尖峰就可能烧掉ADC引脚。我在输入端并联了双向TVS管和一对肖特基二极管做钳位把输入电压限制在3.3V以内。另外加了一个简单的RC低通滤波器截止频率设在100kHz左右既保证50kHz以内的信号不受影响又滤掉了采样混叠的高频分量。2.2 电流采样通道设计电流采样我用了低侧采样方案在负载回路的地线上串联0.1欧姆采样电阻用INA240这类专用电流检测放大器测量电阻两端的压降。INA240的好处是共模抑制比非常高即使地线上有噪声干扰也能准确测量毫伏级的差分信号。这里有一个容易踩坑的点低侧采样会把采样电阻放在负载和地之间如果负载本身有其他接地点可能会产生地环路电流导致测量误差。实际使用中我用的是隔离供电的负载或者确保测量回路单点接地这样测出来的数据才准确。如果是做浮地系统建议改用高侧采样加隔离放大器复杂度会高不少。电流信号的增益设定比较关键。满量程3A对应0.3V采样电阻压降INA240增益设为20倍输出电压范围为正负3V再经过和电压通道相同的运放偏置电路换算成0到3.3V的ADC输入范围。整个电流链路在满量程时的灵敏度约为1.1mV/mA对3A量程下的小电流分辨足够。器件选型方面有一个实际教训采样电阻必须选低感抗的合金电阻而不是绕线电阻。绕线电阻虽然标称精度高但寄生电感在高频下会产生额外的感抗压降导致测出来的电流波形在高频段出现畸变。合金电阻的寄生电感在纳亨级别对几十千赫兹的测量没有明显影响。另外功率要留1.5倍以上的余量连续测量时电阻的温升会造成阻值漂移进而带来测量误差。2.3 电源系统与参考电压处理既然做的是功率分析仪电源自身必须干净否则测出来的噪声都分不清是信号还是电源的。我的电源架构是外部输入5V经过低噪声LDO降到3.3V给数字部分供电再用一个单独的LDO从5V降到3.3V给模拟部分供电两个3.3V之间用小磁珠隔离。数字地和模拟地在ADC芯片下方单点连接避免数字噪声通过地平面串进模拟采集链路。ADC的参考电压是精度的关键。STM32F429的VREF引脚如果直接接3.3V电源那么电源上的波动会直接反映到测量结果里。我用了外部基准芯片输出稳定为3.3V纹波抑制比高达80dB长期稳定性在正负0.1%以内。这个改动让测量重复性提升了一个台阶。还有个小细节ADC的采样电容在每次采样时都会从信号源抽取电荷如果驱动阻抗过高电荷注入会造成转换误差。所以运放输出的驱动能力必须足够我选择的运放输出阻抗在100欧姆以下配合100nF的采样保持电容充放电时间常数远小于ADC采样时间误差可以忽略。3. 软件架构与触摸示波器可视化实现3.1 采样缓冲区的设计与双缓冲机制软件设计的核心不是界面而是数据通路。ADC采样进来的数据必须经过DMA搬运到内存CPU才能处理如果数据通路设计不合理要么丢数据要么界面卡顿。我用了双缓冲机制定义两个大小为1024点的数组DMA传输采用循环模式。当DMA写满第一个缓冲区时触发中断此时CPU处理第一个缓冲区的数据同时DMA继续往第二个缓冲区写入新数据。这样数据处理和采集并行进行不容易丢数据。缓冲区深度设置为1024点是经过计算权衡的。屏幕宽度是480像素波形绘制每通道需要480个点1024点给每个通道预留了足够的余量用于触发对齐和缩放抽取。同时1024点正好是2的整数次幂可以直接用库函数做FFT分析不需要额外的数据重组操作。在200ksps采样率下1024点采满需要5.12ms对应刷新率约195帧但实际受限于屏幕刷新速度我采样率降到50ksps达到约97帧的采集能力显示端控制在30fps左右。3.2 触摸交互的映射与响应优化触摸交互是本项目的重点也花了最多时间调试。在LVGL中触摸输入设备注册后所有控件都可以直接响应点击、滑动事件但波形显示区域不一样它需要的是自定义手势。我实现了三种触控手势。单指拖拽用于水平移动波形视图可以让用户查看缓冲区内前后时间段的波形。双指捏合用于缩放时间轴最小放大到每个像素对应一个采样点最大缩小到显示完整缓冲区。双击用于自动量程让波形幅度自适应屏幕高度。这里有一个重要的技术细节电容触摸屏上报的坐标有延迟和抖动如果直接把坐标变化映射到波形偏移量画面会明显晃动。我的处理办法是给触摸事件做滑动平均滤波窗口设为4个采样点同时对移动距离设置阈值只有超过4个像素的移动才被视为拖拽操作。这样既保证了跟手性又消除了手抖带来的误操作。波形缩放时还有一个性能考量。直接的思路是每帧重新计算所有数据点的映射关系但这样CPU占用率会飙升。我的优化方案是分层绘制先把1024个原始采样点压缩成一份最大最小值对数组缩放操作时用不同层的压缩数据去绘制避免每次缩放都遍历全部原始数据。这种处理有点类似图像金字塔的思想实测下来在最小缩放级别也能保持30fps的刷新速度。3.3 波形绘制与界面刷新的性能优化示波器可视化对刷新率要求高直接调用LVGL的绘图函数逐点画线性能不够。我的方案是自绘波形区用LVGL的canvas组件作为画布在canvas上直接操作像素。具体做法是这样的先根据缩放比例和偏移量计算波形数据在屏幕上的坐标序列然后用画线算法把相邻点连起来。为了加速我用了基于Bresenham的直线插值同时在绘制模式下只重绘脏矩形区域——也就是手指划过或波形变化后需要更新的局部区域而不是整屏刷新。四线式触摸屏的触点扫描和LCD刷新共享同一个SPI总线时会有资源竞争。我的解决办法是采用双缓冲LCD端有一个完整的帧缓冲后台波形绘制直接写帧缓冲显示驱动通过DMA同步刷新。触摸扫描被安排在两次DMA传输的间隙执行优先级最低。这样从根本上解决了SPI总线的时序冲突画面的撕裂感也消失了。界面布局上上半部分是波形显示区域占屏幕高度的60%下半部分是数据面板实时显示电压、电流、功率、功率因数等数值。数据面板的刷新频率单独控制每秒10次避免频繁刷新文本控件带来的额外开销。每个数值上做了颜色编码电压用绿色电流用黄色功率用白色一眼就能区分。4. 核心算法与功率参数计算4.1 真有效值计算与频率自适应功率分析仪不能只算平均值对于非正弦波形必须用真有效值定义来计算也就是对采样数据进行平方、平均、开方操作。我的实现是在采样缓冲区中同时存电压和电流序列每个周期结束后对整段数据计算电压有效值、电流有效值、有功功率。计算公式是标准的数字积分采样点参与个数由当前信号的频率决定。为了适应不同频率的信号我设计了一个频率跟踪机制先用过零检测法估算信号基频然后根据基频确定一个周期内的采样点数取整后作为积分窗口长度。这个频率自适应逻辑遇到过初始化的难题上电时未知信号频率没法确定窗口长度过零检测也不稳定。我采用的启动策略是先按默认50Hz工频计算一个粗略窗口用这个窗口积累2个周期数据再用滑动过零检测重新估算频率后续每32个周期更新一次频率值。实测下来从20Hz到1000Hz的信号都能在200毫秒内完成频率锁定这个动态响应速度满足绝大部分设备测试场景。计算过程中还有一个重要的修正平方之后求平均然后再开方这是真有效值的基本流程但对偏置电压必须做减除处理。如果直流偏置没有完全校准计算结果会偏大尤其是小信号时误差非常明显。我在数据进入计算前做了一次去偏置处理也就是减去缓冲区中所有采样点的平均值这样可以大幅降低直流偏置误差的影响。4.2 有功功率、视在功率与功率因数计算电力参数里有功功率P、视在功率S、功率因数PF是最常用的三个量。它们的数字实现方式有固定的公式和顺序不能反着算。有功功率的计算是逐点相乘后取平均P等于采样点电压乘电流的累加和除以点数。这个算法的物理意义是瞬时功率在一个周期内的平均值对所有波形形状都有效不需要假设是正弦波。我的程序里用到了硬件浮点单元4096个采样点的乘加运算耗时在1毫秒以内对实时性没有压力。视在功率S等于电压有效值乘以电流有效值功率因数PF等于P除以S。对于纯正弦波负载PF就是余弦值但对开关电源这类非线性负载PF会显著低于1这是正常的反映出负载电流谐波的影响。我做了个三相计算的简化版本不过这是后话当前单相版本已经够用了。我在数据面板上还额外显示了一个参数基波功率因数也就是用FFT提取出电压和电流的基波分量幅值再计算两者之间的相位差取余弦。这个值和全功率因数的差别反映了谐波对功率因数的影响对分析开关电源的谐波特性很有参考价值。这里有一个细节需要实测注意有功功率是代数量如果有电流反向计算结果会是负的。在调试电源模块时负功率意味着该设备正在回馈能量。我在面板上做了符号指示负数用红色显示这个设计在测电源效率时特别有用。4.3 FFT频谱分析与谐波监测前面提到过1024点缓冲区可以直接做FFT这里展开说一下用法。FFT的输入是去掉直流偏置后的采样序列加窗函数后做蝶形运算输出结果对折取一半就得到从0到奈奎斯特频率的幅值谱。选窗函数是个细节。不加窗会有严重的频谱泄漏尤其是分析开关电源这种含有丰富高次谐波的信号频谱泄漏会把谱线抹成一团。我默认加了汉宁窗它在主瓣宽度和旁瓣衰减之间有较好的平衡适合频谱监测场景。如果要做精确的幅值校准则改用平顶窗代价是频率分辨率稍低。这两个窗函数通过菜单切换。功率分析仪的FFT还有一个应用计算总谐波失真THD。THD的定义是各次谐波有效值平方和开根号除以基波有效值再乘以100%。我用FFT算出来的前31次谐波分量去做求和计算这个范围覆盖了大部分电源谐波能量所在频段测量结果和台式仪器的对比误差在5%以内。频谱显示界面用柱状图表示横轴是谐波次数前20次依次排列纵轴是对数坐标的幅度。用不同颜色区分电压谐波和电流谐波通道触摸任意一个柱状条可以查看该次谐波的精确幅值和百分比。这个交互方式比传统分析仪的表格式列表直观很多也是项目展示时的一个亮点。5. 常见问题与调试验收心得5.1 波形噪声异常偏大的排查纪实项目调试到中期遇到一个很顽固的问题波形显示正常但数值面板上的电压有效值始终比万用表读数高出约3%。排查了采样电阻、分压网络、ADC参考电压都没有锁定根因。最后用示波器观察运放输出端才发现信号上叠加了一个约30mV的100kHz高频纹波频率和MCU的PWM输出一致。问题出在电路板的布局上PWM信号线和模拟输入线平行走了约3厘米产生了容性耦合。解决办法是把模拟部分的地平面加宽同时在模拟输入端加了一个截止频率在10kHz左右的二阶低通滤波器。加滤波后读数误差降到0.5%以内。这个案例给了一个经验在做混合信号电路布局时数字信号线和模拟信号线必须保持距离如果没办法拉开距离就在模拟入口处预留滤波位置哪怕不焊也要预留。PCB上预留的滤波元件位置在调试时能省很多事。5.2 触摸漂移与误触发的修复方法电容触摸屏用久了会出现漂移特别是屏幕边缘的坐标误差会越来越大大概用两周后就明显到影响缩放操作。这是因为触控面板的电容基准值会随着温度、湿度缓慢变化。解决方案是在固件里增加了触摸自动校准功能每次开机时程序会统计触摸面板在无触摸状态下的原始数据建立新的基准线然后对触摸坐标做线性映射修正。这个校准过程完全自动不需要用户干预。做了这个改进之后连续使用了一个月触摸定位精度保持稳定。另一个常见问题是用湿手或带手套操作屏幕时触摸完全不响应。这是电容屏的物理特性无法从软件层面彻底解决。我在UI上做了一个补救措施开启一个“触摸放大”辅助模式屏幕上出现一个比手指大两倍的虚拟触点跟随手指粗略位置移动以虚拟触点的坐标作为点击位置这样很大程度缓解了精准点击困难的问题。5.3 功率因数显示异常的处理记录有用户反馈测容性负载时功率因数显示为负值觉得是程序bug。细查之后发现这个现象恰恰是对的容性负载的电流相位超前电压约90度如果在负功率方向定义电流方向功率因数就会出现负号。这提醒我校验了符号约定。行业里常见的约定是感性负载电流滞后功率因数为正容性负载电流超前功率因数为负。我在程序里按这个约定实现了相位判断同时在面板上增加了一个相位角显示让用户能直观看到电压和电流的相位关系而不只是看到一个可能引起误会的正负号。另外还发现一个功率因数计算本身的细节当电流很小时噪声主导了相位计算功率因数会在1到0之间乱跳。我在软件里加了判断实测电流有效值低于满量程的0.5%时功率因数显示置为无效状态用短横线表示不参与界面上的数据展示避免误导用户。5.4 波形绘制撕裂与闪烁的优化最开始用LVGL自带的图表组件画波形遇到屏幕刷新撕裂的问题尤其是在波形以30fps刷新时屏幕顶部和底部会明显错位。原因在于绘制和显示刷新共用了一个缓冲区绘制到一半时屏幕就开始读取导致画面不完整。按照之前提到的双缓冲方案改造后撕裂问题解决了。这里再补充一个性能细节屏幕驱动的DMA传输会在每一帧结束前自动等待垂直同步信号这样切换缓冲区不会出现在刷新过程中彻底避免了一闪一暗的问题。实测这个方案在300x240的RGB屏上整屏重绘时间为18毫秒波形刷新率可以做到稳定的30fps。如果画面上同时显示两个通道外加一个频谱柱状图帧率会掉到22fps左右。我做了区域划分优化波形区域更新频率为30fps频谱区域降到15fps数值面板维持10fps不同区域的刷新频率不一致但人眼对快速变化的数值区域并不敏感整体感觉依然流畅。这种分区帧率的思路比单纯提升总帧率更省CPU。5.5 校准方法与实践经验任何测量仪器都离不开校准。我设计的校准流程分三步零点校准、增益校准、相位校准。零点校准最简单断开输入信号记录缓冲区的偏移量存入Flash。增益校准需要一个已知精度的基准源用一台台式万用表或函数发生器提供直流电压和固定频率的正弦波分别测出电压通道和电流通道的增益系数。相位校准用的是电阻负载因为纯电阻负载的电压电流相位差理论上是0度程序里以它为基准消除采样链路引入的固定相位延迟。这一步的校准数据最终存在Flash里每次开机自动加载。我的预期精度是电压、电流、功率都做到2%以内通过校准后实测的数据超出了预期电压误差在0.8%以内功率误差在1.5%以内对这个价位的DIY功率分析仪来说已经足够满足日常调试需求了。最后再分享一个个人体验整个项目从硬件设计到调试完成花费的时间大头不在画电路板而在触摸交互的调优和波形绘制性能的打磨上。如果你也打算复制这个方案建议先跑通软件原型再去做精致的结构件和硬件改版这样能省掉很多重复劳动。另外给用户开放一个校准入口非常有必要省得每次都要拿着源代码重新编译固件。
返回列表