3. 核心芯片选型:STM32、ESP32、树莓派Pico的PWM与定时器资源分析
做多路电机同步控制,选芯片是第一道坎。我见过不少朋友,算法写得漂亮,结果板子一跑,PWM通道不够用,或者定时器互相打架,最后只能降维方案。说白了,选型就是选资源——尤其是PWM和定时器资源。
今天咱们就掰开揉碎,看看三款主流芯片:STM32、ESP32、树莓派Pico,到底谁更适合干这活。
3.1 为什么PWM和定时器是核心?
电机控制,说白了就是控制电压和时序。PWM负责调压调速,定时器负责产生精准的时序信号。多路电机同步,意味着你需要多个PWM通道同时输出,并且它们之间的相位差、频率必须严格对齐。
嗯,这里要注意:普通芯片的PWM通道,很多是“伪独立”的。它们共享同一个定时器时钟源,但输出引脚可能受IO复用限制。我早期一个项目,选了某款国产芯片,8路PWM看着挺多,结果有4路共用一个定时器,想调个相位差,折腾了两天没搞定。
核心指标:
- 独立PWM通道数(不共享定时器)
- 定时器分辨率(决定PWM频率精度)
- 定时器同步能力(能否硬件级对齐)
- DMA支持(能否自动更新占空比)
3.2 STM32:老牌劲旅,资源丰富
STM32系列,尤其是F4和H7系列,在电机控制领域是标杆。我个人习惯用STM32F407,它内置了14个定时器,其中高级定时器TIM1和TIM8能输出6路互补PWM,带死区插入——这玩意儿做无刷电机驱动,简直量身定制。
PWM资源一览:
| 定时器类型 | 数量 | PWM通道数 | 特点 |
|---|---|---|---|
| 高级定时器(TIM1/TIM8) | 2个 | 6路/个(互补输出) | 带死区、刹车、编码器接口 |
| 通用定时器(TIM2~TIM5) | 4个 | 4路/个 | 16位/32位可选 |
| 基本定时器(TIM6/TIM7) | 2个 | 无PWM输出 | 仅用于定时中断 |
我在项目中遇到过一个问题:用TIM1和TIM8分别控制两台电机,想让它们同步启动。结果发现两个定时器虽然时钟源相同,但计数器复位时刻有微小偏差。后来用了定时器同步功能——把TIM1设置为主模式,TIM8设置为从模式,TIM8的计数器跟着TIM1复位,问题解决。
避坑指南:我曾经以为STM32的PWM通道都是独立的,后来发现TIM2的CH3和CH4在某些封装下会跟I2C引脚冲突。选型时一定要查Datasheet的引脚复用表,别等画完PCB才发现。
3.3 ESP32:WiFi加持,但定时器有坑
ESP32这两年很火,自带WiFi和蓝牙,做物联网电机控制很方便。但它的PWM资源,说实话,有点“虚”。
ESP32的PWM是通过LEDC控制器实现的,最多8路通道。但注意:这8路通道共享同一个时钟源,而且频率只能按2的幂次分频。什么意思?你想输出100Hz和200Hz两路PWM?做不到,因为分频系数必须是整数,而且所有通道频率必须一致。
ESP32 PWM资源特点:
- LEDC控制器:8路PWM,频率共享
- 定时器组:2组(每组2个定时器),共4个定时器
- 定时器分辨率:16位
- 硬件同步:不支持定时器间同步
说白了,ESP32做单路电机控制或者两路同步还行,但超过4路,你就得用软件模拟PWM了。我试过用ESP32控制4个舵机,每个舵机需要50Hz的PWM,频率一样,占空比不同,LEDC刚好能搞定。但如果你想控制两台不同频率的直流电机,那就麻烦了。
警告:ESP32的WiFi功能会占用CPU时间,导致PWM中断响应延迟。我做过测试,WiFi吞吐量大的时候,PWM占空比更新会抖动,电机转速不稳。如果要做实时性要求高的同步控制,建议用双核,把电机控制放在Core 0,WiFi放在Core 1。
3.4 树莓派Pico:便宜够用,但上限低
树莓派Pico用的是RP2040芯片,双核Cortex-M0+,价格才几块钱。它的PWM资源很有意思:8个PWM slice,每个slice有两个通道(A和B),总共16路PWM。
但注意:每个slice的两个通道共享同一个频率,但占空比可以独立设置。也就是说,你最多能输出8种不同频率的PWM,每种频率下有两路。
RP2040 PWM资源特点:
- PWM slice:8个
- PWM通道:16路(每slice两路)
- 定时器:2个(系统定时器+看门狗定时器)
- 分辨率:16位
- 硬件同步:支持PWM slice间同步
我做过一个项目,用Pico控制6个步进电机。每个电机需要两路PWM(一路脉冲、一路方向),总共12路。Pico刚好有16路,够用。但问题来了:步进电机需要精准的脉冲频率,Pico的PWM频率是通过系统时钟分频得到的,而系统时钟是133MHz,分频后精度有限。比如你想输出1000Hz,实际只能输出999.8Hz,误差不大,但长时间运行会累积。
我的建议:Pico适合做原型验证或者小批量产品。如果要做工业级的多路同步控制,还是STM32更靠谱。Pico的PWM slice同步功能不错,但定时器资源太少,只有两个,做复杂时序调度会捉襟见肘。
3.5 三款芯片对比总结
咱们直接上表格,一目了然:
| 指标 | STM32(F407) | ESP32 | 树莓派Pico |
|---|---|---|---|
| 最大PWM通道数 | 30+(含互补) | 8(LEDC) | 16 |
| 独立频率数 | 14(每个定时器独立) | 1(所有通道同频) | 8(每个slice独立) |
| 定时器数量 | 14个 | 4个 | 2个 |
| 硬件同步 | 支持(主从模式) | 不支持 | 支持(slice间) |
| DMA支持 | 完善 | 有限 | 支持 |
| 价格 | ¥15~50 | ¥10~20 | ¥5~10 |
| 适合场景 | 工业级多轴控制 | 物联网单机控制 | 原型验证/教育 |
3.6 我的选型建议
如果你做的是4轴以下、对实时性要求不高的同步控制,ESP32够用,还能顺便连个WiFi上报数据。但如果你要做6轴甚至8轴的同步运动控制,比如3D打印机、机械臂,那STM32是唯一选择。Pico嘛,适合学生做毕设或者个人DIY,成本低,上手快。
最后说一句:选芯片别只看PWM通道数,还要看定时器之间的同步能力。我见过有人用STM32的4个通用定时器分别控制4个电机,结果因为定时器复位不同步,电机启动时差了几个微秒,导致机械结构卡死。后来改用高级定时器的主从同步模式,问题才解决。
小技巧:如果你已经选了某款芯片,但PWM通道不够,可以考虑用PCA9685这类PWM扩展芯片,I2C接口,最多16路。但注意,扩展芯片的PWM频率和相位同步精度不如芯片原生PWM,适合对同步要求不高的场景。