新人求助,关于自制红外遥控的问题

[复制链接]
2330|9
 楼主| danieldan007 发表于 2016-1-16 12:00 | 显示全部楼层 |阅读模式
本帖最后由 danieldan007 于 2016-1-16 12:04 编辑

最近在做一个自制红外遥控器,想控制空调(现在只能用这个做试验),所用单片机为CC2530,红外发射管为VS838,原理图如下:

其中P1_7输入38kHz,占空比为1/3的方波,P1_6通过输入0/1来控制电路的通断。最下面的“1”和“2”分别插入发射管的两个引脚。
空调是一般的格力挂式空调,遥控器型号为YB0FB2,已经确定它采用的是NEC格式的红外发射芯片,如图:

N编NEC的编码格式为
    引导码:9ms 的载波+4.5ms 的空闲。
·        比特值“0”:560us 的载波+560us 的空闲。
·        比特值“1”:560us 的载波+1.68ms 的空闲。
以下是我所写的程序:
  1. #include <ioCC2530.h>

  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define LED1 P1_6
  5. uint count = 0;
  6. uint count1 = 0;
  7. uint endcount = 0;
  8. uint flag = 0;
  9. void T3_Init()
  10. {
  11.   //T3产生38khz的载波,周期为26us  P1_7通道1,备用位置2
  12.   PERCFG |= 0x20;//T3备用位置2
  13.   T3CTL |= 0X0B;//0分频,选择PWM模式,即成16M,周期为0.0625us,关T3,发送引导码时开T3;开溢出,PWM
  14.   //0101 1100 开中断,compare-up,比较模式
  15.   T3CCTL1 |= 0X1C;
  16.   T3CCTL0 |= 0x1C;
  17.   //占空比1/3
  18.   T3CC0 |= 210;//202;
  19.   T3CC1 |= 140;//136;//140;
  20.   
  21.   P1SEL |= 0X80;//P1_7做外设使用
  22.   P1DIR |= 0Xc0;//P1_6 P1_7输出
  23. }

  24. void T1_Init()
  25. {
  26.   T1CTL |= 0X0C;//32M,128分频,周期4us,暂停模式,发送数据时设模模式
  27.   T1CTL |= 0x02;
  28.   T1STAT |= 0X21;//设溢出标志位
  29.   T1CCTL0 |= 0x04;
  30.   T1CC0L = 0x02;
  31.   T1CC0H = 0x00;
  32.   IRCON &= ~0x02;
  33.   
  34.   T1IE = 1;//开T1中断使能
  35.   EA = 1;
  36. }

  37. void Led_Init()
  38. {
  39.   P1DIR |= 0X40;
  40.   P1_6 = 0;
  41. }

  42. void Delay_ms(uint time)
  43. {
  44.   uint i,j;
  45.   for (i=time; i>0; i--)
  46.     for (j=1774; j>0; j--)
  47.       ;
  48. }

  49. void Begining()
  50. {
  51.   T3CTL |= 0X10;//开T3
  52. }

  53. void Counter_Delay(uint temp1, uint temp2)
  54. {
  55.   endcount = temp1;
  56.   flag = temp2;
  57.   count1 = 0;
  58.   while(1)
  59.   {
  60. //    EA = 0;
  61.     if(count1 < endcount)
  62.       EA = 1;
  63.         
  64.     else
  65.     {
  66.       EA = 1;
  67.       break;
  68.     }
  69.   }
  70. }

  71. void SendIRData_BYTE(uint irdata, uint num)
  72. {
  73.   uint i;
  74.   for(i = 0; i < num; i++)
  75.   {
  76.     Counter_Delay(23, 1);  //延时560us
  77.     if(irdata & 0x01)
  78.       Counter_Delay(69, 0); //延时1640us
  79.     else
  80.       Counter_Delay(23, 0);
  81.    
  82.     irdata = irdata >> 1;
  83.   }
  84. }
  85. //前导码
  86. void Preamble(void)
  87. {
  88.   Counter_Delay(375, 1); //延时9ms
  89.   Counter_Delay(187, 0); //延时4.5ms
  90. }
  91. void main(void)
  92. {
  93.   //32MHz XOSC
  94.   CLKCONCMD &= 0XBF;  //1010 1111
  95.   while (CLKCONSTA & 0X40)
  96.     ;
  97.   T3_Init();
  98.   T1_Init();
  99.   Begining();
  100.   Led_Init();
  101.   while (1)
  102.   {
  103.     Preamble();
  104.     SendIRData_BYTE(0x04, 8);
  105.     SendIRData_BYTE(0x0E, 8);
  106.     SendIRData_BYTE(0x20, 8);
  107.     SendIRData_BYTE(0x50, 8);
  108.     SendIRData_BYTE(0x02, 3);
  109.     //20ms
  110.     Counter_Delay(23, 1);
  111.     Counter_Delay(833, 0);
  112.     SendIRData_BYTE(0x00, 8);
  113.     SendIRData_BYTE(0x20, 8);
  114.     SendIRData_BYTE(0x00, 8);
  115.     SendIRData_BYTE(0xE0, 8);
  116.     Counter_Delay(23, 1);
  117.     Counter_Delay(8330, 0);
  118.   }
  119. }

  120. #pragma vector = T1_VECTOR
  121. __interrupt void T1_ISR(void)
  122. {
  123.   count1++;
  124.     if ((T1STAT & 0x01) > 0)//判断IRCON的bit1
  125.     {
  126.       T1STAT &= ~0x01;//清除中断标志
  127.       if (flag)
  128.       {
  129.         LED1 = 0;
  130.       }
  131.       else
  132.         LED1 = 1;
  133.     }
之前用的延时做的,后来我同学说延时不准确,建议用定时器,后来写了这个定时器的程序,结果还是不行,郁闷。
里面的编码都是我通过红外接收在示波器上看到的波形来判断出来的,基本不会有问题,格力空调的编码为“前导码+35位数据+间隔+32位数据”组成。
现在的问题就是,虽然波形与遥控器通过红外接收管产生的波形相同,但是脉宽却不尽相同,前后相差几十us,(比如我发的是560us,在P1_6测得的宽度是560us,经过载波以后有时候是500us有时候是600us还有时候正好是560us)根据NEC编码的协议来写的程序测得P1_6口的脉宽很稳定,但是经过载波之后的脉宽不是很稳定,有时候大有时候小,不知这是否属于正常现象。我用遥控器测得的脉宽就相对稳定一些。现在我用我的编码将发射管对准空调一点反应也没有,是否和这个脉冲宽度的调节有关?还是说我上面做的那个方面有问题?还请以前做过相关方面的指点一下,万分感谢呀!
下面这个是我将示波器的两个探头一个连在发射管上,一个连在接收管上得到的波形中的一段,还请大家帮我看一下这个波形是否正常,谢谢!
另外如果在以前做过红外方面有什么心得欢迎指教一下呀,我现在真是一点思路都没有了!



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| danieldan007 发表于 2016-1-16 15:45 | 显示全部楼层
没人做过这方面的嘛。。。还是我发错了板块。。。新人不懂啊~谁有啥想法也可以给我说一下呀,搞了一个月都没搞出来
lfjwfm 发表于 2016-1-16 20:17 | 显示全部楼层
靠近点能否控制到,或者贴到空调接收管上
 楼主| danieldan007 发表于 2016-1-16 20:19 | 显示全部楼层
lfjwfm 发表于 2016-1-16 20:17
靠近点能否控制到,或者贴到空调接收管上

就是说可能是因为发射功率不够大吗?那我试一下哈
diy1997 发表于 2016-1-16 22:26 | 显示全部楼层
做过一个被毙的: 遥控定时器。

遥控上有LCD,可以直接在遥控上设制定时时间,开关等。

用PWM 做载波,定时器里调制,不用搞那么麻烦的。

评分

参与人数 1威望 +1 收起 理由
danieldan007 + 1 很给力!

查看全部评分

 楼主| danieldan007 发表于 2016-1-17 10:36 | 显示全部楼层
lfjwfm 发表于 2016-1-16 20:17
靠近点能否控制到,或者贴到空调接收管上

成功了,我站到桌子上发射管距离空调只有20公分的时候终于成功把空调关了!真的是发射功率的问题呀,多谢多谢啦~不过您知道如何增大功率不

评分

参与人数 1威望 +1 收起 理由
guoxing2016 + 1 赞一个!

查看全部评分

chunyang 发表于 2016-1-17 16:44 | 显示全部楼层
把LED的限流电阻降低点。
 楼主| danieldan007 发表于 2016-1-17 21:30 | 显示全部楼层
chunyang 发表于 2016-1-17 16:44
把LED的限流电阻降低点。

好的,我用滑动变阻器试一下哈~
sz_walter 发表于 2016-1-17 21:44 | 显示全部楼层
1 估计每个发射管都得用单独的驱动电路。
2 载波调制用软件来实现,不要单独引出个I/O。
3 包络肯定有误差,但也是有范围的。
guoxing2016 发表于 2016-3-19 11:44 | 显示全部楼层
学习一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

11

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部