第二章:系统架构设计——主控芯片选型与传感器、电机驱动架构

各位同学,咱们接着聊。上一章我们把点钞机的整体功能需求理清楚了,这一章就要动真格的了——系统架构设计。说白了,就是决定用哪颗“大脑”来指挥全局,以及怎么让传感器和电机乖乖听话。

我个人习惯,做任何硬件设计之前,先画一张系统框图。别急着焊板子,先把架构想明白,后面能省一半的调试时间。你想想看,点钞机这东西,既要高速识别钞票,又要精准控制电机,还得实时处理传感器数据,选错主控芯片,后面全是坑。

2.1 主控芯片选型:STM32 vs FPGA

这是很多新手工程师纠结的问题。我直接说结论:点钞机的主控,我建议用STM32 + FPGA的异构方案。为什么?听我慢慢讲。

核心观点:STM32负责逻辑控制、通信、人机交互;FPGA负责高速图像采集、传感器信号预处理、电机脉冲精确控制。各司其职,互不干扰。

2.1.1 STM32——系统的大脑

STM32的优势在于生态成熟、开发快、外设丰富。我选它做主控,主要看中三点:

  • 实时性够用:点钞机的控制逻辑(按键响应、LCD刷新、通信协议)不需要纳秒级响应,STM32的Cortex-M4/M7内核完全够用。
  • 外设丰富:多路UART(接传感器、接上位机)、SPI(接FPGA)、I2C(接EEPROM)、定时器(电机PWM),基本不用额外扩展。
  • 成本可控:一颗STM32F407或F429,几十块钱,性价比很高。

我在项目中遇到过一个问题:早期方案只用了一颗STM32F103,结果发现图像处理占用了大量CPU时间,导致电机控制出现抖动。后来换成F407,并引入FPGA做图像预处理,问题才解决。嗯,这里要注意——不要试图让MCU干它不擅长的事

2.1.2 FPGA——高速并行的加速器

FPGA在点钞机里的角色,说白了就是“硬件加速器”。钞票以每秒10张的速度通过传感器,每张钞票的图像数据量可能达到几兆字节,MCU根本来不及处理。FPGA可以并行处理这些数据,实时完成边缘检测、特征提取、模板匹配。

我建议选Altera Cyclone IV或Xilinx Spartan-6级别的FPGA,逻辑单元在10k~30k之间就够用。为什么?

  • 点钞机的图像传感器(CIS或CMOS)输出的是并行数据,FPGA可以直接用硬件逻辑接收,不需要经过CPU轮询。
  • 电机驱动需要精确的步进脉冲,FPGA可以生成微秒级精度的脉冲序列,比MCU的定时器中断更稳定。
  • FPGA内部可以构建FIFO缓存,解决传感器数据与MCU处理速度不匹配的问题。

我的经验:FPGA和STM32之间用SPI通信,速率设置在10Mbps以上。FPGA作为SPI从机,STM32作为主机。FPGA把处理好的特征数据(比如钞票的宽度、厚度、磁性分布)打包发送给STM32,STM32只做决策,不做底层计算。

2.2 传感器系统架构

点钞机的传感器,我把它分成三类:图像传感器、物理特征传感器、位置传感器。每一类都有讲究。

2.2.1 图像传感器——点钞机的“眼睛”

目前主流方案是CIS(接触式图像传感器)。它体积小、功耗低、分辨率高。我常用的型号是CIS 200DPI或300DPI,扫描宽度刚好覆盖人民币的宽度。

架构上,CIS输出的是模拟信号,需要经过AFE(模拟前端)转换成数字信号。AFE芯片我推荐TI的ADS系列,或者用FPGA内部集成的ADC模块。注意:CIS的驱动时序很关键,需要FPGA产生精确的行同步信号和像素时钟。

避坑指南:我曾经在CIS的电源滤波上吃过亏。CIS对电源噪声非常敏感,纹波超过50mV就会在图像上出现条纹。后来我在CIS的供电引脚上加了一颗10μF钽电容和一颗0.1μF陶瓷电容,问题才解决。记住——模拟电路的电源,怎么干净都不为过

2.2.2 物理特征传感器——厚度、磁性、荧光

点钞机不仅要看钞票的样子,还要摸它的“手感”。常用的物理传感器有:

传感器类型 检测内容 输出信号 接口方式
厚度传感器 钞票厚度(判断是否夹带异物) 模拟电压(0~5V) ADC采集
磁性传感器 钞票上的磁性油墨分布 模拟电压(微弱信号) 运放放大后ADC采集
荧光传感器 钞票在紫外光下的荧光反应 模拟电压 ADC采集
红外传感器 钞票对红外光的透射/反射特性 模拟电压 ADC采集

这些传感器的信号都很微弱,需要经过运放调理电路。我习惯用LMV358或OPA2333这类低噪声运放,放大倍数设置在10~100倍之间。注意:每个传感器通道都要加低通滤波器,截止频率设在1kHz左右,滤掉高频噪声。

