3、嵌入式控制器选型与硬件平台
好,咱们进入第三章。这一章我打算聊聊嵌入式控制器的选型,说白了就是给MRI失超保护系统挑个「大脑」。这活儿我干过不少次,每次选型都像在走钢丝——算力不够怕出事,外设太多又浪费成本。今天我把几个主流方案掰开揉碎了讲,你听完心里就有谱了。
3.1 主流MCU/MPU对比
目前工业界常用的方案,我归纳下来就三个流派:STM32、TI TMS320、Xilinx FPGA。它们各有各的脾气,咱们一个个说。
3.1.1 STM32系列
STM32,尤其是F4和H7系列,是我个人用得最多的。为什么?因为它的生态太成熟了。你想想看,从CubeMX到HAL库,从FreeRTOS到各种中间件,几乎不用自己从头造轮子。我在一个失超保护项目中用过STM32H743,主频480MHz,带双精度浮点单元,处理PID控制算法绰绰有余。
不过要注意,STM32的温度范围通常是-40°C到85°C,工业级够用。但如果你要放在磁体附近,得考虑散热。我曾经有个项目,控制器装在磁体柜里,夏天温度飙到70°C,STM32虽然没挂,但ADC采样开始飘了。嗯,后来加了散热片才稳住。
3.1.2 TI TMS320系列
TI的TMS320,特别是C2000系列,是专门为实时控制设计的。它的PWM模块和ADC模块是硬核级别的——12位ADC,转换时间只要几十纳秒。我习惯用TMS320F28379D,双核架构,一个核跑控制算法,一个核跑通信协议,互不干扰。
但说实话,TMS320的开发门槛比STM32高不少。它的IDE是CCS,库函数文档写得像天书。我记得第一次用TMS320做失超保护,光配置ePWM模块就折腾了两天。不过一旦上手,它的实时性确实让人放心。
3.1.3 Xilinx FPGA系列
FPGA,说白了就是硬件可编程。Xilinx的Artix-7或Spartan-6系列,在MRI失超保护中常用于高速信号采集和逻辑处理。比如你需要同时监测几十路温度传感器,每路采样率1kHz,用MCU轮询肯定来不及。FPGA可以并行处理,一个时钟周期搞定所有通道。
但FPGA的功耗是个问题。我做过一个对比,同样处理10路ADC数据,STM32功耗约200mW,FPGA要1W以上。而且FPGA的调试工具Vivado,启动一次够你喝杯咖啡的。所以我的建议是:能用MCU解决的,别上FPGA。
| 对比项 | STM32H743 | TMS320F28379D | Xilinx Artix-7 |
|---|---|---|---|
| 主频 | 480MHz | 200MHz | 200MHz(逻辑) |
| 浮点运算 | 双精度FPU | 单精度FPU | 需IP核 |
| ADC精度 | 12位 | 12位(高速) | 外挂ADC |
| 温度范围 | -40~85°C | -40~125°C | -40~100°C |
| 开发难度 | 低 | 中 | 高 |
| 典型功耗 | ~200mW | ~500mW | ~1.5W |
3.2 选型依据
选型不是拍脑袋,得看三个硬指标:算力、外设、温度范围。我一个个拆开讲。
3.2.1 算力
算力够不够,得看你跑什么算法。失超保护的核心是快速傅里叶变换(FFT)和阈值比较。比如你要对128点数据做FFT,STM32H743大概需要50μs,TMS320F28379D只要30μs。如果你还要跑神经网络做预测,那FPGA或带NPU的MPU才是正解。
我个人习惯是:先估算最坏情况下的计算量,再留50%余量。比如控制周期是1ms,算法需要跑300μs,那选个能跑450μs的芯片就够了。别盲目追求高算力,功耗和成本都会上去。
3.2.2 外设
外设这块,我重点看ADC、PWM、CAN/FD、SPI。失超保护系统里,ADC用来采集温度、压力、流量信号;PWM用来控制加热器或阀门;CAN/FD用来和上位机通信;SPI用来接外部存储或传感器。
举个例子,STM32F4系列有3个12位ADC,最多支持24个通道。但如果你需要同时采集16路信号,每个通道独立触发,那得看ADC的采样保持时间。我遇到过一个问题:用STM32的ADC连续采样,结果通道间串扰了。后来改成双ADC交替采样才解决。所以选型时,别只看外设数量,还得看外设的独立性。
3.2.3 温度范围
MRI环境里,磁体腔温度可能低至-20°C,而控制柜内部可能高达60°C。所以芯片的结温范围必须覆盖-40°C到85°C,最好到105°C。TI的TMS320在这方面有优势,工业级版本支持-40°C到125°C。STM32的H7系列虽然标称85°C,但我在70°C以上遇到过晶振起振不稳的问题。嗯,后来换了有源晶振才解决。
核心建议:选型时,把温度范围作为硬约束。如果芯片标称85°C,实际使用最好不超过70°C。留20°C的余量是行业惯例。
3.3 最小系统设计
芯片选好了,接下来就是搭最小系统。说白了,就是让芯片能跑起来的最小硬件集合。我把它拆成三块:时钟、电源、复位。
3.3.1 时钟
时钟是系统的脉搏。STM32H743内部有HSE和HSI两个振荡器,但内部振荡器精度不够,我建议用外部晶振。比如25MHz的晶振,经过PLL倍频到480MHz。晶振旁边要加两个负载电容,典型值18pF。走线要短,远离大电流回路。
我曾经犯过一个错:把晶振放在开关电源旁边,结果系统跑着跑着就死机。后来用示波器一看,时钟波形上全是毛刺。所以布局时,晶振和MCU之间不要走其他信号线。
// STM32H743时钟配置示例(HAL库)
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 5; // 25MHz / 5 = 5MHz
RCC_OscInitStruct.PLL.PLLN = 192; // 5MHz * 192 = 960MHz
RCC_OscInitStruct.PLL.PLLP = 2; // 960MHz / 2 = 480MHz
RCC_OscInitStruct.PLL.PLLQ = 4; // 960MHz / 4 = 240MHz
HAL_RCC_OscConfig(&RCC_OscInitStruct);
3.3.2 电源
电源设计,我习惯用LDO而不是DC-DC。为什么?因为LDO纹波小,对ADC采样精度影响小。STM32H743需要3.3V和1.2V两路电源,3.3V给IO和模拟部分,1.2V给内核。LDO的输入输出电容不能省,典型值是10μF+0.1μF。
但LDO的效率低,如果系统功耗超过500mW,建议用DC-DC。我有个项目用了TI的TPS62130,效率90%以上,纹波控制在10mV以内。不过DC-DC的布局要小心,电感要远离敏感信号。
个人经验:电源上电顺序很重要。STM32H743要求先给VDD(3.3V),再给VCORE(1.2V)。如果顺序反了,芯片可能锁死。我一般用电源监控芯片如TPS3808来保证时序。
3.3.3 复位
复位电路,最简单的就是RC复位:一个10kΩ电阻上拉到3.3V,一个0.1μF电容到地。但这样不够可靠。我建议用专用复位芯片,比如MAX809,它能在电源低于阈值时自动复位,还能防抖动。
另外,别忘了看门狗。失超保护系统里,如果程序跑飞了,看门狗能自动复位。STM32内部有独立看门狗(IWDG),时钟源是内部LSI,约40kHz。我习惯把超时时间设为1秒,主循环里定期喂狗。
// STM32独立看门狗配置示例
IWDG_HandleTypeDef hiwdg;
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_64; // 40kHz / 64 = 625Hz
hiwdg.Init.Reload = 625; // 超时时间 = 625 / 625Hz = 1秒
HAL_IWDG_Init(&hiwdg);
// 主循环中喂狗
while (1) {
// 执行控制算法
HAL_IWDG_Refresh(&hiwdg); // 喂狗
}
注意:看门狗复位后,所有外设寄存器会恢复默认值。如果你有重要的状态变量,记得存到备份寄存器或EEPROM里。我曾经因为没保存状态,复位后系统直接误动作,差点把磁体加热器烧了。
好了,这一章就到这里。选型没有标准答案,关键看你的系统需求。下一章咱们聊聊传感器接口设计,到时候我会分享一些抗干扰的实战技巧。