南沙区网站建设,网站开发人员薪酬,淘宝客网站怎样做seo,湛江企业建站模板红外遥控简介红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力#xff0c;所…红外遥控简介红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力所以在设计红外线遥控器时不必要像无线电遥控器那样每套(发射器和接收器)要有不同的遥控频率或编码(否则就会隔墙控制或干扰邻居的家用电器)所以同类产品的红外线遥控器可以有相同的遥控频率或编码而不会出现遥控信号“串门”的情况。这对于大批量生产以及在家用电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光因此对环境影响很小再由红外光波动波长远小于无线电波的波长所以红外线遥控不会影响其他家用电器也不会影响临近的无线电设备。红外遥控的编码目前广泛使用的是NEC Protocol 的 PWM(脉冲宽度调制)和 Philips RC-5 Protocol的 PPM(脉冲位置调制)。我使用的的遥控器使用的是NEC 协议其特征如下8位地址和8位指令长度地址和命令2次传输确保可靠性;PWM脉冲位置调制以发射红外载波的占空比代表“ 0”和“ 1”载波频率为38Khz位时间为1.125ms或2.25msNEC 码的位定义一个脉冲对应560us的连续载波一个逻辑 1 传输需要2.25ms(560us 脉冲1680us 低电平)一个逻辑0的传输需要 1.125ms(560us 脉冲560us 低电平)。而遥控接收头在收到脉冲的时候为低电平在没有脉冲的时候为高电平这样我们在接收头端收到的信号为逻辑1应该是560us低1680us高逻辑0应该是560us低560us高。NEC 遥控指令的数据格式为同步码头、地址码、地址反码、控制码、控制反码。同步码由一个9ms的低电平和一个4.5ms的高电平组成地址码、地址反码、控制码、控制反码均是8位数据格式。按照低位在前高位在后的顺序发送。采用反码是为了增加传输的可靠性可用于校验。1. ENC 协议的时序图ENC特点如下:1),协议规定低位首先发送。一串信息首先发送9ms的AGC(自动增益控制)的高脉冲接着发送4.5ms的起始低电平接下来是发送四个字节的地址码和命令码这四个字节分别为地址码地址码反码命令码命令码反码。2),如果你一直按那个按键一串信息也只能发送一次一直按着发送的则是以110ms为周期的重复码。3),接收到的信号是跟发送信号正好反向的。2.重复码的格式重复码的格式是由9ms的AGC高电平和4.5ms的低电平及一个560us的高电平组成。3.逻辑“1”的表示逻辑1的是由560us的高电平和1.69ms的低电平组成的脉冲表示。4.逻辑“0”的表示逻辑0的是有560us的高电平和565us的低电平组成的脉冲表示。5.ENC的解码过程一般ENC的解码过程为1),产生下降沿进入外部中断15的中断函数延时一下之后检测IO口是否还是低电平是就等待9ms的低电平过去。2),等待完9ms低电平过去再去等待4.5ms的高电平过去。3),接着开始接收传送的4组数据①先等待560us的低电平过去②检测高电平的持续时间,如果超过1.12ms那么是高电平(高电平的的持续时间为1.69ms,低电平的持续时间为565us。4),检测接收到的数据和数据的反码进行比较是否等到的数据是一样的。6,下面直接写驱动程序#include linux/init.h
#include linux/module.h
#include linux/gpio.h
#include linux/interrupt.h
#include linux/ktime.h#include mach/gpio.h#define IRDA_GPIO EXYNOS4_GPX3(2)int flag 0; // 表示数据帧的开始
int num 0; // 表示数据帧里的第几位数据
static long long prev 0; // 64bit,记录上次的时间
unsigned int times[40]; // 记录每位数据的时间irqreturn_t
infrared_irq_handler(int irqno, void *dev_id)
{long long now ktime_to_us(ktime_get());unsigned int offset;int i, j, tmp;if(!flag){ // 数据开始flag 1;prev now;return IRQ_HANDLED;}offset now - prev;prev now;if((offset 13000) (offset 14000)){ // 判断是否收到引导码num 0;return IRQ_HANDLED;}if(num 32)times[num] offset;if(num 32){for(i 0; i 4; i){ // 一共4个字节tmp 0;for(j 0; j 8; j){if(times[i * 8 j] 2000) // 如果数据位的信号周期大于20ms,则是二进制数据1tmp | 1 j;}printk(%02x , tmp);}printk(\n);flag 0;}return IRQ_HANDLED;
}static void __exit
infrared_drv_exit(void)
{free_irq(gpio_to_irq(IRDA_GPIO), NULL);
}static int __init
infrared_drv_init(void)
{int ret -1;ret request_irq(gpio_to_irq(IRDA_GPIO), infrared_irq_handler, IRQF_TRIGGER_FALLING, infrared, NULL);if(ret 0){printk(request irq failed !\n);return ret;}return 0;
}module_init(infrared_drv_init);
module_exit(infrared_drv_exit);MODULE_LICENSE(GPL);还有对应的Makefile:#指定内核源码路径
KERNEL_DIR /home/george/1702/exynos/linux-3.5#指定当前路径
CUR_DIR $(shell pwd)#MYAPP dht11_app
MODULE IRDA_for_irqall:make -C $(KERNEL_DIR) M$(CUR_DIR) modules
# arm-none-linux-gnueabi-gcc -o $(MYAPP) $(MYAPP).c
clean:make -C $(KERNEL_DIR) M$(CUR_DIR) clean$(RM) $(MYAPP)
install:cp -raf *.ko $(MYAPP) /home/george/1702/exynos/filesystem/1702#指定编译当前目录下那个源文件
obj-m $(MODULE).o编译生成.ko文件之后,装载,然后进行实物测试,验证效果图如下: