第2章:硬件平台选型——主控芯片与外设模块的博弈

做售货机嵌入式系统,第一步就是选主控芯片。很多人觉得这步简单,随便找个STM32就能干。嗯,我当年也这么想,结果踩了不少坑。

说白了,售货机是个典型的“多任务实时系统”。它要同时处理支付、出货、显示、通信。你想想看,如果主控选错了,后面所有工作都得推倒重来。我建议你花点时间,把这一步走稳。

2.1 主控芯片:MCU还是MPU?

先搞清楚一个概念:MCU(微控制器)和MPU(微处理器)的区别。MCU把CPU、内存、外设都集成在一块芯片上,适合控制密集型任务。MPU更像电脑的CPU,需要外挂内存和存储,适合计算密集型任务。

售货机用MCU就够了。为什么?因为售货机不需要跑Linux,不需要处理复杂的图形界面。一个Cortex-M4或M7内核的MCU,主频200MHz左右,完全能搞定。

我个人习惯用STM32F4系列。它在性能和功耗之间平衡得很好。当然,国产的GD32、AT32也是不错的选择,性价比更高。

核心选型指标:

  • 主频:至少100MHz,建议200MHz以上
  • Flash:至少512KB,建议1MB以上
  • RAM:至少128KB,建议256KB以上
  • GPIO数量:至少40个,用于连接各种外设
  • 通信接口:至少3路UART、2路I2C、2路SPI

我的经验:别只看数据手册上的理论值。我在一个项目中用了某款国产MCU,标称主频200MHz,实际跑到180MHz就开始不稳定。后来换了ST的芯片,稳如老狗。所以,选型时一定要留足余量。

2.2 外设模块选型:支付、出货、显示

售货机的三大核心外设:支付模块、出货模块、显示模块。每个模块的选型都有讲究。

2.2.1 支付模块

支付模块是售货机的“钱袋子”。现在主流的有三种:

  • 扫码支付模块:支持微信、支付宝。通过UART接口通信,协议一般是自定义的。我建议选带“掉电保护”功能的,防止交易数据丢失。
  • 现金支付模块:包括硬币器和纸币器。硬币器用MDB协议(Multi-Drop Bus),纸币器用串口或并行接口。MDB协议有点老,但稳定可靠。
  • IC卡/NFC模块:支持公交卡、校园卡。通过I2C或SPI接口通信。注意选型时要确认卡片类型(Mifare、CPU卡等)。

避坑指南:我曾经在一个项目中,选了某品牌的扫码模块,结果发现它的UART波特率是115200,而我的主控默认是9600。改配置花了两天时间。所以,选型时一定要确认通信参数是否匹配。

2.2.2 出货模块

出货模块就是电机驱动部分。常见的有两种:

  • 步进电机:用于弹簧货道。控制简单,成本低。用GPIO输出PWM信号驱动。
  • 直流电机:用于履带货道或升降机。需要H桥驱动芯片(如L298N、DRV8833)。

我个人建议用步进电机。它控制精度高,不容易卡货。直流电机虽然便宜,但容易因为惯性导致出货不准。

电机驱动选型要点:

  • 驱动电流:至少2A,考虑堵转情况
  • 保护功能:过流保护、过热保护
  • 接口:用SPI或I2C控制,减少GPIO占用

2.2.3 显示模块

显示模块是售货机的“脸面”。现在主流的是LCD屏和OLED屏。

  • LCD屏:成本低,显示效果好。常用的是128x64点阵屏,通过SPI或并行接口驱动。我建议用带中文字库的,省去字库存储的麻烦。
  • OLED屏:对比度高,功耗低。但价格贵一些。适合高端机型。

你想想看,如果显示模块选错了,用户连商品价格都看不清,那还怎么卖?所以,显示模块的选型要优先考虑可视角度和亮度。

2.3 通信接口规划:UART、I2C、SPI

通信接口是连接主控和外设的“桥梁”。规划不好,后面调试会非常痛苦。

接口类型 速度 通信方式 典型应用
UART 最高1Mbps 异步串行 支付模块、蓝牙模块
I2C 最高3.4Mbps 同步串行 传感器、EEPROM
SPI 最高50Mbps 同步串行 显示模块、SD卡

我的规划原则是:

  • UART:用于长距离通信(如支付模块、蓝牙)。每个UART分配一个独立的中断,避免数据丢失。
  • I2C:用于短距离、低速设备(如温度传感器、RTC时钟)。注意上拉电阻的取值,我一般用4.7kΩ。
  • SPI:用于高速设备(如LCD屏、SD卡)。注意时钟极性和相位的配置,搞错了显示会花屏。

我的小技巧:在PCB布局时,把UART、I2C、SPI的走线分开,避免信号串扰。我曾经在一个项目中,UART和SPI的走线挨得太近,结果UART通信老是出错。后来重新布线才解决。

2.4 实战案例:一个典型的售货机硬件架构

说了这么多,给你看一个我实际用过的硬件架构:

主控芯片:STM32F407VGT6(Cortex-M4,168MHz,1MB Flash,192KB RAM)
支付模块:扫码模块(UART1,115200bps)
         硬币器(UART2,9600bps,MDB协议)
出货模块:步进电机驱动(TIM1输出PWM,GPIO控制方向)
         货道检测(GPIO输入,中断触发)
显示模块:128x64 LCD屏(SPI1,10MHz)
通信接口:WiFi模块(UART3,115200bps)
         蓝牙模块(UART4,9600bps)
存储:    EEPROM(I2C1,400kHz)
          SD卡(SPI2,20MHz)

这个架构我用了三年,出货量超过5000台,稳定性很好。你如果刚开始做,可以直接参考这个方案。

总结一下:

  • 主控选MCU,别选MPU
  • 支付模块注意协议兼容性
  • 出货模块优先步进电机
  • 显示模块考虑可视角度
  • 通信接口规划要留余量

好了,硬件平台选型就讲到这里。下一章我们聊聊软件架构设计,那才是真正考验功力的地方。