OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2955|回复: 2

stm32f407探索者如何正确发射红外信号

[复制链接]

4

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2019-9-24
在线时间
27 小时
发表于 2020-3-26 10:19:12 | 显示全部楼层 |阅读模式
10金钱
最近在玩红外遥控,想要发出正确的信号来控制设备,但目前遇到了点问题。下面是我的代码:

TIM3_PWM_CH2_Init(2200-1,1-1);//产生38khz的pwm波
想要发射8个0和8个1,一共16位,但是接收到的最后一位总是出错,要不是接收不到,就是接收到0,或者多接收几个0。有时候接收到15位,最后一个1不见了。有时候接收到16位,可最后一个是0,或者是17位,可最后两位都是0.  总之,不管如何,最后一个1就是不能正确接收到

红外发射管距离板子上的红外接收管很近,大概5厘米这样

信号发射代码://同步码,同步码由一个 9ms 的低电平和一个 4.5ms 的高电平组成
        TIM_SetCompare2(TIM3,0);        //此时不发射红外信号
        delay_ms(9);
        TIM_SetCompare2(TIM3,733);        //此时占空比约为1/3,发出38khz的红外信号
        delay_us(500);
        delay_ms(4);
        TIM_SetCompare2(TIM3,0);       

        delay_us(200);//这个延时是为了下面发射0做的
       
//发射8个0
       TIM_SetCompare2(TIM3,733);
        delay_us(560);
       TIM_SetCompare2(TIM3,0);       
        delay_us(560);       
        //0
       TIM_SetCompare2(TIM3,733);
        delay_us(560);
        TIM_SetCompare2(TIM3,0);       
        delay_us(560);
        //0
        TIM_SetCompare2(TIM3,733);
        delay_us(560);
        TIM_SetCompare2(TIM3,0);       
        delay_us(560);
        //0
        TIM_SetCompare2(TIM3,733);
        delay_us(560);
        TIM_SetCompare2(TIM3,0);       
        delay_us(560);
        //0
        TIM_SetCompare2(TIM3,733);
        delay_us(560);
        TIM_SetCompare2(TIM3,0);       
        delay_us(560);       
        //0
        TIM_SetCompare2(TIM3,733);
        delay_us(560);
        TIM_SetCompare2(TIM3,0);       
        delay_us(560);
        //0
        TIM_SetCompare2(TIM3,733);
        delay_us(560);
        TIM_SetCompare2(TIM3,0);       
        delay_us(560);
        //0
        TIM_SetCompare2(TIM3,733);
        delay_us(560);
        TIM_SetCompare2(TIM3,0);       
        delay_us(560);
               
//发射8个1
        TIM_SetCompare2(TIM3,733);
        delay_us(560);
        TIM_SetCompare2(TIM3,0);       
        delay_us(680);
        delay_ms(1);
        //1
        TIM_SetCompare2(TIM3,733);
        delay_us(560);
        TIM_SetCompare2(TIM3,0);       
        delay_us(680);
        delay_ms(1);
        //1
        TIM_SetCompare2(TIM3,733);
        delay_us(560);
        TIM_SetCompare2(TIM3,0);       
        delay_us(680);
        delay_ms(1);
        //1
        TIM_SetCompare2(TIM3,733);
        delay_us(560);
        TIM_SetCompare2(TIM3,0);       
        delay_us(680);
        delay_ms(1);
        //1
        TIM_SetCompare2(TIM3,733);
        delay_us(560);
        TIM_SetCompare2(TIM3,0);       
        delay_us(680);
        delay_ms(1);
        //1
        TIM_SetCompare2(TIM3,733);
        delay_us(560);
        TIM_SetCompare2(TIM3,0);       
        delay_us(680);
        delay_ms(1);
        //1
        TIM_SetCompare2(TIM3,733);
        delay_us(560);
        TIM_SetCompare2(TIM3,0);       
        delay_us(680);
        delay_ms(1);
        //1
        TIM_SetCompare2(TIM3,733);
        delay_us(560);
        TIM_SetCompare2(TIM3,0);       
        delay_us(680);
        delay_ms(1);
//连发码由 9ms 低电平+2.5m 高电平+0.56ms 低电平+97.94ms 高电平组成
        delay_ms(9);
        TIM_SetCompare2(TIM3,733);       
        delay_ms(2);
        delay_us(500);
        TIM_SetCompare2(TIM3,0);       
         delay_us(560);
         TIM_SetCompare2(TIM3,733);       
        delay_ms(97);
        delay_us(940);
        TIM_SetCompare2(TIM3,0);       




下面是接收到的内容,红外接收解析函数用的是红外例程里面的remote.c
0000000011111110
0000000011111110
00000000111111100
0000000011111110
00000000111111100
00000000111111100
00000000111111100
00000000111111100
0000000011111110
000000001111111
00000000111111100
0000000011111110
0000000011111110
00000000111111100
00000000111111100
0000000011111110
0000000011111110
0000000011111110
0000000011111110
00000000111111100
00000000111111100
0000000011111110


我不知道我代码哪里出了问题,可能是连发码有问题,可是我把连发码注释掉,出现的问题还是一样

最佳答案

查看完整内容[请看2#楼]

发现了部分问题: 在连发码前加上 TIM_SetCompare2(TIM3,733); delay_us(200); TIM_SetCompare2(TIM3,0); 可以避免与后面连发码信号识别错误,接收到的数据都是8个0和8个1再加上一个0.这个多出的0应该是连发码那里出现了问题,把连发码注释掉之后,接收到的数据都是8个0和8个1,与我设想中的一样 剩下的问题就是:不是每次发射都能接收到信号,可能是发射管的电流不够大或者是电压小了?也可能是接收管的问题,这就不 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2019-9-24
在线时间
27 小时
 楼主| 发表于 2020-3-26 10:19:13 | 显示全部楼层
发现了部分问题:
在连发码前加上
  TIM_SetCompare2(TIM3,733);
        delay_us(200);
  TIM_SetCompare2(TIM3,0);       
可以避免与后面连发码信号识别错误,接收到的数据都是8个0和8个1再加上一个0.这个多出的0应该是连发码那里出现了问题,把连发码注释掉之后,接收到的数据都是8个0和8个1,与我设想中的一样
剩下的问题就是:不是每次发射都能接收到信号,可能是发射管的电流不够大或者是电压小了?也可能是接收管的问题,这就不是很清楚了
回复

使用道具 举报

4

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2019-9-24
在线时间
27 小时
 楼主| 发表于 2020-3-26 14:09:38 | 显示全部楼层
万花瞳 发表于 2020-3-26 12:22
发现了部分问题:
在连发码前加上
  TIM_SetCompare2(TIM3,733);

剩下的问题应该是红外发射电路的事了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-3 06:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表