2.2.3 位置传感器——钞票走到哪了?

点钞机需要知道钞票的实时位置,才能控制电机启停和分钞机构。常用的位置传感器有:

  • 光电对射传感器:安装在进钞口、出钞口、分钞轮处。钞票遮挡光线时输出电平变化。
  • 霍尔传感器:检测电机转子的位置,用于闭环控制。
  • 编码器:安装在电机轴上,精确反馈转速和角度。

我建议在进钞口和出钞口各装一对光电传感器,间距刚好是一张钞票的长度。这样FPGA可以通过检测两个传感器的遮挡顺序,判断钞票是正常通过还是卡住了。

2.3 电机驱动与控制架构

点钞机的电机系统,说白了就是“送钞”和“分钞”。送钞电机负责把钞票一张张送进去,分钞电机负责把重叠的钞票分开。这两个电机必须协同工作,否则就会出现卡钞或连张。

2.3.1 电机选型:步进电机 vs 直流无刷电机

我推荐用两相步进电机。为什么?

  • 步进电机可以开环控制,不需要编码器反馈,成本低。
  • 点钞机的转速不高(通常300~600rpm),步进电机在这个区间扭矩稳定。
  • 步进电机的启停响应快,适合频繁启停的点钞场景。

当然,如果你要做高端机型,要求静音和长寿命,可以考虑直流无刷电机(BLDC)。但BLDC需要霍尔传感器或FOC控制,成本翻倍,调试也复杂。我个人觉得,普通商用点钞机用步进电机就够了。

2.3.2 驱动芯片选型

步进电机驱动芯片,我常用的是DRV8825或A4988。这两款芯片都是微步进驱动,支持1/16细分,可以大大降低电机振动和噪声。

架构上,STM32通过GPIO控制驱动芯片的STEP、DIR、ENABLE引脚。FPGA负责生成精确的STEP脉冲。为什么不让STM32直接生成?因为STM32的定时器中断会被其他任务打断,导致脉冲间隔不均匀,电机就会抖动。FPGA用硬件逻辑生成脉冲,稳定可靠。

关键参数:步进电机的驱动电流设置在1.5A~2A之间,细分设置为1/8或1/16。电流太小扭矩不足,电流太大电机发热严重。我一般用示波器观察电机相电流波形,调到正弦波最平滑的状态。

2.3.3 控制策略:速度曲线与加减速

点钞机启动时,电机不能直接全速运行,否则钞票会飞出去。需要设计一个S型加减速曲线。我常用的方法是:

// 伪代码:步进电机S型加速
void motor_accelerate(int target_speed) {
    int current_speed = 0;
    int step_delay = 2000;  // 初始延时,单位us
    while (current_speed < target_speed) {
        // 每步减小延时,实现加速
        step_delay = step_delay - (step_delay / 20);
        if (step_delay < 500) step_delay = 500;  // 最小延时限制
        generate_step_pulse(step_delay);
        current_speed++;
    }
}

这个算法很简单,但实际项目中我踩过坑。有一次我发现电机在加速过程中有“咔咔”的异响,查了半天发现是步进电机的共振频率在200Hz左右,而我的加速曲线刚好在这个频率停留太久。后来我调整了加速斜率,让电机快速通过共振区,问题就解决了。

我的建议:在FPGA内部实现一个状态机,管理电机的加速、匀速、减速三个阶段。同时,用FPGA实时监测光电传感器的信号,一旦检测到卡钞,立即停止电机并反转几圈,把钞票吐出来。这个响应时间必须控制在1ms以内,MCU做不到,FPGA可以。

2.4 系统架构总结

好了,我们把整个系统架构串起来看看:

  1. 传感器层:CIS图像传感器、厚度/磁性/荧光传感器、光电位置传感器,全部连接到FPGA。
  2. FPGA层:负责传感器数据采集、图像预处理、电机脉冲生成、卡钞检测。处理后的特征数据通过SPI发送给STM32。
  3. STM32层:负责系统逻辑控制、人机交互(按键、LCD)、通信(USB/RS232)、数据存储。根据FPGA上报的特征数据,判断钞票真伪和面额。
  4. 电机驱动层:步进电机+DRV8825驱动芯片,由FPGA直接控制STEP脉冲。

这个架构我用了好几年,在多个项目中验证过,稳定可靠。你想想看,如果只用一颗MCU,所有事情都挤在一起,调试起来得多痛苦?

下一章,我们会深入讲解传感器电路的具体设计,包括CIS的驱动时序、运放电路的计算、ADC的选型。到时候我会拿出我实际项目中的原理图,咱们一起分析。

嗯,今天就到这里。记住一句话:架构设计决定了产品的上限,细节设计决定了产品的下限。别急着画板子,先把架构想清楚。