元器件 · 电源

机器人电池与电源包

如何给小车供电:为什么 9V 方块电池一带电机电压就下跌、AA 和 18650 电池组怎么选,以及怎样不让电机和逻辑电源把控制板拖复位。

它是什么

电源包是新手想得最少、错得最多的部分。就是给电机和电路供电流的电池——但选错了代码再好车也抽搐、复位、不动。供电做对经常是跑起来的车和反复重启的车的区别。

关键是车有两种很不同的电流胃口:电机阵发大口吃,逻辑细水长流。一包电池能喂两个,但要安排得贪吃的电机饿不着敏感的大脑。

供电分配图:两节电池包经红色 Vin 线给带鳍片散热的 L298N 电机驱动板供电;驱动带两个电机;稳压 5 伏线给 Arduino 板供电,Arduino 回四根 PWM 和方向信号线给驱动;底部共地总线连起电池、驱动和 Arduino。
一包两轨:电机经驱动吃大电流,Arduino 跑稳定稳压 5 V,所有部件共地。 下载 SVG

工作原理

顺着电流从电池包走:

  1. 电池出原始电压——4 节 AA 6 V,2 节 18650 7.4 V。
  2. 电机轨从电池包直进 L298N 驱动 Vin。大而冲击的电机电流走这里——完全不经过 Arduino。
  3. 逻辑轨是稳压 5 V(驱动板载稳压或 USB),给 Arduino 和传感器干净稳定的电压。
  4. 共地把一切连起来。每一路电源都必须共用同一条地线,否则逻辑信号没有共同的参考电位,读数就变得毫无意义。

这样分开,电机突然吃一安拉塌自己的轨,拖不下 Arduino 的 5 V。

为什么 9 V 方块不行

最常见的第一台车错误,是用矩形 9 V PP3 电池给电机供电。看着方便,但它储能很少、内阻很高。电机一取电流,它的电压立刻塌下去——Arduino 跌破最低工作电压而复位,于是小车一顿一顿地重启、循环往复。9 V 块电池用来给只喝毫安电流的面包板供电没问题,但凡是带轮子的活,它都是错误选择。

选择与接线

  • **电压配电机。**3–6 V 电机在 6 V 或 7.4 V 包上都欢;速度用 PWM 驯,别欠压电池包。
  • **容量是续航。**mAh 大充一次跑更久;18650 比 AA 耐得多,要带保护的电池座。
  • **一开关,极性对。**电池包上加一个总开关,首次上电前把极性核对两遍——反接的代价是瞬间烧板。
  • **别倒灌。**除非板子本来就为此设计,否则别同时用 USB 和电池给 Arduino 供电。
  • 加大容量电容并在电机电源上,用来吸收启动冲击、稳定电源轨。

内阻:决定一切的数

每块电池的行为都像是一个串了电阻的理想电压源。这个电阻,就是为什么一包电池能跑而另一包让你板子复位的全部原因。

V_under_load = V_open_circuit - (I x R_internal)

2 A 冲击过 0.5 Ω 内阻的包,下游看到之前先丢一整伏。常见选项对照:

电池包 标称 典型内阻 2 A 时压降 结论
9 V PP3 碱性 9 V 1.5–3 Ω 3–6 V 带电机没法用
4×AA 碱性 6 V 0.6–1.2 Ω 1.2–2.4 V 勉强,很快虚
4×AA 镍氢 4.8 V 0.1–0.2 Ω 0.2–0.4 V 好,但电压低
6×AA 镍氢 7.2 V 0.15–0.3 Ω 0.3–0.6 V 扎实的选择
2×18650 锂离子 7.4 V 0.05–0.15 Ω 0.1–0.3 V 极好
2S 锂聚合物 7.4 V 0.02–0.05 Ω 不到 0.1 V 最好,只是要小心操作

这张表把 9 V 块电池解释得再清楚不过。问题不在电压错——它的电压是全表最高的。问题在于 2 A 的冲击电流下它只能给出 3 V,于是小车复位。搁在货架上的电压什么都说明不了;带载时的压降说明一切。

两分钟量你自己的

1. Measure the pack's voltage with nothing connected.       -> V_open
2. Stall the motors and measure again while stalled.        -> V_load
3. Measure the stall current with the meter in series.      -> I
4. R_internal = (V_open - V_load) / I

记号笔写包上。内阻随电芯老化涨,翻倍的包就是“随机”复位的包。

电流预算

买之前先在纸上算一遍。用堵转电流,不用典型值。

设备 典型 峰值 / 堵转
Arduino Uno 45 mA 50 mA
ESP32(Wi-Fi 开) 80 mA 阵发 500 mA
TT 减速电机 ×2 300 mA 2 A
N20 金属减速电机 ×2 200 mA 1.6 A
SG90 舵机 200 mA 650 mA
HC-SR04 15 mA 15 mA
MPU-6050 4 mA 4 mA
8 通道红外阵列 100 mA 200 mA
NEO-6M GPS 45 mA 60 mA

典型避障小车——Uno、两台 TT 电机、舵机上的超声波传感器——预算大约是典型 360 mA、峰值 2.7 A。按峰值选电池包,按典型值算续航:

runtime (hours) = capacity (mAh) / average draw (mA)

2000 mAh AA 镍氢 360 mA 约 5.5 小时,比大多数机器人的电池一辈子跑的都多。容量很少是约束——冲击能力是。

正确接线

Battery + ──── master switch ──┬──── motor driver VM  (the heavy path)
                               │
                               └──── 5 V regulator ──── Arduino, sensors
Battery − ─────────────────────┴──── COMMON GROUND ──── everything

四条规则,按它们被违反的频率排序:

