核心处理器选型:MCU vs MPU vs DSP vs FPGA

做运动控制这么多年,我经常被问到:「到底该用哪种处理器?」

说实话,这个问题没有标准答案。但有个原则我一直坚持:先搞清楚你要控制什么,再选芯片。别一上来就盯着参数表看,那会把你绕晕。

四种处理器的本质区别

先看一张我画的对比图,帮你快速建立整体认知:

运动控制处理器选型四象限 MCU 微控制器 集成Flash/RAM,外设丰富 适合:步进电机、直流有刷 实时性:μs级中断响应 MPU 微处理器 需外接DDR/Flash,跑Linux 适合:多轴联动、视觉引导 实时性:ms级(RT补丁) DSP 数字信号处理器 MAC单元,单周期乘加 适合:伺服驱动、FOC算法 实时性:ns级指令周期 FPGA 现场可编程门阵列 硬件并行,可定制逻辑 适合:高速脉冲、多轴插补 实时性:ns级硬件延迟 复杂度 / 成本 / 性能 递增 →

MCU:运动控制的「万金油」

我个人习惯把MCU比作瑞士军刀。它把CPU、内存、外设都集成在一块芯片上,开箱即用。对于大多数运动控制场景,比如步进电机驱动、直流有刷电机控制,MCU完全够用。

举个例子。我之前做的一个桌面型3D打印机项目,主控用的就是STM32F407。它负责读取G代码、计算插补、输出脉冲给步进电机驱动芯片。整个系统跑下来,CPU占用率才40%左右。你想想看,如果这时候上个MPU或者FPGA,是不是有点杀鸡用牛刀?

MCU选型核心指标:
  • 主频:一般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才能勉强持平。

我的经验: 如果项目需要做伺服驱动(电流环+速度环+位置环),直接上DSP。别在MCU上死磕FOC,那是在浪费开发时间。

FPGA:硬实时性的「终极武器」

FPGA这东西,我第一次接触时觉得它就是个「硬件编程器」。后来做高速脉冲控制时才发现,它简直是降维打击。

举个例子。你要控制一个步进电机做S形加减速,脉冲频率从0到200kHz。用MCU做,你得写中断服务程序,算好每个脉冲的间隔时间。CPU负载率直接拉满。用FPGA呢?写个硬件状态机,脉冲发生器独立运行,CPU只需要下发目标位置和速度参数就行。

我曾经做过一个项目,需要同时控制8个步进电机做直线插补。用STM32F4做,CPU占用率到了85%,还偶尔丢脉冲。换成FPGA(Xilinx Spartan-6)后,8个轴的脉冲发生器全部硬件实现,CPU只做轨迹规划,占用率不到20%。

避坑指南: 我曾经犯过一个错误——在FPGA里用Verilog写PID算法。调试了整整两周,最后发现同样的算法在DSP上跑,开发效率高10倍。FPGA适合做「逻辑密集」型任务,不适合做「算法密集」型任务。

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 暂无完美替代
我的建议: 国产芯片(GD32、AT32、APM32)在硬件上基本兼容STM32,但坑也不少。比如GD32的ADC精度比STM32差一些,AT32的USB兼容性有问题。我一般会在项目初期留出2周的「替代验证」时间。

实时性要求与算力评估

做运动控制,实时性是命根子。我见过太多项目,选型时只看主频,结果做出来电机一跑就丢步。

实时性到底要多少?

不同控制层级对实时性的要求不一样:

  • 电流环: 10-20kHz,延迟要求 < 50μs
  • 速度环: 1-5kHz,延迟要求 < 500μs
  • 位置环: 100-500Hz,延迟要求 < 5ms
  • 轨迹规划: 10-100Hz,延迟要求 < 50ms

你想想看,如果电流环的延迟超过100μs,电机就会产生明显的振动和噪音。我调试过一个项目,用STM32F103做FOC,电流环跑到8kHz就上不去了。后来换成STM32G474,同样的算法跑到16kHz还很稳。这就是算力差距。

算力评估的「土办法」

我不喜欢用那些复杂的算力模型。我的方法很简单:

  1. 列出所有需要实时处理的任务
  2. 估算每个任务的最坏执行时间(WCET)
  3. 计算总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%,那就得换芯片了。

避坑指南: 我曾经在选型时只看主频,没考虑中断延迟。结果STM32F407跑10kHz电流环,中断响应时间不稳定,有时候会跳到20μs。后来发现是其他中断优先级设置的问题。所以,算力评估一定要考虑中断延迟和上下文切换开销

好了,关于核心处理器选型,我就说这么多。记住一句话:没有最好的芯片,只有最合适的方案。选型时多花点时间做评估,后面调试能省一半的功夫。


专注资料整理