天津安中通讯电子有限公司 刘宗鹏
汽车中控门锁控制器及遥控器的研发设计
天津安中通讯电子有限公司刘宗鹏
导语:汽车门锁是汽车车身的重要部件,其发展趋势是由机械式向电子化演变。汽车中控门锁(简称中控门锁)是为了使汽车的使用更方便和安全,对4个车门的锁闭和开启实行集中控制。
汽车中控门锁的基本结构:
1.基本结构
中控门锁的工作原理是将电能转化为机械能,用电动机带动齿轮转动来开关车门。基本组成主要由门锁开关、门锁执行机构、门锁控制器。
2.遥控原理
中控门锁的无线遥控功能是指不用把钥匙键插入锁孔中就可以远距离开门和锁门。
遥控的基本原理:从车主身边发出微弱的电波,由汽车天线接收该电波的信号,经电子控制器ECU识别信号代码,再由该系统的执行器(电动机或电磁线圈)执行启、闭锁的动作。
本论文所阐述的汽车中控门锁控制器结构框图如下:
从上图来看原理非常简单,但实现起来却要经过精心的设计和反复的实验。既要考虑成本又要安全可靠稳定,密码无重复且不易破解,整机静态耗电流要控制在10毫安以下。遥控距离要在20米且灵敏无卡壳现象。
下面就从硬件电路设计和软件编程两大方面详细讲解如何一步一步实现整机。
硬件电路方面:
1.印制电路板的设计
经过实际测量可知 车门锁在动作时电流大约在10A左右,由于汽车一共有4个车门再加上车灯,他们同时动作时电流非常大,大约在10A---30A左右,所以印制电路板基板要设计成1.6毫米厚的,铜箔厚度要35微米,这个很重要。这样才能保证控制器有足够的电流驱动能力使车门锁块动作而控制器整机安全可靠无发热变形、铜箔线路爆裂、板子燃烧等现象发生。
2.电源供电电路的设计
基于整机静态耗电流要控制在10毫安以下及汽车电源多为12伏,把锁块的动作直接由汽车电源来提供大电流,而整机需要提供给继电器和MCU、接收解码等电路的电流非常小,大约10mA—30mA,从而选用了78L05这个三端稳压管电路。78L05电路简单,外围元件很少。输入端使用一个100uF的电解电容和一个滤波电容0.1uF即可。这个电路可提供的最大电流100—150毫安。输入电压17伏到7伏。输出5伏稳定可靠。电路虽然简单,但因为它是整个电路板工作可靠的基础,必须保证输出稳定耐用,所以购买元件时一定要防止买到假货。同时它在电路板上的布局更是至关重要,因为要和接收解码电路同处一个板子上,它会干扰解码,且要分别给接收解码电路、MCU、继电器供电,所以这个电路必须放在远离接收电路的位置,这样才能最大限度的减少对接收解码的干扰。摆放位置可以靠近继电器,这样还有利于电路板Layout。
3.MCU电路的设计
MCU的选择主要由以下几点来决定:(1)元器件的采购成本。(2)开发人员对它的熟悉程度,如果选用了不熟悉的MCU则势必延长开发周期,耽误市场。(3)它的内部资源是否够用且满足功能设计要求。
鉴于以上几点我选择了ST公司的M8系列的单片机。20个管脚,内部有定时器,ADC,中断等资源。满足了设计的所需资源。
4.接收解码电路的设计
接收遥控器解码电路是整个控制器的灵魂,它的设计至关重要。必须精心设计。最初我选用了SYN480R这个接收解码芯片作为接收解码。它集成度高,外围电路设计简单,所用元件很少。接收灵敏度高 -106dbm,接收距离理论上符合20米的要求。可以接收固定码和滚动码。频率在2500Hz。但是在实际作出第一版整机,安装到汽车内测试后发现接收距离约9—10米。与理想的距离相差太多。无法满足设计需求。反复查找原因,改变电路元件参数都无功而返。实践证明汽车的外壳对于这个芯片来说产生了阻碍,把遥控器的发射信号衰减的过于小,所以无发正确解码执行动作。经过再次选件和反复测试,最终选用了SYN510,这个芯片与SYN480R属于同一公司生产的同一系列的芯片。工作原理相同,电路设计方面很相近,但接收灵敏度增加到了-110dbm,对于汽车外壳可以穿透。实际接收距离比SYN480R高了很多,测试后符合最初的设计要求。
5.锁块控制和车灯控制等电路的设计
这部分的电路设计相对比较简单,只需简单的控制继电器的供电引脚,通过打开和关闭汽车电源来控制继电器通断引脚的开和关进而控制锁块的动作,这里不做过多讲解。需要注意的地方就是线路板设计时连接锁块的引脚的铜皮必须足够宽,以承受大电流的通过。线路板设计时在这些引脚的铜皮上增加镀锡层,这样可以增强电流的通过能力。
6.遥控器的设计
这部分也是至关重要的部分,它的设计好坏直接影响着接收距离和灵敏度。尤其是线路板天线的设计,它是遥控器的发射天线,接收的距离很大程度上与它有关。实践证明经历了9次的画电路板、投板测试,才达到了20米的距离要求。每一次电路板的问题都集中在天线的画法上。不同的铜皮形状、厚度、阻抗等对接收距离影响非常大。经过与天线公司的工程师配合测试,最终发现阻抗接近50欧姆,发射功率集中,是最接近理想的方案。
软件方面的设计:
主要分两大部分,主MCU程序的编写和遥控器的密码烧写,尤其以主MCU程序的编写最为关键。下面主要讲解主MCU程序的编写,遥控器的密码烧写较为简单,不做重点分析。
主MCU选取的是ST公司的M8系列单片机--STM8S103。它的端口配置及所用ADC、时钟、定时器等资源的初始化可以参考STM8S103手册,直接套用就可。重点讲解接收遥、度和速度,我采用中断加查询方式来处理,每次中断发生时做好标记,当标记符合编码头指令的位数时给解码标记置位,在主程序大循环中进行接收滚码和固定码部分,并解码、对比判断、执行动作。中断采用上升和下降沿中断,每接收到上升沿给解码标记置位。在主程序中继续处理。这样一位数据一位数据的接收,直到66位数据接收结束再进行解码、判读、执行动作处理。中断程序如下:
if(GPIO_ReadInputPin(ReCtrl_PORT,ReCtrl_PIN) == 0){Low_Time=0;}else
{tmpLowTime0=Low_Time;Receive_Flag = 1;}
由于长江流域东西走向,同处于亚热带湿润季风区,生态要素配置大体相同,并又有能通航的长江干流联系;但长江流域又有多个相对独立的自然地理单元。因此,长江流域的文化又极具多样性,如楚文化、荆楚文化、湖湘文化、吴文化、越文化、徽文化、赣文化、江淮文化、巴蜀文化和客家文化,各种文化既具同一性又有多样性,最终融合成完整的长江流域文明。南宋以后,长江流域成为全国经济社会的重心。鸦片战争以后,工业文明传播到中国,最早工业化的城市主要也分布在沿着长江而上的上海、武汉和重庆等地。进入新时代,我国长江流域经济带和海岸带经济带将形成“T”字形的战略构架,起到引领中华民族强起来的历史使命。
HCS301芯片发射的编码格式如下:
数据“1”用两个低电平一个高电平表示数据“0”用两个高电平一个低电平表示。
整个编码由(前导码+数据头+滚码+固定码+防护)组成。有效数据共66个数据,其中滚码32位,固定码34位。固定码由序列号和按钮编码和状态码组成。
程序的重点是解码滚码部分。程序如下:
函数名:解密函数
void Decrypt(void)
{ uint8_t i=12,k=48,tmpi=0,C=0,a=0,b=0,mask_c=0,mask_c_h=0, mask=0, table[4];
table[0]=0x2e;table[1]=0x74; table[2]=0x5c;table[3]=0x3a;
KEY0=0xEF; KEY1=0xC6;KEY2=0x5E;KEY3=0xB0;KEY4 =0xD4;KEY5=0xC9;
KEY6=0xA2;KEY7=0xC7;KEY_compress();
i=12; k=48;for(i=12;i>0;i--) { for(k=48;k>0;k--){tmpi=i^0x1; if(tmpi!=0)
{C=0;if((hop3&0x08)!=0){mask=0x10;}else{mask=0x1;}if((hop2 &0x01)!=0) {mask_c_h=mask&0x80;mask_c=C;if(mask_c!=0){mask=( mask<<1)+1;}else{mask=mask<<1;} mask_c=mask&0x80;if(mask_c_h ==0x80){mask=(mask<<1)+1;}else{mask=mask<<1;}mask_c_h=0;}
if((hop1&0x01)!=0){mask_c_h=mask&0x80;if(mask_c!=0){m ask=(mask<<1)+1;}
else{mask=mask<<1;}mask_c=mask&0x80;mask_c=mask_c_ h;mask_c_h=0;}
a=0;if((hop4&0x02)!=0){ a=a+1;}if((hop4&0x40)!=0){a=a+2;}
mask=table[a]&mask;if(mask!=0){b=0x80;sawed=hop2^b;sawed=hop4^sawed;
sawed=KEY1^sawed;}else{b=0x00;sawed=hop2^b;sawed=hop4^sawed;
sawed=KEY1^sawed;}mask=sawed;mask_c_h=mask&0x80;if(mask_c!=0){
mask=(mask<<1)+1;}else{mask=mask<<1;} mask_c=hop1&0x80;
if(mask_c_h!=0){hop1=(hop1<<1)+1;}else{hop1=hop1<<1;}mask_c_h=hop2&0x80;
if(mask_c!=0){ hop2=(hop2<<1)+1;}else{hop2=hop2<<1;}mask_c=hop3&0x80;
if(mask_c_h!=0){hop3=(hop3<<1)+1;}else{hop3=hop3<<1;}mask_c_h=hop4&0x80;
if(mask_c!=0){hop4=(hop4<<1)+1;}else{hop4=hop4<<1;}mask_c=mask_c_h;
mask_c_h=0;}C=0;tmpAddr_Code_MSB=Addr_Code_MSB&0x80000000;
if(tmpAddr_Code_MSB!=0){C=1;}tmpAddr_Code_LSB=Addr_Co de_LSB&0x80000000;if(C==0){Addr_Code_LSB=Addr_Code_LSB<< 1;}else{Addr_Code_LSB=(Addr_Code_LSB<<1)+1;} tmpAddr_Code_M SB=Addr_Code_MSB&0x80000000;if(tmpAddr_Code_LSB==0){
Addr_Code_MSB=Addr_Code_MSB<<1;}else{ Addr_Code_MSB= (Addr_Code_MSB<<1)+1;}
C=tmpAddr_Code_MSB;KEY1=(uint8_t)((Addr_Code_LSB&0x00 00ff00)>>8);}} }
程序的原理见下图:
这部分解密后与主MCU的FLASH中储存的密码相比,如果一致则解密正确,否则错误。
解密正确后,按照按钮指令执行相应动作。具体按钮的动作根据产品要求自己定义。
这样整个流程就结束了,再重复执行下次,如此反复便完成了整个程序。
整体程序流程如下:
遥控器HCS301芯片的密码烧写如下图:
我使用的是专用烧写器。由于操作比较简单,只需设置好密钥和格式,在这里不做过多讲解。
参考文献
[1]STM8S103参考手册.
[2]HCS301芯片手册.