第一章:点钞机系统概述
大家好,我是老李。做嵌入式这行快十五年了,点钞机是我接触过最「较真」的项目之一。今天咱们聊聊点钞机的整体架构,以及它为什么对实时性要求这么苛刻。
说实话,我第一次拆开点钞机的时候,心里想的是:「这不就是个带轮子的计数器吗?」后来才发现,事情远没那么简单。
1.1 硬件架构:三个核心模块
点钞机的硬件,说白了就是三大部分:机械传动、传感器阵列、主控板。我习惯把它们比作人的手、眼睛和大脑。
| 模块 | 核心器件 | 我的经验 |
|---|---|---|
| 机械传动 | 步进电机、搓钞轮、分钞轮 | 电机抖动会直接影响传感器读数,我踩过这个坑 |
| 传感器阵列 | 红外对管、磁头、CIS图像传感器 | CIS的时钟频率不能太高,否则图像会拖影 |
| 主控板 | ARM Cortex-M4/M7、FPGA、DDR | 我建议用M7做实时控制,FPGA做图像预处理 |
嗯,这里要特别说一下传感器。点钞机通常有6-12对红外传感器,分布在钞票通道的不同位置。它们负责检测钞票的长度、宽度、厚度、磁性。我曾经在一个项目里,因为红外传感器的安装角度偏了0.5度,导致假币漏检率飙升了3%。
关键点:传感器数据采集必须同步。如果左红外和右红外采集时间差超过100微秒,钞票的倾斜角度就算不准了。
1.2 软件架构:三层结构
软件架构我习惯分成三层:驱动层、算法层、应用层。你想想看,如果这三层耦合在一起,调试起来有多痛苦?
- 驱动层:直接操作寄存器,控制电机、读取传感器。这一层我要求代码行数不超过2000行,多了就容易出bug。
- 算法层:处理传感器数据,识别面额、鉴伪。这里最耗CPU,我建议用定点数运算代替浮点。
- 应用层:人机交互、通信协议、日志记录。这一层可以跑RTOS的任务调度。
我记得有个项目,同事把鉴伪算法和电机控制写在了同一个中断里。结果电机一转,算法就卡死,钞票直接卡在通道里。后来我强制要求:中断服务函数里只做数据搬运,不做复杂计算。
我的习惯:驱动层用状态机实现,算法层用流水线设计。这样每个模块都可以单独测试。
1.3 实时性要求:硬实时与软实时
点钞机的实时性要求,说白了就是「该快的时候必须快,该准的时候必须准」。我把它分成两类:
| 类型 | 要求 | 典型场景 |
|---|---|---|
| 硬实时 | 响应时间 < 1ms,错过就出事故 | 电机急停、传感器触发 |
| 软实时 | 响应时间 < 10ms,偶尔错过可以接受 | LCD刷新、按键扫描 |
为什么会这么严格?因为钞票通过传感器的速度大约是2米/秒。如果电机控制延迟了1ms,钞票就多走了2毫米,可能直接撞到挡板。我曾经遇到过这种情况:客户投诉说机器老是卡钞,查了三天才发现是中断优先级配错了。
避坑指南:我曾经把电机控制中断设为最低优先级,结果传感器中断一多,电机就丢步。后来我规定:电机控制中断优先级必须高于所有通信中断。
1.4 一个典型的时序约束
咱们来看一个具体的例子。假设钞票以2m/s的速度通过CIS传感器,CIS的分辨率是200DPI(每英寸200个像素)。那么:
// 钞票移动速度:2 m/s = 2000 mm/s
// 每毫米像素数:200 DPI ≈ 7.87 像素/mm
// 每像素对应时间:1 / (2000 * 7.87) ≈ 63.5 微秒
// 所以CIS的触发周期必须 ≤ 63.5 微秒
// 我一般留50%余量,设为40微秒
#define CIS_TRIGGER_PERIOD_US 40
嗯,这里要注意。如果CIS的触发周期超过63.5微秒,图像就会在钞票移动方向上被拉伸,导致鉴伪算法误判。我建议用定时器的PWM输出来触发CIS,而不是用软件延时。
1.5 总结一下
点钞机系统,硬件上要处理好传感器和电机的配合,软件上要分层解耦,实时性上要区分硬实时和软实时。我个人觉得,最难的不是某个技术点,而是把这些东西揉在一起还能稳定运行。
下一章咱们聊聊传感器数据采集的时序优化,我会分享一些具体的代码优化技巧。
一句话记住:点钞机的核心就三个字——快、准、稳。快是实时性,准是算法精度,稳是系统鲁棒性。