2、门锁需求分析:中控锁功能定义、输入信号、输出信号
好,咱们正式开始动手之前,先把需求理清楚。这一步做扎实了,后面写状态机才不会翻车。
中控锁,说白了就是「一键控制全车门锁」。你按一下遥控器,四个门同时锁上或解锁。听起来简单,但实际项目里坑不少。我最早做这个功能时,就吃过「信号抖动」的亏,后面会细说。
2.1 中控锁的核心功能
中控锁要干三件事:
- 集中闭锁:所有车门同时上锁
- 集中解锁:所有车门同时解锁
- 自动落锁:车速超过某个阈值(比如20km/h)时自动上锁
嗯,这里要注意——自动落锁不是所有车型都有,但咱们做课程,得把这个功能加进去,因为它是状态机里一个典型的状态切换场景。
重要原则:中控锁的「锁」和「解锁」是互斥的。你不能同时让电机正转和反转,否则会烧驱动芯片。我在项目中见过一次,就是因为软件逻辑没处理好,两个PWM信号同时输出,结果MOS管直接冒烟了。
2.2 输入信号分析
输入信号有三个来源。咱们一个一个看。
2.2.1 遥控信号
遥控器发来的指令,通常是两路:
- 锁车信号:高电平有效,持续100ms左右
- 解锁信号:高电平有效,持续100ms左右
你想想看,这两个信号会不会同时来?理论上不会,但实际中如果遥控器电池快没电了,或者受到干扰,就可能出现「毛刺」。我建议在代码里加一个去抖处理,比如连续采样3次都有效,才认为信号有效。
我的习惯:用定时器中断每10ms采样一次,连续3次相同才更新状态。这样既简单又可靠。
2.2.2 门碰信号
门碰开关,就是车门上那个小按钮。它告诉ECU:门是开着还是关着。
- 门开:信号为低电平(或高电平,看电路设计)
- 门关:信号为高电平
这个信号有什么用?举个例子:如果车门没关好,你按遥控锁车,电机应该转吗?
我个人觉得,应该转。因为有些车主就是先按锁车,再用力关门。但如果你在门开时禁止锁车,那电机就不动,车主会以为遥控坏了。所以咱们的设计是:门开时允许锁车,但门开时不允许解锁——解锁后门还开着,那解锁有什么意义?
我曾经踩过的坑:门碰信号有抖动。车门关闭瞬间,开关会弹跳好几次。如果不做滤波,状态机可能在一个周期内来回切换好几次。我后来加了一个50ms的软件滤波器,才把这个问题压下去。
2.2.3 车速信号
车速信号来自ABS或仪表盘,通常是方波脉冲。频率越高,车速越快。
咱们做状态机时,不需要精确计算车速,只需要知道「是否超过阈值」。比如:
- 车速 < 20 km/h:认为低速
- 车速 ≥ 20 km/h:认为高速,触发自动落锁
这里有个细节:自动落锁只触发一次。车速从20降到19,不会自动解锁。解锁只能靠遥控或手动操作。这是安全考虑——万一你在高速上开车,自动解锁了,那多危险。
2.3 输出信号分析
输出信号控制执行器。咱们主要管两样:电机和LED。
2.3.1 电机正反转控制
中控锁电机是直流有刷电机,通过H桥驱动。控制逻辑如下:
| 控制信号 | 电机动作 | 说明 |
|---|---|---|
| IN1=1, IN2=0 | 正转(锁车) | 电机正转,锁舌伸出 |
| IN1=0, IN2=1 | 反转(解锁) | 电机反转,锁舌收回 |
| IN1=0, IN2=0 | 停止 | 电机不转,保持位置 |
| IN1=1, IN2=1 | 禁止 | 会烧驱动,绝对不要用 |
你看,最后一行是禁止状态。我刚开始做嵌入式时,觉得「两个都置1」也没什么,结果一上电,驱动芯片烫得能煎鸡蛋。从那以后,我每次写电机控制代码,都会加一个断言检查:if(IN1 && IN2) { error_handler(); }
2.3.2 LED指示
LED用来告诉用户当前状态。通常设计成:
- 锁车状态:LED常亮(或闪烁一下后熄灭)
- 解锁状态:LED熄灭
- 自动落锁:LED闪烁两次提示
这个LED其实挺有讲究的。有些车用双色LED(红/绿),红色代表锁,绿色代表解锁。咱们课程里用单色LED就够了,但你要知道,实际产品中LED的驱动方式会影响功耗——尤其是休眠时,LED不能漏电。
小技巧:LED可以用PWM控制亮度,白天亮一些,晚上暗一些。但咱们做状态机,先不考虑这个,把逻辑跑通再说。
2.4 需求总结
好,咱们把需求整理成一张表,方便后面建模时对照:
| 功能 | 触发条件 | 输出动作 | 备注 |
|---|---|---|---|
| 遥控锁车 | 遥控锁信号有效 | 电机正转200ms,LED亮 | 门开时也执行 |
| 遥控解锁 | 遥控解信号有效 | 电机反转200ms,LED灭 | 门开时不执行 |
| 自动落锁 | 车速≥20km/h | 电机正转200ms,LED闪烁两次 | 只触发一次 |
| 门状态监测 | 门碰信号变化 | 更新内部状态 | 需去抖处理 |
嗯,到这里,需求就分析完了。下一章咱们会把这些需求转化成状态机模型。你想想看,有了这张表,画状态图是不是就清晰多了?
我个人习惯是,先把输入输出信号定义清楚,再画状态图。这样写代码时,每个信号对应一个GPIO或一个变量,不会乱。
好,咱们继续往下走。