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或一个变量,不会乱。

好,咱们继续往下走。