资讯动态

基于Arduino/ESP32的能量转化追踪器:实时测量电机效率

发布时间:2026/9/9 6:52:31 来源:尧图企业网站定制
我最早开始捣鼓能量转化追踪器是给学生上实验课的时候。当时教到“能量守恒与转化”课本上讲得头头是道电能变成机械能、机械能再变成热能效率百分之多少但学生全在背公式压根没建立起物理直觉。我就琢磨能不能做一个能实时看到“电进去了多少、机械能出来了多少、中间损耗了多少”的小装置于是就有了这个项目一台基于 Arduino/ESP32 的能量转化追踪器测量直流电机的输入电功率和输出机械功率把效率曲线实时画出来还能追踪到最高效率点。这篇文章就把它从硬件选型、机械台架到软件算法、标定排查的完整过程全部拆开讲清楚。这个项目适合三类人一类是想把能量转化这个抽象概念做“可视化”的老师和科技辅导员一类是搞电机驱动、泵类负载选型的工程师想测一下手里电机在不同负载下的真实效率还有一类是自己玩 DIY 硬件、想把手头的 Arduino、ESP32、传感器真正组合成一个有意义系统的人。它不需要特别贵的仪器核心就是用几个常见的传感器模块把“电压、电流、转速、扭矩”四个量测出来再算效率。整套做下来你对电机效率的理解绝对比看十篇论文都深。1. 项目整体设计与思路拆解1.1 为什么选“电→机械”这条转化链路做追踪能量转化这个主题其实很宽泛光能转电能、化学能转电能、机械能转电能……但我最终选的是“电能 → 直流电机 → 机械能”这条链路原因是它最直观也最好测量。电功率是最好测的电压乘电流即可两个传感器模块就能搞定。机械功率理论上等于转矩乘以角速度而转矩在工程上测量偏麻烦但好在我们是在做教学和测试台架不用真去测电机的内部电磁转矩直接测电机轴上对外输出的负载转矩就行。这就绕开了很多昂贵的扭矩传感器方案用一个小力臂和称重传感器就能解决。选直流电机还有个好处它的效率特性非常典型低速重载时铜损占比大高速轻载时机械损耗占比大中间会有一个明显的“最高效率区间”。这对做“追踪器”来说太合适了——如果效率曲线是一条平直线追踪就没有意义了。直流电机的效率曲线像一座山峰我们的追踪器就是要实时爬这座山并标记出山顶的位置。1.2 系统整体架构四个测量点一个计算核心整套追踪器的构成可以拆成四个测量环节加一个大脑。第一个测量点是输入电参数用 INA219 模块同时测母线电压和电流得到输入功率 (P_{in}U×I)。第二个测量点是转速电机轴上装一个开槽码盘用槽型光耦输出脉冲单片机通过脉冲频率换算成转速进而得到角速度 (\omega)。第三个测量点是扭矩这个环节最巧妙电机轴上装一个直径已知的圆盘或同步轮用一根细绳绕在轮子上绳子另一头挂一个称重传感器当电机旋转时绳子对传感器的拉力乘以轮的半径就是负载转矩。第四个测量点是人机交互OLED 屏实时刷新数据同时通过串口发到电脑上记录。核心计算逻辑就三条公式[ P_{in} U \times I ][ P_{out} T \times \omega F \times r \times \frac{2\pi n}{60} ][ \eta \frac{P_{out}}{P_{in}} \times 100% ]其中 (F) 是称重传感器测到的拉力单位牛(r) 是绕线轮半径单位米(n) 是转速单位转/分。整套系统做出来就是一个 15 厘米见方的小盒子加一个小测试台成本控制在两百块以内但能测出来的东西和工业测功机原理上完全一致。1.3 这个方案解决了什么问题我自己的体会是市面上的功率计和电参数测量仪很多但真正把“输入功率”和“输出机械功率”放在一起对比的系统很少。要么是纯测电参数告诉你有功功率、功率因数但不告诉你电机轴端到底出了多大力要么是纯测转速转速再高也不能代表出力大。能量转化追踪器把两边打通了所以它的意义不是做一个测量仪表而是做一个“效率认知工具”。尤其在教学场景学生第一次看到“输入功率 12W、输出功率只有 7.2W、效率 60%”的时候那种震撼是看公式背不出来的。它会逼着学生去思考剩下 4.8W 去哪了答案有铜损、铁损、摩擦损耗、风阻损耗。然后我们再改变负载、改变电压损耗比例会跟着变这就是工程优化的起点。2. 核心硬件选型与搭建细节2.1 传感器怎么选INA219、HX711、槽型光耦的组合逻辑硬件选型这条路上我踩过不少坑第一个教训就是不要用 ACS712 测电流。ACS712 是霍尔型电流传感器优点是隔离、能测大电流但输出模拟电压信号零点偏置有误差即使调零后精度也就是几十毫安级别对于几十瓦的小电机来说这个误差直接就把效率算歪了。换成 INA219 之后就舒服多了。INA219 内部自带 12 位 ADC 和精密分流电阻走 I2C 接口不仅能同时读电压和电流还能直接读出功率值。市面上常见的模块板载 0.1Ω 分流电阻量程是 ±3.2A对空载电流几百毫安、堵转电流两三安的直流减速电机来说刚好合适。我用的 INA219 模块默认 I2C 地址是 0x40焊盘上可以改 A0、A1 地址位几个电机同时测时很方便扩展。扭矩测量环节用的是 HX711 加称重传感器。HX711 是 24 位高精度 ADC专门为桥式传感器设计的带内部低噪声放大器增益 128 倍时精度非常高。称重传感器选量程 1kg 的悬臂梁式传感器就行太大的量程会导致小拉力时分辨率不够。我把传感器的一端固定在台架底座上另一端通过一根螺杆连接绕线。转速测量用槽型光耦加码盘这个方案比霍尔测速稳。霍尔传感器受磁铁安装偏心影响很大稍不注意脉冲间隔就不均匀。光耦对射方案只要码盘孔间距均匀、位置合适输出波形就很干净。我用的码盘是 20 孔在 3D 打印机上打的配合 LM393 比较器模块输出方波信号单片机外部中断直接计数。2.2 机械测试台架让电机“干活”的同时把力传出来测试台架的搭建是整个项目里最容易被低估的部分但恰恰是它决定了数据靠不靠谱。很多新手一上来就用电工胶布把电机缠在桌腿上电机一转带着传感器乱飞数据自然一塌糊涂。我建议用一块 10mm 厚的亚克力板或木板做底座尺寸大概 25cm×15cm。电机用一个简单的金属抱箍固定在底座一端电机轴水平向外。轴端安装一个同步轮或者定制圆盘作为绕线轮这个轮子的半径是整个扭矩计算的关键参数必须用游标卡尺精确测量比如我用的轮子直径是 40.00mm那么半径就是 0.02m。绕线轮上绕一圈细尼龙线线的一端固定在轮子上另一端垂直向下连接称重传感器的挂钩。为了让负载可调我在称重传感器的受力端下方挂一个小托盘可以在里面加砝码或者直接用螺栓调压。当电机旋转时尼龙线被缠紧对传感器产生一个稳定的拉力这时传感器测到的力就是电机通过轮缘克服负载的切向力。用这个力乘以轮子的半径就是电机轴上的负载转矩。注意一个问题电机正转时尼龙线会越缠越多几秒后线缠完了实验也结束了。所以我实际做的时候让电机带动一个摩擦装置而不是用线拉固定砝码。更省事的办法是把尼龙线换成一根橡皮筋并且在电机转动时用手动刹车片给轮子施加可变阻力——总之核心目标就是让轮子有一个稳定的阻力矩同时测出这个阻力矩对应的切向力。如果想让整个过程自动化还可以用电磁制动器或涡流制动器但手动刹车片加砝码标定已经足够做教学演示了。2.3 供电与接线稳定电压是效率数据的生命线接线图其实很简单电源正极接 INA219 模块的 VINVIN- 接电机正极电机的负极回到电源负极。HX711 和 OLED 都挂在 5V 和 I2C 总线上。ESP32或 Arduino Uno统一供电用充电宝或者 12V 电源适配器都行。但我强烈建议直流电源部分用一个可调稳压电源板或者降压模块供电电压从 3V 到 12V 可调这样你可以直观看到同一电机在不同电压下的效率差异。电压高的时候铁损占比增大电压低的时候铜损占比增大中间总有一个甜点电压。这里面有个隐藏坑如果用 PWM 调速而不是调电压电机的输入电压波形是斩波方波INA219 对高频电流的响应可能不太准读数跳动会很大。所以做效率测量时我用的是线性调压而不是 PWM 调速这是很多 DIY 项目里不会提醒你的事。3. 软件实现与核心算法把四个数据流变成一条效率曲线3.1 数据采集框架三个线程各干各的软件部分用 C 写平台用 Arduino IDE主控我推荐 ESP32原因就一个双核。一个核专门跑传感器采集一个核跑显示和算法互不干扰。程序核心框架大概是这样#include Wire.h #include Adafruit_INA219.h #include HX711.h #include U8g2lib.h Adafruit_INA219 ina219; HX711 scale; U8G2_SSD1306_128X64_NONAME_F_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE); volatile unsigned long pulseCount 0; unsigned long lastTime 0; float rpm 0; const float RADIUS 0.02; // 绕线轮半径单位米 const int HOLES 20; // 码盘孔数 void IRAM_ATTR onPulse() { pulseCount; } void setup() { Serial.begin(115200); Wire.begin(); ina219.begin(); scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN); scale.set_scale(calibrationFactor); scale.tare(); oled.begin(); pinMode(PULSE_PIN, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(PULSE_PIN), onPulse, FALLING); } void loop() { // 核心计算在 loop 中完成 unsigned long now millis(); float voltage ina219.getBusVoltage_V(); float current ina219.getCurrent_mA() / 1000.0; float powerIn voltage * current; // 每 500ms 计算一次转速 if (now - lastTime 500) { float cnt pulseCount; pulseCount 0; rpm cnt * 60.0 / (HOLES * ((now - lastTime) / 1000.0)); lastTime now; } float omega 2 * PI * rpm / 60.0; float forceN scale.get_units() * 9.8 / 1000.0; // 假设传感器输出克转换为牛 float torque forceN * RADIUS; float powerOut torque * omega; float efficiency (powerIn 0) ? (powerOut / powerIn) * 100.0 : 0; // 显示与串口输出 oledPrint(voltage, current, rpm, torque, powerIn, powerOut, efficiency); Serial.print(rpm); Serial.print(,); Serial.print(torque); Serial.print(,); Serial.print(powerIn); Serial.print(,); Serial.print(powerOut); Serial.print(,); Serial.println(efficiency); }3.2 转速计算的细节脉冲计数为什么不能直接用转速计算看起来很简单数脉冲除以孔数再除以时间。但这里有一个大坑直接读取 pulseCount 再清零会丢脉冲。因为中断随时可能发生你在 main loop 里读变量时刚好来了一个中断这个中断会在你清零之后加 1于是这个脉冲被算进了下一个周期。虽然单个脉冲影响不大但当转速高到每秒几千个脉冲时误差就明显了。解决方法是禁用中断后再清零noInterrupts(); cnt pulseCount; pulseCount 0; interrupts();或者更优雅一点不做清零而是在中断服务函数里累计到一个数组主循环里取差值。我的代码里用 noInterrupts/interrupts 包裹读和清零实测在最高转速 3000 RPM每秒 1000 个脉冲时转速波动能控制在 ±2% 以内。另一个坑是时间基准。millis() 的精度对普通场景够用但如果你电脑端要用采集的数据做效率曲线拟合最好用 micros() 计算精确时间或者用 ESP32 的 esp_timer_get_time()它的微秒级精度能保证转速不会因为系统任务调度而抖动。3.3 效率计算的平滑与校准数据好看但可信很多人在这一步容易陷入一个执念把所有数据显示在屏幕上波动很大于是加了一堆滤波最后曲线平滑得可疑。我的建议是区分处理电流、力这种带噪声的信号做滑动平均是必要的但效率值不建议在屏幕上实时平滑太多因为效率的波动本身就包含有用信息比如扭矩波动会导致效率波动这在分析负载突变时非常关键。实际操作时我保持了一个长度为 20 的环形缓冲区对输入功率、输出功率分别做滑动平均然后用两个平均值算效率。这样可以避免“除法放大了噪声”的问题。我的经验公式是[ \eta_{smooth} \frac{\overline{P_{out}}}{\overline{P_{in}}} \times 100% ]先平均再相除而不是对每一组 (P_{out}/P_{in}) 求平均后者的误差会大很多因为电流小时微小扰动对效率比值的影响呈指数级放大。我这里还加了一个功能自动寻找最高效率点。每采集一组数据就把当前效率值和之前记录的最大值比较如果当前更高就把当前的电压、电流、转速、扭矩、效率存到全局变量里。OLED 屏幕上会显示一个“MAX η”的值。这在演示时非常出效果——你缓慢增加负载屏幕上的 MAX η 会一段一段往上跳最后稳定在一个值观众一下就理解了“追踪”的含义。4. 标定与误差控制4.1 称重传感器的标定流程HX711 和称重传感器模块出厂后都有标定系数但这个系数到了你的台架上往往不太准因为机械安装的角度、传感器受力方向、线材的弹性都会影响读数。你必须做一次现场标定。标定方法是在传感器挂钩上依次挂 0g、100g、200g、500g、1000g 的标准砝码用 HX711 示例代码读取原始读数然后算出线性系数。HX711 库的 set_scale() 参数其实就是读数除以质量值。我实际标定时发现我的传感器从 0 到 1000g 的线性度非常好R² 超过 0.999说明这个方案的精度瓶颈不在传感器而在机械安装误差。但有一个细节容易忽略传感器的零点会随温度漂移。实验开始时 ture 一下但如果实验持续半小时电机发热传导到台架传感器零点可能会漂移几十克。我后来在台架和电机之间垫了一块隔热垫同时在程序里每 30 秒自动做一次零点修正——前提是确认电机在转此时力不为零不能乱修正。所以我干脆改成了实验开始前固定 tare实验过程中不再动零点。4.2 转速基准怎么校准码盘孔数标称 20 个但如果你买的码盘或自己打印的码盘孔有一个轻微堵塞或边缘毛刺脉冲周期就会不均匀高速时转速数值会周期性跳动。我用示波器看过 LM393 模块的输出波形当码盘安装偏心时脉冲宽度会呈现正弦式调制。解决方法是换中心孔更大的码盘或者用联轴器连接而不是直接插在电机轴上。更严谨的做法是拿一个光电转速表或者手机慢动作视频来验证你的转速读数。手机拍电机轴上的码盘逐帧数一圈用了多少帧然后换算成 RPM。实测下来只要码盘孔均匀我们的脉冲计速法和视频帧测速法的偏差在 1% 以内完全够用。4.3 误差来源主次排序别把锅都甩给传感器做过几次实验后我发现整个系统误差来源的排序大致是机械安装偏心 负载波动 电流噪声 力传感器零点漂移 码盘误差。很多人一上来就纠结 INA219 的精度够不够其实根本轮不到它。我举个例子如果绕线轮的半径量错 1mm直径 40mm 的量成 39mm扭矩就直接偏 2.5%效率也跟着偏 2.5%。而 INA219 的电流测量误差通常小于 1%。所以花两分钟用游标卡尺精确量半径比花两百块买更贵的电流传感器有用得多。负载波动是另一个大头。手动刹车负载时手稍微抖一下力传感器的读数就能波动 10% 以上效率曲线瞬间变成了锯齿。所以做精准测量时我用电磁制动器或者砝码加载避免手直接施力。5. 实测案例与常见问题排查5.1 一次完整的测量过程复盘我自己用这个追踪器测了一个 37GB 型号的直流减速电机额定 12V空载电流约 150mA得到的效率数据非常典型。空载时输入功率 12V × 0.15A 1.8W输出机械功率约 0W效率 0%。但因为有空载损耗电流并不是 0。随着逐步增加负载通过手动刹车增大阻力输入功率上升输出功率也上升效率快速爬升。当扭矩加到大约 0.05 N·m 时效率达到峰值约 68%。再继续增加负载电机转速明显下降虽然扭矩还在增大但输出功率增长变缓输入功率却因为电流飙升而快速上升效率开始下滑。最后接近堵转时效率掉到 10% 以下甚至趋近于 0。把这条效率曲线画出来就是一个单峰曲线峰值点就是这台电机的“最佳工作点”。这个实验给学生演示完后他们一下子就理解了为什么电机不能随便选、不能让它长期工作在过载区——不仅发热严重效率反而低得可怜。5.2 典型问题速查表我把做这个项目时踩过最典型的坑整理成了表格后续你复现时可以直接对照排查。现象可能原因排查方向电流读数始终为 0INA219 分流电阻烧断或 VIN- 接线松用万用表量分流电阻两端电压检查接线顺序转速读数跳变、→ 0 → 最大值码盘安装松动或光耦模块灵敏度低重新固定码盘调电位器改变光耦阈值效率超过 100%输入功率测量滞后于输出功率检查电流采样是否平均改用滑动平均后再算效率力传感器读数负数传感器受力方向装反或接线反调换 HX711 的激励线或改程序里 forceN 的符号堵转时电流显示只有 1A实际万用表 2AINA219 模块量程限制或电源限流确认分流电阻换大电流量程的 INA226OLED 显示正常但串口无数据电脑端波特率不匹配统一 115200检查串口助手设置电机发热后效率越来越低铜损随温度升高这是真实物理现象不是故障记录温度做参考5.3 两个容易忽略但很出效果的小功能第一个是“能量累计”功能。程序里每秒算一次输入功率和输出功率把这些值累加屏幕上可以显示从开机到现在一共消耗了多少焦耳电能、输出了多少焦耳机械能。这个功能对理解“能量守恒”特别有帮助累加的输入能量和输出能量之差就是损耗掉的热能你可以让学生摸一摸电机外壳让他们亲手感受那些“消失的能量”去哪了。第二个是串口绘图功能。我用了 Arduino 的串口绘图器或者电脑端的 Serial Plotter数据实时画成波形效率曲线像一座山丘一样在屏幕上隆起。学生看到效率“爬坡-登顶-下降”的过程效果比任何 PPT 都直观。做上位机的话用 Python pyserial 把 CSV 记录下来再用 matplotlib 画效率云图——在横轴放转速、纵轴放扭矩、颜色表示效率就能得到一张完整的电机效率 MAP 图。这个 MAP 图在工业界是电机选型的重要依据自己做出来相当有成就感。另外一个扩展方向是把它改成太阳能板的能量转化追踪器太阳能板输出侧用 INA219 测电功率板子前面放一个光照传感器和一个可调角度转台程序不断扫描倾角寻找“当前光照下最大输出功率点”。这就是简化版的 MPPT最大功率点追踪原理和电机效率追踪一模一样——都是在一个单峰曲线上爬山找最高点。如果你把“输入”换成光能“输出”换成电能整套系统的代码结构基本可以复用。这也是能量转化追踪器最迷人的地方它测的不只是一个数而是整个能量系统的“健康状况”。从我个人经验来说这个项目的价值不在于它用了多高级的传感器而在于它把一个看不见摸不着的概念——效率变成了一个可以实时观察、数据可复现、结论可验证的东西。你得亲手做完一遍才会真正理解为什么电机要选型号、为什么负载要匹配、为什么那些“热得烫手”的能量不是凭空消失只是变成了另一种形态。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价