核心处理器选型:MCU vs MPU vs DSP vs FPGA
做运动控制这么多年,我经常被问到:「到底该用哪种处理器?」
说实话,这个问题没有标准答案。但有个原则我一直坚持:先搞清楚你要控制什么,再选芯片。别一上来就盯着参数表看,那会把你绕晕。
四种处理器的本质区别
先看一张我画的对比图,帮你快速建立整体认知:
MCU:运动控制的「万金油」
我个人习惯把MCU比作瑞士军刀。它把CPU、内存、外设都集成在一块芯片上,开箱即用。对于大多数运动控制场景,比如步进电机驱动、直流有刷电机控制,MCU完全够用。
举个例子。我之前做的一个桌面型3D打印机项目,主控用的就是STM32F407。它负责读取G代码、计算插补、输出脉冲给步进电机驱动芯片。整个系统跑下来,CPU占用率才40%左右。你想想看,如果这时候上个MPU或者FPGA,是不是有点杀鸡用牛刀?
- 主频:一般80-240MHz足够
- 定时器数量:至少2个高级定时器用于PWM生成
- ADC采样率:>1Msps,用于电流环
- 通信接口:CAN、SPI、UART缺一不可
MPU:当运动控制遇上「智能」
MPU和MCU最大的区别是什么?说白了,MPU就是一颗「裸CPU」,你得给它配内存、配存储。但它能跑Linux,能接摄像头,能做网络通信。
我记得有个项目是做协作机器人控制。六轴联动、实时轨迹规划、力控反馈,这些算法用MCU跑起来太吃力了。最后选了全志的A40i,四核Cortex-A7,跑Linux + RT-Preempt补丁。上位机用EtherCAT主站,下位机用FPGA做伺服接口。嗯,这里要注意,MPU做运动控制时,实时性是个大坑。Linux默认的调度延迟可能到几十毫秒,必须打RT补丁或者用双核架构(一个核跑Linux,一个核跑裸机)。
| 处理器类型 | 典型型号 | 适用场景 | 实时性 |
|---|---|---|---|
| MCU | STM32F4/G4, GD32 | 单轴/双轴步进控制 | μs级 |
| MPU | 全志A40i, i.MX6ULL | 多轴联动+视觉 | ms级(需优化) |
| DSP | TMS320F28379D | 伺服驱动FOC | ns级 |
| FPGA | XC7Z010, EG4S20 | 高速脉冲/多轴插补 | ns级 |
DSP:伺服驱动的「心脏」
做伺服驱动的人都知道,FOC(磁场定向控制)算法对算力要求极高。电流环要跑到10kHz以上,速度环要1kHz,位置环要100Hz。这时候MCU就有点力不从心了。
DSP的优势在于它的硬件乘法器。一个MAC(乘加)指令,一个时钟周期就能完成。我做过一个低压伺服项目,用的TMS320F28069,90MHz主频,跑FOC算法绰绰有余。相比之下,用Cortex-M4做同样的算法,主频要拉到200MHz才能勉强持平。
FPGA:硬实时性的「终极武器」
FPGA这东西,我第一次接触时觉得它就是个「硬件编程器」。后来做高速脉冲控制时才发现,它简直是降维打击。
举个例子。你要控制一个步进电机做S形加减速,脉冲频率从0到200kHz。用MCU做,你得写中断服务程序,算好每个脉冲的间隔时间。CPU负载率直接拉满。用FPGA呢?写个硬件状态机,脉冲发生器独立运行,CPU只需要下发目标位置和速度参数就行。
我曾经做过一个项目,需要同时控制8个步进电机做直线插补。用STM32F4做,CPU占用率到了85%,还偶尔丢脉冲。换成FPGA(Xilinx Spartan-6)后,8个轴的脉冲发生器全部硬件实现,CPU只做轨迹规划,占用率不到20%。
ARM Cortex-M系列选型
如果你决定用MCU,那ARM Cortex-M系列是绕不开的选择。从M0到M7,性能跨度很大。怎么选?我一般看三个指标:算力、外设、功耗。
Cortex-M0/M0+:低功耗的「小钢炮」
适合做电池供电的传感器节点、简单的开关控制。比如你做一个电动窗帘控制器,用M0就够了。主频48MHz,价格不到2块钱。
Cortex-M3/M4:运动控制的「主力军」
这是目前运动控制领域用得最多的内核。M3偏控制,M4多了FPU和DSP指令。我个人建议:只要预算允许,直接上M4。FPU对PID运算的提升是实打实的,一个浮点乘法指令比软件模拟快20倍。
Cortex-M7:性能「天花板」
M7是Cortex-M系列里性能最强的。双发射流水线、L1缓存、高达400MHz的主频。适合做多轴联动、实时以太网通信。但要注意,M7的功耗也高,散热要做好。
M0做开关,M3做控制,M4做算法,M7做系统。
STM32与国产替代方案
说到MCU,STM32是绕不开的。但这两年芯片缺货,国产替代方案也成熟了。我整理了一份对比表:
| 型号 | 内核 | 主频 | Flash | 价格(批量) | 替代方案 |
|---|---|---|---|---|---|
| STM32F103C8T6 | M3 | 72MHz | 64KB | ¥8-12 | GD32F103C8T6 |
| STM32F407VGT6 | M4 | 168MHz | 1MB | ¥35-50 | AT32F403AVGT7 |
| STM32G474RET6 | M4 | 170MHz | 512KB | ¥25-40 | APM32F407RET6 |
| STM32H743ZIT6 | M7 | 480MHz | 2MB | ¥80-120 | 暂无完美替代 |
实时性要求与算力评估
做运动控制,实时性是命根子。我见过太多项目,选型时只看主频,结果做出来电机一跑就丢步。
实时性到底要多少?
不同控制层级对实时性的要求不一样:
- 电流环: 10-20kHz,延迟要求 < 50μs
- 速度环: 1-5kHz,延迟要求 < 500μs
- 位置环: 100-500Hz,延迟要求 < 5ms
- 轨迹规划: 10-100Hz,延迟要求 < 50ms
你想想看,如果电流环的延迟超过100μs,电机就会产生明显的振动和噪音。我调试过一个项目,用STM32F103做FOC,电流环跑到8kHz就上不去了。后来换成STM32G474,同样的算法跑到16kHz还很稳。这就是算力差距。
算力评估的「土办法」
我不喜欢用那些复杂的算力模型。我的方法很简单:
- 列出所有需要实时处理的任务
- 估算每个任务的最坏执行时间(WCET)
- 计算总CPU负载率,留出30%余量
举个例子。一个伺服驱动项目:
- 电流环(10kHz):每次执行5μs,占用50% CPU
- 速度环(1kHz):每次执行20μs,占用2% CPU
- 位置环(100Hz):每次执行50μs,占用0.5% CPU
- 通信任务(EtherCAT):占用10% CPU
- 其他开销:10% CPU
总负载率:50% + 2% + 0.5% + 10% + 10% = 72.5%。留了27.5%的余量,勉强够用。如果换成STM32F103(72MHz),电流环执行时间可能变成15μs,负载率直接飙到150%,那就得换芯片了。
好了,关于核心处理器选型,我就说这么多。记住一句话:没有最好的芯片,只有最合适的方案。选型时多花点时间做评估,后面调试能省一半的功夫。