3、主控MCU选型:MCU选型考量因素、主流架构与常用型号推荐

好,咱们进入第三讲。这一章聊的是智能电表的大脑——主控MCU的选型。

说实话,MCU选型这事儿,我见过太多人一上来就盯着主频和Flash大小。其实在智能电表这个场景里,选型逻辑跟消费电子完全不一样。你想想看,电表要在户外挂十年,温度从零下40度到85度,还得扛住雷击浪涌。所以选MCU,第一件事不是看性能,而是看可靠性。

3.1 MCU选型考量因素

3.1.1 处理能力

智能电表需要处理的任务其实挺杂的:计量数据采集、费率切换、实时时钟同步、通信协议栈(DL/T645、Modbus)、甚至还要跑简单的加密算法。我个人习惯,先算一下CPU负载率。

举个例子,一个典型的电表应用:

  • 计量芯片每200ms产生一次中断,读取数据约耗时0.5ms
  • LCD刷新每500ms一次,耗时1ms
  • 通信任务(比如红外抄表)每100ms轮询一次,耗时2ms
  • 实时时钟和费控任务每1s执行一次,耗时3ms

算下来,最忙的时候CPU占用率大概在15%~20%左右。所以我建议选主频在48MHz以上的Cortex-M3或M4内核芯片。太低的话,万一以后要加功能(比如远程升级、高级加密),就捉襟见肘了。

我的经验:别只看主频,要看实际处理能力。有些国产芯片标称72MHz,实际跑浮点运算比ST的48MHz还慢。最好拿你的核心算法(比如FFT或加密)跑一下benchmark。

3.1.2 外设资源

智能电表的外设需求,我列个清单你就明白了:

外设 用途 选型要点
SPI 与计量芯片通信 至少1路,速率建议10MHz以上
UART 红外通信、RS485、蓝牙模块 至少2路,最好带FIFO
I2C EEPROM、RTC、温度传感器 1路即可,注意上拉电阻
GPIO 继电器控制、按键、LED指示 至少16个,注意耐压
ADC 电池电压检测、温度检测 2~4通道,12位精度
定时器 PWM输出、脉冲计数 至少2个,带捕获功能

嗯,这里要注意一点:很多国产MCU的UART FIFO深度只有8字节,而ST的有16字节。在高速通信(比如115200bps)时,FIFO浅了容易丢数据。我曾经在一个项目里就因为这个踩过坑,后来不得不加软件流控。

3.1.3 功耗

智能电表对功耗的要求其实分两种场景:

  • 正常运行时:整机功耗一般要求在3W以内,MCU本身几十mA的电流完全不是问题
  • 停电时(电池供电):这时候MCU必须进入低功耗模式,电流要控制在几十μA级别

我建议关注这几个参数:

  • Stop模式下的电流(通常要求<10μA)
  • 从Stop模式唤醒的时间(最好<10μs)
  • RTC独立供电时的电流(通常<1μA)

避坑指南:我曾经遇到过一款MCU,数据手册上写Stop模式电流5μA,实际测出来有30μA。后来发现是GPIO没配置好,内部上拉电阻没关。所以选型时一定要看实际测试数据,别光看手册。

3.2 主流MCU架构

3.2.1 ARM Cortex-M系列

目前智能电表领域,ARM Cortex-M系列是绝对的主流。具体来说:

  • Cortex-M0/M0+:适合低成本、低功耗场景,主频一般48MHz以下。但说实话,做电表有点吃力,尤其是要跑加密算法的时候。
  • Cortex-M3:这是电表领域的「黄金内核」。性能适中(72MHz左右),功耗控制好,外设丰富。我个人最推荐这个。
  • Cortex-M4:带FPU(浮点运算单元),适合需要做FFT或复杂算法的场景。但价格比M3贵30%左右,看项目预算。

为什么ARM能统治这个市场?说白了就是生态好。你随便找个工程师,都能上手STM32。开发工具、库函数、例程,一抓一大把。这对产品开发周期来说太重要了。

3.2.2 RISC-V架构

RISC-V这几年在智能电表领域也开始冒头了。说实话,我一开始是持观望态度的,直到去年帮一个客户调试了一款RISC-V的计量方案。

RISC-V的优势很明显:

  • 开源免费:没有ARM的授权费,芯片成本能降10%~20%
  • 指令集可定制:可以针对电表应用加专用指令,比如快速乘加
  • 国产化需求:现在很多电网招标明确要求「自主可控」,RISC-V正好符合

但缺点也很突出:

  • 生态不完善:开发工具链、调试器、RTOS移植,都比ARM差一截
  • 兼容性问题:不同厂家的RISC-V内核,外设寄存器地址都不一样,代码移植麻烦

我的建议:如果你做的是国网标准表,对成本敏感且要求国产化,可以考虑RISC-V。但如果是出口表或高端表,还是老老实实用ARM吧,省心。

