硬件平台选型:MCU vs MPU vs FPGA

做实时控制这么多年,我经常被问到同一个问题:到底该用MCU、MPU还是FPGA?

说实话,没有标准答案。每个项目都有自己的脾气。我见过有人用STM32做四轴飞行器,也见过有人用Zynq做伺服驱动器。关键是你得搞清楚——你的实时性要求到底有多高?

MCU、MPU、FPGA,三者的本质区别

先说说我的理解。MCU(微控制器)是“单片机”,CPU、内存、外设都集成在一颗芯片里。它的强项是确定性——中断响应时间可以控制在几十个纳秒内。我做过一个项目,要求PWM周期误差不超过50ns,用Cortex-M4轻松搞定。

MPU(微处理器)就不一样了。它跑Linux或RTOS,外设需要外挂。好处是算力强,能跑复杂的算法。但代价是实时性差——你想想看,Linux里一个中断进来,可能被别的任务堵住几百微秒。做实时控制?有点悬。

FPGA呢?硬件并行,延迟可以做到皮秒级。我有个朋友做激光雷达的电机控制,用FPGA直接生成PWM,延迟只有几个时钟周期。但FPGA开发周期长,调试起来也麻烦。

我的建议:

  • 控制周期 < 10μs → FPGA
  • 控制周期 10μs ~ 1ms → MCU
  • 控制周期 > 1ms,且需要复杂算法 → MPU

ARM Cortex-M/R/A系列对比

ARM这几个系列,我基本都用过。每个系列都有自己的脾气。

Cortex-M系列:实时控制的“老黄牛”

Cortex-M0/M3/M4/M7,我用的最多的是M4和M7。M4带FPU和DSP指令,做PID控制、FOC算法刚刚好。M7性能更强,但功耗也上去了。

我记得有个项目,客户要求用一颗芯片同时做电机控制和通信协议栈。我选了M7,主频跑400MHz,实时任务放在TCM里,通信任务跑在普通RAM里。嗯,效果还不错。

避坑指南:我曾经在M4上跑一个复杂的卡尔曼滤波,结果发现FPU的精度不够。后来改用定点数实现,反而更快。所以别迷信浮点运算,有时候定点数更靠谱。

Cortex-R系列:硬实时的“特种兵”

Cortex-R系列,说白了就是为实时控制量身定做的。它支持紧耦合内存(TCM),中断延迟可以做到几个时钟周期。我做过一个汽车电子项目,要求刹车控制响应时间不超过10μs,用的就是Cortex-R5。

R系列还有个特点——支持锁步模式。两个核跑同样的代码,互相校验。这在工业安全领域特别重要。我建议做功能安全(SIL3)的朋友,优先考虑R系列。

Cortex-A系列:算力怪兽,但实时性堪忧

Cortex-A系列,比如A53、A72,算力确实强。但它的架构是为应用处理器设计的,有MMU、多级缓存,中断延迟不稳定。你想想看,一个中断进来,可能先要查TLB,再查L1/L2缓存,这时间就没谱了。

我见过有人用A系列做实时控制,结果发现抖动有几十微秒。后来不得不在FPGA里做个硬件定时器来触发控制任务。所以我的建议是:除非你跑Linux且控制周期要求不高,否则别用A系列做硬实时。

系列 典型应用 实时性 算力 功耗
Cortex-M 电机控制、传感器
Cortex-R 汽车、工业安全 极高 中高
Cortex-A 人机界面、复杂算法

实时控制器的外设需求

做实时控制,光有好的内核还不够。外设才是真正的“战场”。我总结了一下,三个外设最关键:定时器、ADC、PWM。

定时器:控制系统的“心跳”

定时器是实时控制的基石。没有精准的定时器,你的控制周期就是一句空话。

我个人习惯用高级定时器,比如STM32的TIM1/TIM8。它们支持多通道、互补输出、死区插入,做电机控制特别方便。我建议至少要有3个独立定时器:一个做控制周期触发,一个做PWM生成,一个做编码器捕获。

注意:我曾经在一个项目里,用通用定时器做PWM,结果发现频率一高,占空比精度就不够了。后来换成高级定时器,支持16位自动重载,问题才解决。所以选型时一定要看定时器的位数和分辨率。

ADC:把模拟世界“翻译”给数字世界

ADC的采样速度和精度,直接决定了你的控制质量。我做过一个电流环控制,要求采样率至少1Msps,分辨率12位以上。

这里有个坑——很多MCU的ADC,采样率标得很高,但实际用起来受限于转换时间和DMA带宽。我建议选型时关注三个参数:

  • 采样率(Msps)
  • 分辨率(bits)
  • 转换时间(ns)

另外,同步采样也很重要。做三相电机控制时,需要同时采样三相电流。如果ADC不支持同步采样,你就得用软件对齐,这会导致相位误差。

我的经验:我习惯用ADC的注入组模式。把高优先级的采样任务放在注入组里,可以打断常规的扫描序列。这样既能保证关键信号的实时性,又不浪费ADC的带宽。

PWM:控制系统的“执行器”

PWM是实时控制的最后一步。它的精度和分辨率,直接决定了你的控制效果。

我建议选型时关注以下几点:

  • PWM分辨率:至少16位,最好能到20位
  • 死区时间:支持可编程死区,最小步长1ns
  • 故障保护:支持硬件级故障输入,能在几个时钟周期内关断PWM

我记得有个项目,客户要求PWM频率100kHz,占空比精度0.01%。我算了一下,需要至少20位的PWM分辨率。最后选了带高精度定时器的MCU,才满足要求。

总结一下:

选型时,别只看主频和Flash大小。定时器的精度、ADC的采样率、PWM的分辨率,这些才是实时控制的关键。我建议先画出控制系统的时序图,再根据时序要求反推外设参数。这样选出来的芯片,才真正适合你的项目。

好了,这一章就聊到这里。下一章我们聊聊实时操作系统的选型——RTOS还是裸机?这是个好问题。