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,适合对同步要求不高的场景。

多路电机同步控制芯片选型决策树 需要多少路PWM? ≤4路 需要WiFi/蓝牙? 是 → ESP32 否 → STM32 5~8路 实时性要求高? 是 → STM32 否 → Pico >8路 → 必须STM32 注:Pico适合原型验证,ESP32适合物联网单机,STM32适合工业级多轴

专注资料整理