**共地,永远。**每个电源、每块板、每个传感器都接到同一个地上。少了共地,逻辑信号就没有参考电位,而这种故障是无声的——什么都不工作,什么都不发热,看着也没什么毛病。

**地线走星形,不要串。**每一路地都回到同一个点,而不是经电机驱动菊花链式串过去。电机的回流电流流过共用的地线会在线上产生压差,于是电机一动,你的传感器读数就跟着漂。

正极加总开关,在一切之前。失控车瞬间掐电值两分钟。

**反接保护。**串联一个肖特基二极管大约损失 0.3 V,或者用一只 P 沟道 MOSFET,代价几乎为零。两种都比一块被反接烧掉的板子便宜——而反接只需要一走神。

电容:能干什么不能干什么

电机电源并470–1000 µF 电解,贴着驱动。值得做。也常被指望干它干不了的。

它能修:PWM 和电机换向的尖锐瞬态,微秒级,耦合到逻辑轨的噪声。

它不能修:持续冲击。算术无情:

dV = I x t / C
1000 uF supplying 2 A for 10 ms -> dV = 2 x 0.01 / 0.001 = 20 V

2 A 电机冲击 10 ms 要电容掉 20 V,包里都没这么多。**只有更硬的电池扛冲击。**电机一转板子复位,加大电容不是答案——低内阻电池包是。

每颗 IC 电源脚旁再加 100 nF 瓷片。完全另一活:管芯片自己开关的高频需求,电解太慢够不着。

选哪种化学

镍氢 AA 锂离子 18650 锂聚合物
单节电压 1.2 V 3.7 V 3.7 V
内阻 低 很低 最低
自放电 低(用“即用型”) 很低 很低
过放 耐造 低于 3.0 V/节损伤 低于 3.0 V/节损伤
充电 简单皮实 要正规充电器或保护板 要平衡充
起火风险 可忽略 乱来真着 乱来真着
适合 第一台车 大多数车 性能作品

**镍氢是第一台的正解。**六节 7.2 V 内阻低,耐犯错,包死了是麻烦不是事故。

锂离子 18650 是最合算的升级:同样的重量能存多得多的能量,内阻很低,而且便宜。用带保护的电池座或一块保护板——锂电芯被放到约 3.0 V 以下会造成永久损伤,而一台跑到没电才停的机器人正好会干出这种事。

锂聚合物电池是性能作品用的那种,也是唯一必须小心对待的一种。绝不无人值守充电,绝不刺穿,绝不把放完电的电池留着,并用平衡充电器充电。

故障排查

现象 可能原因 解决
电机一转板子复位 电池包压降——内阻太高 量一量;唯一的解是换内阻更低的电池包
加大电容没用 它本来就不可能有用 见上面的算术;换电池
什么都不工作,也都不发热 没有共地 把所有地接到同一个点
电机一动传感器读数就漂 地线菊花链连接 把各地线星形接回同一个点
越跑越慢 电池包电量耗尽,电压下降 正常现象;闭一个速度环,或者监测电池包
一开始电机就无力 驱动压降加上正在下垂的电池包 L298N 自己要先吃掉约 2 V,电机才拿得到电压
稳压器很烫 线性稳压器上压差太大 换成开关稳压器,或降低输入电压
充电时电池包发热 充电器与电池化学体系不匹配 停。充电器要配电芯
锂电包废了充不进电 被放到了 3.0 V 以下 永久损伤——下次用带保护的电池座

监控电池包

最后值得加的:知道自己电池电压的车欠压前会停,两电阻的事。

// 100k / 33k divider: 8.4 V max in -> ~2.09 V at the pin. Safe for a 3.3 V ADC.
const float DIVIDER = (100.0 + 33.0) / 33.0;

float packVolts() {
  return analogRead(A0) * (5.0 / 1023.0) * DIVIDER;
}

一条值得认真对待的提醒:在 Arduino 上,analogRead 是以 5 V 电源轨为基准的,而电机一跑,这条轨本身就在下垂。用一个正在下降的参考去量一个正在下降的电池,读数反而会升高。改用芯片内部的 1.1 V 基准,配上 analogReference(INTERNAL),并按这个基准重新设计分压比,读数就诚实了——模拟输入教程讲的正是这个坑。

探索关联图谱

用到它的搭建

包含 机器人电池与电源包 的项目、学习路线和模拟器。

问题

机器人电池与电源包 常见问题

Arduino 机器人小车该用什么电池?

标准选择是用 4×AA 电池包(6 V)或 2×18650 电池包(7.4 V)给电机驱动供电。两者都能提供电机所需的电流,带载时电压也不会崩塌。开发期间,Arduino 可以由驱动板的稳压 5 V 输出供电,或者通过 USB 供电。

能用 9 V 电池给机器人的电机供电吗?

效果不好。9 V PP3 方块电池容量很小、内阻很高,所以电机一开始取电流,它的电压就会下垂,Arduino 随之欠压复位。凡是带电机的东西都用 AA 或 18650 电池包;9 V 方块电池留给面包板用。

Arduino 和电机共用同一块电池吗?

通常共用一个电池包,但走不同的电源轨。电机经驱动板的 Vin 端子从电池包取电;逻辑电路则运行在稳压后的 5 V 上。关键在于,所有电源都必须共地,否则你的信号就没有共同的参考电位,什么都读不对。

为什么电机一启动,我的机器人就复位?

因为电机启动时会短暂地吸取很大的冲击电流,把共用的电压拉低到 Arduino 所需的电压以下,于是它重新启动。解决办法是:换一块更“硬”(内阻更低)的电池,从同一个电池包分出独立的电机轨和逻辑轨,并在电机电源上并联一个电容来吸收冲击电流。

延伸阅读

参考资料