打印

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

[复制链接]
2910|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低电平表示,
那这个高低电平谁在前面呢,这个很重要!

使用特权

评论回复
5
xwj| | 2012-3-14 12:44 | 只看该作者
LZ,要学会使用中断啊。

红外接收的话只要在脉冲边沿时 计算与前一次脉冲的间隔时间,然后根据条件判断处理1位数据,然后马上就可以退出中断了

使用特权

评论回复
6
蜗牛狂奔|  楼主 | 2012-3-14 13:33 | 只看该作者
LS的指点使我有所领悟,明白一些了。不过下面的问题我还是想了解下:
1、0和1是有不同的高低电平占空比组成的,到底是高电平在前还是低电平在前呢??
2、这里高低电平的持续时间是否要求比较严格,例如前导码是由9ms的低电平 + 4.5ms的高电平,这个时间可不可以有个几毫秒的误差

使用特权

评论回复
7
coody| | 2012-3-14 14:22 | 只看该作者
我基本上不用外中断来接收IR,因为外中断比较敏感,哪怕信号中有一个us级的干扰,都能进入中断。
在LED灯上就有过很明显的问题。一次客户叫我改进IR接收,墙上有200多个LED灯在测试,每个灯都可以独立接收IR信号,但是按下遥控器“关闭”键,只有部分关了,要按几次才关完,调光也不统一执行。
灯是PWM控制的,IR接收头离LED只有几mm,PWM光那么强,并且还很热。
我帮改为查询接收,一致性很好。

使用特权

评论回复
8
蜗牛狂奔|  楼主 | 2012-3-14 15:01 | 只看该作者
查询接收?? 这样是不很耗费时间啊! 如果CPU有很多工作,那实时性不是很差

使用特权

评论回复
9
蜗牛狂奔|  楼主 | 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

使用特权

评论回复
10
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楼的提供了该方法的注意事项..

个人意见是.如果单片机很多事要做的,处理能力不强还是  电平中断吧
有干扰想办法滤掉就是

使用特权

评论回复
11
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字节都不会丢失一个。并且,还有好多程序在跑的,虚拟有一个多任务核,查询的(不是占先式)

使用特权

评论回复
12
dcp| | 2012-3-15 09:25 | 只看该作者
定时中断采样

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

3

主题

356

帖子

1

粉丝