红外接收程序延时问题!求助

[复制链接]
3970|12
 楼主| 蜗牛狂奔 发表于 2012-3-14 09:32 | 显示全部楼层 |阅读模式
最近在看红外发射接收的知识,有个参考程序它只做红外接收这一个工作 所以里面的定时器或其它功能随便用。
我想知道的是:如果某个项目里面有很多功能,那么红外部分的延时信号大家怎么处理的
coody 发表于 2012-3-14 10:27 | 显示全部楼层
定时中断查询,可以到WWW.**.COM上的技术支持那里有一个下来参考。
 楼主| 蜗牛狂奔 发表于 2012-3-14 11:40 | 显示全部楼层
资料确实是非常好!
但下面这个定义里的数怎么的出来的,主要就是宏定义15000、9700、3000等
//Synchro:low=9ms,high=4.5/2.25ms,low=0.5626ms
//Bit0:high=0.5626ms,low=0.5626ms
//Bit1:high=1.6879ms,low=0.5626ms
//frame space = 23 ms or 96 ms

/******************** 红外采样时间宏定义, 用户不要随意修改        *******************/

#if ((D_TIMER0 <= 250) && (D_TIMER0 >= 60))
        #define        D_IR_sample                        D_TIMER0                //定义采样时间,在60us~250us之间
#endif

#define D_IR_SYNC_MAX                (15000/D_IR_sample)        //SYNC max time
#define D_IR_SYNC_MIN                (9700 /D_IR_sample)        //SYNC min time
#define D_IR_SYNC_DIVIDE        (12375/D_IR_sample)        //decide data 0 or 1
#define D_IR_DATA_MAX                (3000 /D_IR_sample)        //data max time
#define D_IR_DATA_MIN                (600  /D_IR_sample)        //data min time
#define D_IR_DATA_DIVIDE        (1687 /D_IR_sample)        //decide data 0 or 1
#define D_IR_BIT_NUMBER                32                                        //bit number
 楼主| 蜗牛狂奔 发表于 2012-3-14 12:28 | 显示全部楼层
还有一个问题:比如“1”是由 1.6879ms高电平 和 0.5626ms低电平表示,
那这个高低电平谁在前面呢,这个很重要!
xwj 发表于 2012-3-14 12:44 | 显示全部楼层
LZ,要学会使用中断啊。

红外接收的话只要在脉冲边沿时 计算与前一次脉冲的间隔时间,然后根据条件判断处理1位数据,然后马上就可以退出中断了
 楼主| 蜗牛狂奔 发表于 2012-3-14 13:33 | 显示全部楼层
LS的指点使我有所领悟,明白一些了。不过下面的问题我还是想了解下:
1、0和1是有不同的高低电平占空比组成的,到底是高电平在前还是低电平在前呢??
2、这里高低电平的持续时间是否要求比较严格,例如前导码是由9ms的低电平 + 4.5ms的高电平,这个时间可不可以有个几毫秒的误差
coody 发表于 2012-3-14 14:22 | 显示全部楼层
我基本上不用外中断来接收IR,因为外中断比较敏感,哪怕信号中有一个us级的干扰,都能进入中断。
在LED灯上就有过很明显的问题。一次客户叫我改进IR接收,墙上有200多个LED灯在测试,每个灯都可以独立接收IR信号,但是按下遥控器“关闭”键,只有部分关了,要按几次才关完,调光也不统一执行。
灯是PWM控制的,IR接收头离LED只有几mm,PWM光那么强,并且还很热。
我帮改为查询接收,一致性很好。
 楼主| 蜗牛狂奔 发表于 2012-3-14 15:01 | 显示全部楼层
查询接收?? 这样是不很耗费时间啊! 如果CPU有很多工作,那实时性不是很差
 楼主| 蜗牛狂奔 发表于 2012-3-14 15:04 | 显示全部楼层
我很模糊的是下面这宏定义的数是怎么来的  15000(15ms) 9700(9.7ms)  12375等等

#define D_IR_SYNC_MAX                (15000/D_IR_sample)        //SYNC max time
#define D_IR_SYNC_MIN                (9700 /D_IR_sample)        //SYNC min time
#define D_IR_SYNC_DIVIDE        (12375/D_IR_sample)        //decide data 0 or 1
#define D_IR_DATA_MAX                (3000 /D_IR_sample)        //data max time
#define D_IR_DATA_MIN                (600  /D_IR_sample)        //data min time
#define D_IR_DATA_DIVIDE        (1687 /D_IR_sample)        //decide data 0 or 1
#define D_IR_BIT_NUMBER                32                                        //bit number
jiemnij 发表于 2012-3-14 15:49 | 显示全部楼层
本帖最后由 jiemnij 于 2012-3-14 15:52 编辑

LZ贴的这个是中断查询的方法
D_IR_sample是每次定时中断的时间量
后面的D_IR_SYNC_MAX不过是计数器而已..

看LZ贴的代码..60us< D_IR_sample < 250us
单片机如果不nb点...鸭梨好大啊

5楼的提供了方法
7楼的提供了该方法的注意事项..

个人意见是.如果单片机很多事要做的,处理能力不强还是  电平中断吧
有干扰想办法滤掉就是
coody 发表于 2012-3-14 16:37 | 显示全部楼层
8楼:
实时性不会差,象用STC的1T这样的IC,开个100us中断,查询一般使用几个us,平均大约是5us左右,占CPU时间大约就是5%(22.1184MHZ)。
用STC的1T的MCU,跑22.1184MHZ,我用到34.722us的定时中断来模拟4路9600的双工串口,同时收发1M字节都不会丢失一个。并且,还有好多程序在跑的,虚拟有一个多任务核,查询的(不是占先式)
dcp 发表于 2012-3-15 09:25 | 显示全部楼层
定时中断采样
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:其实我曾经也是一名电工!

2

主题

351

帖子

1

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