第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
- 支付模块注意协议兼容性
- 出货模块优先步进电机
- 显示模块考虑可视角度
- 通信接口规划要留余量
好了,硬件平台选型就讲到这里。下一章我们聊聊软件架构设计,那才是真正考验功力的地方。