车窗防夹算法的探究和实现
引言随着汽车的普及,汽车的安全性越来越受到人们的重视,毕竟这是关乎生命安全的大事。而现在汽车多采用电动车窗,但是电动车窗仍存在着较大的安全隐患。到目前为止已经有多起乘客被上升的车窗夹伤的事故被报道,其中大部分受伤者是儿童,因此电动车窗防夹保护被提出。所谓电动车窗防夹保护,就是一旦在车窗自动上升过程中侦测到有障碍物的存在,车窗就自动停止向上运动,防止损毁障碍物;并向下运动,以释放障碍物。
电动车窗防夹的基本思想可以概括为:在车窗自动上升过程中,传感器检测到障碍物的存在(包括已被夹或判断有障碍物存在上升途中)。当检测到有障碍物存在时,驱动电机反转,使车窗下降一段距离,释放障碍物。本文介绍的防夹保护算法主要是通过检测电机转速的变化来实现的。
电机周期的测量
在防夹设计中,严格地说涉及到的参数应该是电机的转速。但是,在本课题中,更确切地说,检测到的不是转速,而是周期。本课题采用Timer模块里的捕捉模式来检测两个脉冲下降沿之间的时间间隔从而得到周期值。周期越大,速度就越慢,反之,周期越小,速度就越快。因此,从功能上看,两个参数的效果是一致的。为了节省微控制器的资源,就直接周期来代替速度进行防夹检测。
捕捉计算到脉冲周期与实际的脉冲周期之间的换算关系为:
Timer设置的是16预分频,重装载值为0000H,因此它的溢出周期为43ms,分辨率为2.7ms。
在周期检测中,霍尔传感器的输出脚与XC886的P3.4口相连。P3.4复用为Timer21脉冲捕获模式的输入引脚。本课题中,当霍尔传感器输入为脉冲下降沿时,Timer产生中断,并在中断程序中计算周期。具体计算流程如下:
其中,Pre_reload为前一次脉冲到达时寄存器中的值,用当前值减去前一次的值即为周期。值得一提的是,period_count这个变量。当计时器溢出一次,period_count就加一。从而避免因计时器溢出而导致周期计算错误。
实现的具体做法是:由于只需在车窗自动上升时进行防夹。所以首先先判断是否为自动上升。若是自动上升,则判断是否为第一次进入中断程序,如果是第一次进入中断,将当前计数器中的值存入变量 Pre_reload,如果不是第一次进入,则将当前计数器的值减去Pre_reload的值作为周期值,再将当前值存入Pre_reload中。留待下一次进入中断时使用。每进入一次中断就如此工作,直到收到停止命令或车窗到达顶部为止。
车窗位置的确定
车窗在上升过程中,由于存在车窗重量和窗框阻力等因素,在每个位置上的周期大小是不一样的。因此判断车窗位置也是相当重要的。从机械的角度讲,电机旋转会带动钢丝绳的运动,从而带动车窗的上下开闭。电机每旋转一定角度,钢丝绳就相应地运动一定行程,因此车窗运动的行程与电机旋转的圈数成线性关系。而电机的旋转会使得霍尔传感器产生脉冲信号,因此车窗位置也可以采用霍尔传感器和XC886CS中的计时器模块相结合的方式来测量。当电机转过一圈,计时器Timer就会捕获到霍尔信号的下降沿,从而在中断服务程序中对车窗位置作出记录。由于车窗有可能上下运动,因此车窗位置的计算不能只在车窗上升时进行,在车窗下降的时候也要作出相应的调整。因此程序在进入中断服务后首先查询车窗的状态是上升还是下降。如果是上升,则电机每转动一圈车窗位置就相应递增;如果是下降,则电机每转动一圈,车窗位置就递减。
防夹车窗算法的提出和实现
本课题采用的防夹算法是基于电机运行参数的方法。如何得到准确的运行参数即周期,是防夹算法能否实现的关键。本课题还根据实际运行中发现的算法纰漏,对算法进行优化。
防夹试验数据分析
为了得到确切的基准周期和电流值,我们使用通过串口发送数据的方法。利用Keil C中的UART_vSendData8(ubyte ubData)语句发送周期和电流值,并利用串口助手这个软件接收数据。
当车窗自动上升时,反复多次发送数据到显示器。取出运行较好的几组数据,取其平均值,计算出每个高度上每次运行时的实时值与平均值的差值,然后确定一个较适合的容差。
从串口发送出来的值中可以看到,车窗上升的脉冲周期,也就是车窗的上升速度从底部经过约12个脉冲后,基本呈线性上升的态势。由于通过串口发送数据可以得到在每个点上脉冲周期的确切值,因此对每个点上的周期值均可以取到多次试验结果的均值,通过对均值和各次试验的实际值相比较可以发现,这些值的均值在加上容差1846后,绝大多数的实际运行值都会小于该值,基于裕量和最大夹持力的考虑,最后决定选择容差大小为2000。
防夹算法的提出
在算法设计的时候,只考虑了在车窗自动上升的时候才进行防夹的情况。在其他三种情况下(包括车窗手动上升、车窗手动下降以及车窗自动下降)都不进行防夹判断。因为车窗下降不存在防夹的问题,如果车窗手动上升时有障碍物被夹持的话,则可以通过手的控制来避免被夹伤。在算法中采用标志位bWIN_Up_Down和bAutoFlag来标示车窗是否为自动上升,如果控制器得到的是自动上升的命令,则这两位置位。如果这两位为1,则进行防夹判断。还有值得注意的是,根据实验所得数据,车窗从底部启动的3个脉冲内其电压和脉冲周期值相当复杂而且随机,没有任何规律可循,而且在底部的3个脉冲车窗玻璃的总行程不会超过1cm,因此在这一段不进行防夹。
该算法的思想是,将上节中提到的基准周期存放在RAM里。然后在车窗自动上升过程中检测电机运行的实时周期值,将实时值与基准值进行比较,若两者之间的差值连续三个脉冲到来时超过容差,即认为有障碍物存在。车窗进入自动下降程序,车窗降到底部。若没有连续三个脉冲到来时超过或在容差之内,则认为无障碍物存在,则自动上升直到车窗顶部。
图2 正常状态下的周期和电流图
图3 发生夹住状况的周期和电流图
算法优化
根据算法在实际运行中存在的问题,必须对算法进行优化,以得到更好的防夹效果。
4.3.1 车窗在底部启动时的算法优化
根据对脉冲周期值的综合分析可知,在第12个脉冲周期之前,该值的变化十分不稳定,经常会出现超出容差范围的情况。在此之后该值基本上均在已定容差之内。因此对底部的启动问提,提出的方案是,滤去前12个脉冲点,也就是在前12个脉冲点上不进行防夹。理由是,前10个脉冲点为车窗最底部的部分,车窗行程不超过3cm,对防夹保护不会产生大的影响。
4.3.2 车窗到顶时的算法优化
通过实验可知,如果车窗正常上升的话,车窗玻璃在第209个脉冲时为车窗玻璃与上窗框密封条之间的接触点。车窗在进入上密封条后由于环境温度、空气湿度的不同导致密封条的摩擦力会不同,因此会出现有的时候车窗不能正常关闭的情况。
由此可以得出解决的办法,就是将防夹的上限从第223个脉冲,降至第208个脉冲,也就是在第208个脉冲以上不进行防夹,而以下还是按照原有的算法进行防夹。
4.3.3 车窗中途停止再启动时的算法优化
车窗中途停止再启动与底部启动其本质是一样的,两者的区别是,底部启动在第一个脉冲的时候虽然会大的离谱,但是在接下来的几个脉冲会有下降的趋势,能给出一个容差,使得两值能在容差范围内,但是中途停止再启动是连续几个脉冲大的离谱,而且随着车窗位置的不同以及中途停止时间的长短其大小也会发生变化,所以采取不同的策略进行算法优化。
在车窗启动的时候,忽略最先的8个脉冲以屏蔽由于车窗启动带来的脉冲周期的波动。在屏蔽之后,还是按照算法来进行防夹运算。8个脉冲是通过反复实验得到的较为合理的值,在8个周期后,周期值基本恢复正常,在容差之内。
图4 优化后的算法流程图
图5 发生防夹动作的周期和电路图
电动车窗防夹的总结
本课题采用的防夹算法是离散的,并不是实时的,只是在一定的时间对周期和电流进行采样。因为霍尔传感器的采样也不是实时的。这种方法适用于计算能力不是很强,处理速度不是很快的微处理器。
本课题采用的是绝对式防夹,在每个高度上检测周期和电流,与基准值比较,三次超出容差就认为有障碍物,进入防夹处理。
页:
[1]