3.3 常用MCU型号推荐

3.3.1 STM32系列(意法半导体)

行业标杆,不用多说。推荐型号:

  • STM32F103RCT6:72MHz Cortex-M3,256KB Flash,48KB RAM。经典款,资料最多,适合新手
  • STM32L431RCT6:80MHz Cortex-M4,带FPU,低功耗。适合电池供电场景
  • STM32G070RBT6:64MHz Cortex-M0+,128KB Flash。性价比高,适合简单电表

不过说实话,STM32现在价格涨得厉害,一颗F103要20多块。很多客户开始找替代方案了。

3.3.2 GD32系列(兆易创新)

国产替代的首选。GD32F103系列跟STM32F103引脚兼容,可以直接替换。但要注意:

  • GD32的主频更高(108MHz vs 72MHz),但实际功耗也大一些
  • ADC精度不如ST,尤其是内部参考电压的温漂比较大
  • 有些外设的寄存器地址不一样,代码不能完全照搬

我建议:如果项目对成本敏感,且ADC精度要求不高(比如只做电池检测),GD32是个好选择。

3.3.3 复旦微系列(FM33)

专门为电表设计的MCU,这个我必须重点说一下。复旦微的FM33系列有几个特点:

  • 内置LCD驱动:直接驱动段码液晶屏,省掉一个驱动芯片
  • 内置RTC:精度高,温漂小,省掉外部晶振
  • 低功耗:Stop模式电流能做到2μA以下

推荐型号:

  • FM33A048:48MHz Cortex-M0,64KB Flash,8KB RAM。适合基础型单相表
  • FM33LC023N:64MHz Cortex-M3,256KB Flash。适合三相表或带通信模块的复杂表

个人经验:复旦微的MCU在国网招标中占有率很高,因为它的外设就是为电表量身定做的。但开发工具比较难用,J-Link有时候连不上,建议用他们自家的调试器。

3.4 MCU与计量芯片的通信设计

这是整个系统设计的关键环节。MCU和计量芯片之间,最常用的接口就是SPI。

3.4.1 SPI通信设计要点

我直接说几个容易出问题的地方:

  1. 时钟极性(CPOL)和相位(CPHA):不同厂家的计量芯片,SPI模式可能不一样。比如ADI的ADE系列常用模式0(CPOL=0, CPHA=0),而钜泉光电的RN系列常用模式3(CPOL=1, CPHA=1)。一定要看数据手册,别想当然。
  2. 数据长度:大部分计量芯片用16位或24位数据。MCU的SPI要支持可配置的数据长度。STM32的SPI可以设成8位或16位,但24位需要软件拼接。
  3. 片选信号:计量芯片的CS引脚通常要求低电平有效。而且两次通信之间,CS必须拉高至少几百纳秒。这个时序要求,很多新手会忽略。

3.4.2 代码示例:SPI读取计量数据

下面是一个典型的SPI读取流程,我用STM32的HAL库写了个例子:

// 读取计量芯片的电压寄存器(假设地址0x10,16位数据)
uint16_t Read_Meter_Register(uint8_t reg_addr)
{
    uint8_t tx_data[2];
    uint8_t rx_data[2];
    uint16_t value = 0;

    // 片选拉低
    HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);

    // 发送寄存器地址(高位在前)
    tx_data[0] = reg_addr;
    HAL_SPI_TransmitReceive(&hspi1, tx_data, rx_data, 1, 100);

    // 发送0x00获取数据(SPI是全双工,发0x00才能读到数据)
    tx_data[0] = 0x00;
    HAL_SPI_TransmitReceive(&hspi1, tx_data, rx_data, 1, 100);

    // 片选拉高
    HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);

    // 组合数据
    value = ((uint16_t)rx_data[0] << 8) | rx_data[1];

    return value;
}

注意:有些计量芯片要求连续读取时,CS必须保持低电平。比如读取三相电压(A、B、C相),可以一次发完所有地址再拉高CS,这样效率更高。

3.4.3 通信速率与抗干扰

智能电表的工作环境电磁干扰很严重。我遇到过SPI通信偶尔出错的情况,排查了好久才发现是布线问题。

几个实用建议:

  • SPI速率不要太高:我一般控制在2MHz~5MHz。再高的话,长距离走线容易受干扰
  • 加CRC校验:每次读取数据后,再读一下计量芯片的CRC寄存器,做校验
  • 软件滤波:连续读三次,取中间值或者平均值。这个在计量数据上特别管用
  • 隔离设计:如果MCU和计量芯片不在同一块PCB上(比如分板设计),建议加SPI隔离芯片,比如ADuM3151

好了,这一章的内容就到这里。MCU选型说白了就是平衡性能、成本、功耗和生态。下一章咱们聊聊存储器的选型,包括Flash、EEPROM和铁电存储器(FRAM)在电表中的应用。到时候见。