本帖最后由 DAHAIGE-355079 于 2015-11-24 14:27 编辑
现在低功耗,无线发射接收应用很普遍,本文就电动车遥控器常用的发射IC:EV1527解码做介绍。EV1527发射出来的波是进行调制过后的,借条电路有很多种,有专用的IC解调,有用分立元件搭的超再生解调电路,本文不做电路讲解;
需要知道的就是一条,经过解调出来的波形就是一串高低电平。
本测试EV1527的参数是:
工作电压:DC6V
OSC电阻:360K。
具体见EV1527的数据手册。
- //************************************************************************************************************
- unsigned char hh_w,ll_w; //高,低电平宽度
- unsigned char ma_x; //接收到第几位编码了
- unsigned char mma1,mma2,mma3,mma4; //用于解码过程
- unsigned char old_rc5; //保存上一次查询到的电平状态
- unsigned char tb_ok; //接收到同步的马时置1
- unsigned char rf_ok; //接收到一个完整的遥控命令后置1,通知解码程序可以解码了
- unsigned char bma1,bma2,bma3,bma4; //用于接收过程存放遥控编码
- // 4t = 1.81ms
- //time 180us调用
- void DecodingEv1527(void)
- {
- unsigned char RC5;
-
- // GPIO_WriteReverse(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS); //连接逻辑分析仪,查看T0中断时间间隔
-
- RC5 = GPIO_ReadInputPin(Ev1527_GPIO_PORT, Ev1527_GPIO_PINS);
- if(!RC5) // 检测到低电平 低电平时间加1,记录本次电平状态
- {
- ll_w++;
- old_rc5=0;
- }
- else // 检测到高电平
- {
- hh_w++;
- if (!old_rc5) // 检测到从低到高的跳变,已检测到一个完整(高-低)电平周期
- {
- if (((hh_w>=2)&&(hh_w<=3))&&((ll_w>=60)&&(ll_w<=93))) //判同步码
- {
- ma_x=0; tb_ok=1; bma1=0; bma2=0; bma3=0; bma4=0;
- }
- else if ((tb_ok)&&((ll_w>=6)&&(ll_w<=9))) //已经接收到同步码,判0
- {
- ma_x++;
- }
- else if ((tb_ok)&&((ll_w>=2)&&(ll_w<=3)))
- {
- switch (ma_x)
- {
- case 0 : { bma1=bma1 | 0x80; break; }//遥控编码第1位
- case 1 : { bma1=bma1 | 0x40; break; }
- case 2 : { bma1=bma1 | 0x20; break; }
- case 3 : { bma1=bma1 | 0x10; break; }
- case 4 : { bma1=bma1 | 0x08; break; }
- case 5 : { bma1=bma1 | 0x04; break; }
- case 6 : { bma1=bma1 | 0x02; break; }
- case 7 : { bma1=bma1 | 0x01; break; }
- case 8 : { bma2=bma2 | 0x80; break; }
- case 9 : { bma2=bma2 | 0x40; break; }
- case 10: { bma2=bma2 | 0x20; break; }
- case 11: { bma2=bma2 | 0x10; break; }
- case 12: { bma2=bma2 | 0x08; break; }
- case 13: { bma2=bma2 | 0x04; break; }
- case 14: { bma2=bma2 | 0x02; break; }
- case 15: { bma2=bma2 | 0x01; break; }
- case 16: { bma3=bma3 | 0x80; break; }
- case 17: { bma3=bma3 | 0x40; break; }
- case 18: { bma3=bma3 | 0x20; break; }
- case 19: { bma3=bma3 | 0x10; break; }
- case 20: { bma4=bma4 | 0x80; break; }//按键状态第1位
- case 21: { bma4=bma4 | 0x40; break; }
- case 22: { bma4=bma4 | 0x20; break; }
- case 23: { bma4=bma4 | 0x10;
- // mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//将接收到的编码复制到解码寄存器中
- //在下一行设一个断点,用ICD2调试
- // rf_ok=1; // 通知解码子程序可以解码了
- break;
- }
- default:break;
- }
- ma_x++;
- }
- else //接收到不符合的高-低电平序列
- {
- ma_x=0; tb_ok=0; bma1=0; bma2=0; bma3=0; bma4=0;
- }
- if(ma_x == 23)
- {
- mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//将接收到的编码复制到解码寄存器中
- //在下一行设一个断点,用ICD2调试
- rf_ok=1;
- }
- ll_w=0;hh_w=1;
- }
- old_rc5=1; // 记录本次电平状态
- }
- }
复制代码
|
谢谢你的分享~
// 4t = 1.81ms
//time 180us调用
怎么算的?