机器人自供电:能量采集与低功耗电源管理实战 Rodeo 项目的核心并不是做一个看起来酷的机器人而是解决移动机器人项目里最容易被低估的问题供电。机器人一旦依赖锂电池续航就被电池容量锁死充电必须有人介入环境温度一变可用电量还会继续缩水。Rodeo 的思路是把供电从“一次性储能”变成“持续采集 精打细算”让机器人通过太阳能等环境能量自己“挣”电在能量净入大于等于净出的前提下把任务跑完。“自己挣电”不是永动机概念而是能量采集、储能、任务调度三件事的闭环配合。这句话展开之后涉及光伏板选型、电源管理芯片、低压保护、功耗测量、状态机设计和能量预算计算。这篇文章会把 Rodeo 原型项目拆开讲从硬件架构到电源管理固件再到实测验证和常见问题排查给出一条能落地的实现路径。1. 先想清楚“机器人自挣电力”到底在解决什么问题1.1 “挣电”不是科幻概念而是让平均功耗低于平均产能大部分移动机器人项目对功耗的思考方式是这样的选一块足够大的锂电池按“整机最大电流 × 预计工作时间”估算容量然后让电池背上整个系统的供电压力。结果往往有几种情况电池体积变大、充电频次变高、电量显示误差变大室外项目还会出现“低温掉电”“早上满电下午没电”的现象。Rodeo 想解决的问题是把“电从哪来”从一次性消耗改成持续供给。机器人在户外活动时身上背着一块光伏板阳光把光能转换成电能经过电源管理芯片升压或降压后一部分直接供系统使用一部分存进锂电池。只要一天内采集到的总能量不低于系统一天内消耗的总能量机器人就不需要人工充电这里的关键指标是平均功耗而不是峰值功耗。这句话很容易被误解成“光伏板功率大于机器人功率就行”。实际计算时要看的是全天能量一块 1W 光伏板晴天等效日照时长按 3 到 4 小时算一天大约能产出 3 到 4Wh按 70% 的转换和储能效率折算约 2 到 3Wh 能用。这些能量平均到 24 小时只有 0.1W 左右的平均功率。如果机器人工作时峰值达到 1.5W空闲时 0.003W那只能通过降低工作占空比来把全天平均值压到 0.1W 以下。Rodeo 的电源管理固件就是围绕这个目标来设计的。1.2 能量中性运行的四个维度采集、存储、调度、保护实现能量中性运行不能只靠一块光伏板。整个系统要同时处理四个问题缺一个环节闭环就跑不起来。采集指把环境中的太阳能、动能、热能转换为电能。Rodeo 原型使用光伏板因为光伏板在户外场景最可控电压和功率规格也容易匹配。采集系统的关键不是光伏板本身而是后级电源管理芯片是否能在弱光条件下仍然工作并把电压抬升到能充电的水平。存储指用电池或超级电容把多余能量存起来。电池负责平滑光照波动白天有阳光时充电晚上或阴天时放电。存储系统的关键不是容量越大越好而是充放电管理、过放保护和温度补偿是否完善。调度指机器人根据当前电量决定做什么。电量充足时可以执行巡逻、采集数据、移动电量低时自动降低工作频率进入深度睡眠或者只维持最小任务。调度的本质是把“可用能量”当成一种预算用任务优先级的思路去分配。保护指硬件电路和固件要防止电池过放、防止 PMIC 异常锁死、防止反复上电下电对系统造成损伤。保护逻辑看起来不产生能量但能决定系统能撑多久。这四个维度共同决定机器人能否在无人干预的情况下连续运行三天以上。只堆光伏板容量、不写调度逻辑的系统很可能一天就进入欠压死循环。1.3 Rodeo 的工作周期工作、采集、充电、巡航Rodeo 的工作周期可以简化为四个阶段。工作阶段电机、传感器、MCU 和无线模块同时工作电流最大耗时最短。采集阶段机器人停在光照较好的位置系统进入轻负载状态光伏板给电池充电。充电阶段电池电压达到高位后系统停止大功率任务让电池在低负载下浮充。巡航阶段系统进入深度睡眠仅保留定时器或外部中断唤醒能力功耗降到微安级。这个周期设计的核心是让高功耗阶段尽量短让低功耗阶段尽量长。Rodeo 固件里会有一个状态机来处理这四个阶段的切换。每个状态切换都依赖当前电池电压、光伏板输出电压、任务队列和上一个状态维持时间而不是简单定时轮询。2. 硬件选型要围绕能量闭环不是堆性能2.1 能量采集模块把太阳能或其他环境能量变成可用电流光伏板不是直接接到电池上的。太阳能板的输出电压会随光照强度变化弱光时可能只有 1V 甚至更低而锂电池充电需要 3V 到 4.2V 电压区间。中间必须有一个能量采集 PMIC 负责升压、MPPT 跟踪和充电管理。Rodeo 原型可以选择 TI 的 BQ25570 或类似器件它们专门为几十毫瓦到几瓦级的能量采集场景设计。BQ25570 支持 100mV 到 5V 的冷启动输入能把弱光条件下光伏板的低电压抬升到可充电范围内部还带有最大功率点跟踪电路和可配置的最小电压保护。另一类方案是 e-peas 的 AEM10941优点是静态功耗低、支持更多采集源适合微小能量场景。这里要特别注意一个常见误区光伏板参数只决定“最大能采多少”PMIC 参数才决定“实际能用多少”。PMIC 的 MPPT 参考电压需要根据光伏板的最大功率点电压来配置。一块标称 6V/1W 的光伏板最大功率点电压可能在 5V 到 5.5V 之间如果 MPPT 参考电压设得偏离太多实际采集功率会明显下降。构建模块时的选型参考如下部件选型方向关键参数说明光伏板6V/1W 多晶硅户外型开路电压、短路电流、最大功率点电压面积和重量决定安装方式能量采集 PMICBQ25570 或 AEM10941冷启动电压、静态功耗、MPPT 参考电压弱光能力是关键电池18650 锂离子 2600mAh标称 3.7V截止电压 3.0V容量需要按日能量预算反推主控nRF52840 或类似低功耗 MCU待机电流、工作电流、ADC 精度不建议在原型里用高功耗开发板电机驱动DRV8220 或 L9110S导通压降、待机电流电机启动瞬间电流大需要留余量电流采样INA219 或 MCU 内部 ADC量程、采样电阻温漂电机峰值电流要低于采样量程2.2 储能、电池管理与低压关断锂电池的充电截止电压是 4.2V放电保护点一般在 2.8V 到 3.0V。能量采集场景不能依赖锂电池保护板上的故障触发因为保护板一旦进入过放保护状态需要充电电压才能恢复此时光伏板在阴天可能根本无法提供足够电流。固件需要在电池电压进入低阈值之前就主动降低功耗尽量不触发保护板。Rodeo 的储能方案可以这样设计PMIC 负责充电MCU 通过 ADC 周期采集电池电压当电压低于 3.2V 时进入低功耗巡航模式只保留小时级唤醒当电压低于 3.0V 时只允许系统执行“等待充电”的最小逻辑。这个边界设得比保护板保护点高 0.2V 左右目的是给 PMIC 和 MCU 留出反应余量。此外电池温度会影响充电效率。锂电池在低温环境下充电能力下降如果让光伏板在接近 0 摄氏度的环境下强行大电流充电可能造成电池内阻升高或保护板误动作。室外机器人如果要在冬天运行需要加温度采样电阻或使用带温度引脚的保护方案。2.3 主控与负载的功耗预算分配主控选型不要追求性能。Rodeo 原型里需要处理的任务包括电机控制、传感器读取、电池电压采样、简单无线通信。一块低功耗 MCU 就足够不需要跑 Linux。系统总功耗由四个部分构成主控、传感器、电机驱动、无线模块。电机启动时瞬时电流最大占空比任务中占的比重反而小主控在空闲时如果不停轮询传感器平均功耗会非常高无线模块发送一帧数据时电流会有几十毫安峰值但发送时间只有几十毫秒关键要把持续时间控制住。一个典型的功耗开销表格如下模块工作模式电流空闲模式电流出现时机对系统的影响MCU运行约 5mA射频发送约 5mA深度睡眠约 2uA始终存在决定待机功耗传感器采样时 1mA持续 50ms关闭时 0.5uA周期唤醒用软开关控制供电电机驱动启动瞬时 1.5A运行 0.5A待机约 1uA 到 5uA工作阶段应限制单次运行时间无线模块发送峰值 40mA深度睡眠 1uA上报数据时减少发送频次比调功率更有效这些数字是用于估算的量级不构成选型依据实际需要以数据手册为准。重点是理解功耗结构待机功耗要尽可能压到微安级工作功耗只允许在短时间任务中出现。3. 电源管理固件把“能采集多少”和“该做多少”连起来3.1 电源状态机从深度睡眠到工作再到深度睡眠Rodeo 的电源管理固件不需要复杂操作系统用状态机就够了。状态分为 5 个BOOT上电初始化读取电池电压和任务配置。CRUISE深度睡眠系统只保留唤醒定时器。WORK执行电机、传感器、通信等任务。CHARGE_WAIT等待 PMIC 充电完成或电压回升。FAULT电压异常、传感器异常时进入保护状态。状态切换逻辑可以概括为typedef enum { PWR_BOOT, PWR_CRUISE, PWR_WORK, PWR_CHARGE_WAIT, PWR_FAULT } pwr_state_t; pwr_state_t pwr_state PWR_BOOT; void pwr_loop(void) { uint16_t vbatt_mv adc_read_battery_mv(); int16_t charge_ma pmic_read_charge_current_ma(); switch (pwr_state) { case PWR_BOOT: if (vbatt_mv PWR_MIN_WORK_MV) { pwr_state PWR_WORK; } else { pwr_state PWR_CRUISE; } break; case PWR_CRUISE: if (vbatt_mv PWR_MIN_WORK_MV) { pwr_state PWR_WORK; } break; case PWR_WORK: if (vbatt_mv PWR_MIN_WORK_MV) { pwr_state PWR_CHARGE_WAIT; } else if (task_need_sleep()) { pwr_state PWR_CRUISE; } break; case PWR_CHARGE_WAIT: if (vbatt_mv PWR_RECOVER_MV charge_ma 0) { pwr_state PWR_WORK; } else { pwr_state PWR_CRUISE; } break; case PWR_FAULT: pwr_state PWR_CRUISE; break; } }关键点在于 PWR_MIN_WORK_MV 和 PWR_RECOVER_MV 不能是同一个值。假设 PWR_MIN_WORK_MV 为 3200mVPWR_RECOVER_MV 为 3400mV中间保留 200mV 迟滞可以防止机器人在临界电压附近反复唤醒和睡下。3.2 用 INA219 或 ADC 实时测量电池与光伏电源状态机需要知道两件事电池电量还剩多少光伏板当前采集到多少。电池电压通过主控 ADC 分压采样即可但要注意锂电池电压和剩余电量不是线性关系电压只能作为粗略判断。更可靠的做法是同时测量电流通过积分的安时数来估算剩余能量。INA219 是常见的电流电压采样芯片I2C 接口量程可配置。在 Rodeo 里可以分两路采样一路放在电池回路用于判断总储能变化另一路放在光伏板输入侧用于判断采集功率。后一路不是必须的但能帮助定位“有光却没有电进电池”的问题。读取 INA219 的基本流程float ina219_read_current_ma(uint8_t addr) { uint16_t reg i2c_read_reg(addr, INA219_REG_CURRENT); int16_t signed_val (int16_t)reg; return signed_val * ina219_current_lsb_ma; } float ina219_read_voltage_v(uint8_t addr) { uint16_t reg i2c_read_reg(addr, INA219_REG_BUS_VOLTAGE); return (reg 3) * 0.004f; }测量数据要加滤波和异常判定。光伏板在弱光下电流可能接近 0属于正常现象但如果电池电压持续下降且电流读数始终为 0就要检查采样芯片地址、量程配置和电池回路是否断开。电流采样还有一个常见问题电机启动瞬间电流可能是运行电流的 3 倍以上。如果 INA219 配置成 ±400mA 量程电机一启动就会溢出读到的数据变成负值或最大值。需要在电机供电回路单独配置高量程采样或者在采样代码里识别溢出标志。3.3 能量感知调度器先看收益再决定任务能量感知调度的目标不是让每个任务都执行完而是在有限能量里选高收益任务。比如“上报土壤湿度”比“移动 10 米”更重要因为前者只消耗无线模块的瞬时功耗后者需要电机持续运行。调度器在每次进入 WORK 状态前计算预计能耗#define TASK_UPLOAD_MA 80 #define TASK_UPLOAD_MS 200 #define TASK_MOVE_MA 800 #define TASK_MOVE_MS 4000 uint32_t task_estimate_energy_ua_ms(task_id_t task) { switch (task) { case TASK_UPLOAD: return TASK_UPLOAD_MA * 1000 * TASK_UPLOAD_MS; // 80mA*200ms case TASK_MOVE: return TASK_MOVE_MA * 1000 * TASK_MOVE_MS; // 800mA*4000ms default: return 0; } } int task_can_run(uint16_t vbatt_mv, task_id_t task) { if (vbatt_mv PWR_MIN_WORK_MV) { return 0; } uint32_t energy task_estimate_energy_ua_ms(task); uint32_t budget pwr_available_energy_ua_ms(); return energy budget; }这里的能量预算可以用电池电压估算也可以由安时积分模块提供。实际项目中应该把每个任务的耗时、平均电流和启动峰值电流同时考虑。任务队列中高优先级小能耗任务在前低优先级大能耗任务在后电量紧张时直接丢弃大能耗任务。3.4 低压、恢复与故障恢复逻辑低压保护不是单纯的“检测到低压就关机”。如果系统直接关闭光伏板在弱光下可能无法正常复位 MCU机器人会进入“没电关断、有电重启、重启后立刻没电”的循环。这种循环对 MOSFET、电池和电机驱动都不友好。推荐的做法是分级降级电压低于 3400mV降低任务频率例如原本每 10 分钟醒一次改为每 60 分钟醒一次。电压低于 3200mV只保留传感器采样和日志记录不执行任何移动任务。电压低于 3000mV关闭传感器电源进入最低功耗模式并设置一个长延时唤醒。电压低于 2800mV仅由硬件保护电路接管等待外部充电。固件还要处理“低压锁存”问题。如果系统刚启动时电压低于工作阈值但光伏板有输出应该让 MCU 进入低功耗状态而不是反复重启。可以在 BOOT 阶段先等待几百毫秒稳定读取几次电压再决定是否进入正常流程。4. 算一笔能量账从 1W 光伏板到一次完整日出循环4.1 估算日能量与平均可用功率Rodeo 原型的能量预算可以从光伏板反向推导。假设光伏板标称功率为 1W选择晴天等效日照时长 3.5 小时光伏板日产能量为 3.5Wh。考虑如下损耗光伏板实际粉尘污染和角度偏差约 10% 到 20% 损失。PMIC 转换损耗约 10% 到 15%。电池充放电损耗约 10% 到 20%。电池自放电和低温折损约 5% 到 10%。把各项损失合并可用能量可能只有 2Wh 到 2.5Wh。为了稳妥按 2.2Wh 估算。折合平均功率为 2.2Wh / 24h约 91mW。这意味着整个系统平均功耗必须控制在 90mW 以下才能做到“一天下来电池不降档”。如果系统中电机一次运行 4 秒需要 800mA 电流对应功耗约 2.64W那么每天最多只能运行很有限的时间这个矛盾必须通过工作占空比解决。4.2 工作占空比计算假设系统在工作状态下总电流为 500mA电压 3.3V功耗约 1.65W空闲待机状态下总电流为 1mA电压 3.3V功耗约 3.3mW。设工作占空比为 D则全天平均功耗约为P_avg D * 1.65W (1 - D) * 0.0033W要求 P_avg 不超过 91mW代入计算0.091 D * 1.65 (1 - D) * 0.0033 D ≈ 0.053也就是说一天中只有约 5.3% 的时间可以处于工作状态大约 76 分钟。如果电机实际功耗更高或空闲功耗没有压到毫瓦级以下可工作时间还会继续缩短。这个计算说明了 Rodeo 设计中的两个硬指标空闲功耗必须极低工作任务的单次执行时间必须短。用大电池可以在短时间内掩盖问题但无法解决“每天平均可用能量固定”的根本约束。4.3 实测验证与日志判读理论计算完成后需要用实际运行验证。验证流程可以这样安排把机器人放在光照稳定的环境中记录光伏板开路电压、短路电流和 PMIC 输入电压。电池充满电后设置任务调度器为“每 30 分钟执行一次 5 秒超低功耗点亮 LED”。连续运行 24 小时采集电池电压曲线和任务执行日志。检查 24 小时后的电池电压是否高于起始电压或者至少能维持不变。再增加电机任务逐渐提高工作频率观察电压下降速率。日志记录建议使用简单文本格式主控通过串口输出或者写入片外 Flash[0.0h] vbatt3921mV, vpv0.0V, stateCRUISE [0.5h] vbatt4100mV, vpv5.6V, stateWORK, taskUPLOAD, cost_ms210 [1.0h] vbatt4098mV, vpv5.2V, stateCRUISE观察日志要注意几个关键点电压曲线是否在日出后回升、任务执行后是否很快回落、任务间隔内是不是进入了真正的深度睡眠。很多系统“看起来在空闲”实际上外设不断电、ADC 不停采样、LED 常亮空闲功耗远超预期。5. 常见问题从日志现象反查根因5.1 电池一直充不满或者电压上不去可能原因有光伏板实际输出不足、MPPT 参考电压配置错误、PMIC 充电电流被限制、电池本身老化或内阻过高。检查顺序先看光伏板在阳光下接上 PMIC 后的输入电压和输入电流确认光伏板是否输出正常再查 PMIC 数据手册确认充电电流设置电阻和 MPPT 参考电压匹配然后用万用表测量电池两端电压排除连接线接触电阻问题。解决方式是把充电过程拆成“输入是否有电、PMIC 是否工作、电池是否收电”三段分别验证。常见问题是光伏板标称 1W但实际带着窗帘或玻璃遮挡时只有 100mW 输出导致一天下来只能充入很少电量。5.2 有阳光但采集停止PMIC 没有输出这类问题通常表现为光伏板电压有 5V 以上PMIC 输入正常但输出端一直没有电压。可能原因包括 PMIC 进入欠压锁存、使能引脚被拉低、输出电容配置不当、冷启动条件未满足。很多 PMIC 在首次上电时需要一个最小冷启动电压和最小输入功率弱光条件下输入内阻大即使电压看起来足够也无法完成冷启动。检查方式查看 PMIC 芯片的 VIN、VOUT、VSTOR 和使能引脚电压对比数据手册中的冷启动条件。如果确认是弱光启动问题可以在 PMIC 输入侧加一个少量储能电容或者调整光伏板安装角度让早晨弱光阶段也能积累足够的启动能量。5.3 机器人反复重启、调度器频繁翻转这个现象往往不是电池没电而是电压阈值缺少迟滞。系统从 CRUISE 醒来后电池电压在 PV 采集和电机工作的共同作用下出现短时跌落MCU 检测到低于阈值就立刻切回睡眠睡眠后电压回升又被唤醒形成“睡 1 秒、醒 1 次”的抖动。解决方式有两步。第一增加电压迟滞将唤醒阈值设置为 3400mV睡眠阈值设为 3200mV。第二在状态切换前加入稳定时间连续读取 3 次电压都满足条件才允许切换状态。uint8_t pwr_check_voltage_stable(uint16_t *stable_mv) { uint16_t v1 adc_read_battery_mv(); delay_ms(50); uint16_t v2 adc_read_battery_mv(); delay_ms(50); uint16_t v3 adc_read_battery_mv(); *stable_mv v2; return (v1 3000 v2 3000 v3 3000); }5.4 日志时间漂移能量统计失真低功耗 MCU 的定时器在深度睡眠期间可能停止运行醒来后用内部低速时钟计时会导致时间不准。如果调度器根据“当前时间”决定任务频率时间漂移会让任务执行得比预期频繁最终多消耗能量。解决办法是使用独立的 RTC 芯片或者在每次唤醒后用射频模块的授时信息校准系统时间。日志中记录时间戳时要区分“实际运行时长”和“墙钟时间”避免用相对计时去替代绝对时间。6. 从原型走向长期运行生产环境必须补齐的东西6.1 学习环境与长期运行环境的差异实验台上跑通的系统放到户外长期运行会暴露出一批新问题。实验台环境光照稳定、温度稳定、电池充满后立即充电户外环境会出现季节变化、天气变化、灰尘覆盖、连续阴雨、低温、高温。这些因素都会直接改变能量采集结果。生产环境至少还要考虑四件事日志外置化不能只通过串口看日志要存到 SD 卡、Flash 或远程上报。远程监控低电量、任务失败、传感器异常应能生成告警否则长期无人值守时故障无法发现。参数可配置任务频率、电压阈值、唤醒周期可以远程调整避免每次修改都重新刷固件。回滚机制固件 OTA 升级失败后机器人要能回到上一个可用版本否则变砖后在户外很难恢复。6.2 发布前检查清单可以将下面的清单固化到项目文档中每次发布前逐项检查光伏板最大功率点电压和 PMIC MPPT 配置是否一致。电池最低保护电压是否高于硬件保护板阈值。状态机中是否包含电压迟滞和稳定时间判断。所有外设在空闲时是否真正断电。电机启动峰值电流是否在采样量程和电源负载范围内。低电量时任务优先级是否生效大功耗任务是否能被丢弃。日志是否记录电池电压、光伏输入、状态切换和任务耗时。温度变化下电池充电策略是否调整。固件是否具备远程参数修改和回滚能力。是否完成至少 24 小时连续运行验证。6.3 可以继续扩展的三个方向第一个方向是增加动能采集或温差采集与太阳能形成互补。机器人在运动时轮子转动可以带动微型发电机把一部分机械能回收在室内或无阳光场景温差或射频能量采集可以作为辅助输入。第二个方向是引入更细粒度的能耗模型。把电机的运动轨迹、无线发送的重传次数、传感器的采样精度都纳入能耗估算让调度器在运行过程中动态调整任务顺序而不是使用固定的任务成本表。第三个方向是让多个机器人组成能量互助网络。某个机器人电量低时可以移动到阳光更好的位置充电或者通过无线充电方式从电量充足的同伴那里获得能量。这本质上把单体能量闭环拓展成群体能量闭环适合巡逻、农业、仓储等成组部署场景。Rodeo 这个项目的价值不在于光伏板选得多好、电池容量多大而在于它把“供电”从被动约束变成了主动设计。只要能坚持用平均功耗去衡量任务用能量闭环去约束硬件选型和固件逻辑机器人就能在很少人工干预的情况下持续工作。对刚接触能量采集机器人的人来说建议先用一块低功耗开发板、一块小光伏板和一个 PMIC 评估板跑通状态机再逐步加入电机、传感器和无线上报这样每一步的问题都可以定位到具体模块。