红外遥控编码与解码

您所在的位置:网站首页 led代码表 红外遥控编码与解码

红外遥控编码与解码

#红外遥控编码与解码| 来源: 网络整理| 查看: 265

随着家用电器、视听产品的普及,红外线遥控器已被广泛使用在各种类型的家电产品上(如遥控开关、智能开关等)。其具有体积小、抗干扰能力强、功耗低、功能强、成本低等特点,在工业设备中也得到广泛应用。

  一般而言,一个通用的红外遥控系统由发射和接收两大部分组成,如图1 所示:

  其中发射部分主要包括键盘矩阵、编码调制、红外发射管;接收部分包括光、电信号的转换以及放大、解调、解码电路。举例来说,通常我们家电遥控器信号的发射,就是将相应按键所对应的控制指令和系统码( 由0 和1 组成的序列),调制在32~56kHz 范围内的载波上,然后经放大、驱动红外发射管将信号发射出去。此外,现在流行的控制方法是应用编/ 解码专用集成电路芯片来实现。

  不同公司的遥控芯片,采用的遥控码格式也不一样。在此介绍目前广泛使用较普遍的两种,一种是NEC Protocol 的PWM( 脉冲宽度调制) 标准,一种是Philips RC-5 Protocol 的PPM( 脉冲位置调制) 标准。

  NEC 标准(代表芯片WD6122):遥控载波的频率为38kHz( 占空比为1:3) ;当某个按键按下时,系统首先发射一个完整的全码,然后经延时再发射一系列简码,直到按键松开即停止发射。简码重复为延时108ms,即两个引导脉冲上升沿之间的间隔都是108ms。如图2所示即为完整的NTC编码。

  对于NTC编码,由引导码、用户编码低位,用户编码高位、键数据编码、键数据编码反码五部分组成,引导码由一个9ms的载波波形和4.5ms的关断时间构成,它作为随后发射的码的引导,这样当接收系统是由微处理器构成的时候,能更有效地处理码的接收与检测及其它各项控制之间的时序关系。编码采用脉冲位置调制方式(PPM)。利用脉冲之间的时间间隔来区分“0”和“1”。每次8位的码被传送之后,它们的反码也被传送,减少了系统的误码率。数据0 可用“高电平0.56ms +低电平0.56ms”表示,数据1 可用“高电平0.56ms +低电平1.68ms”表示。

  PHILIPS 标准(代表芯片SAA3010):载波频率为38kHz ;没有简码,点按键时,控制码在1 和0 之间切换,若持续按键,则控制码不变。一个全码可等同于起始码、控制码、系统码、数据码的时间总和,数据0 用“低电平0. 889ms +高电平0. 889ms”表示;数据1 用“ 高电平0. 889ms + 低电平0.889ms”表示,如图3 所示。

  SAA3010 的位传送方式是采用双相位,位1 和位0 的相位正好相反。在解码时可以用定时采样的方式进行解码,一个位采样二次,分别在位波形的四分之一和四分之三处进行采样,如位1 用这种方法采样的值就是0 和1。当然也可以只采样一次,例如在波形的四分之一处进行采样,然后定时一个波形的周期再采样,这样位1 采样的值就是0。

  编码时高低电平以1 0表示,解码时需要按0 1识别,即编码与解码需要倒相,编程时需要注意的关键点。

  本程序使用的芯片为WD6122,因此使用NTC编码标准

 

 

红外遥控器原理介绍

红外线遥控是目前使用最广泛的一种通信和遥控手段。 由于红外线遥控装置具有体积小、 功耗低、 功能强、 成本低等特点, 因而, 继彩电、 录像机之后, 在录音机、 音响设备、 空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。 工业设备中, 在高压、 辐射、 有毒气体、 粉尘等环境下, 采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。

红外遥控系统:通用红外遥控系统由发射和接收两大部分组成, 应用编/解码专用集成电路芯片来进行控制操作, 如图1所示。 发射部分包括键盘矩阵、 编码调制、 LED红外发送器; 接收部分包括光、 电转换放大器、 解调、 解码电路。

红外的简单发射接收原理:

在发射端,输入信号经放大后送入红外发射管发射,在接收端,接收管收到红外信号后,由放大器放大处理后还原成信号,这就是红外的简单发射接收原理。

1、红外遥控系统结构

红外遥控系统的主要部分为调制、发射和接收,如图1所示:

 

红外遥控是以调制的方式发射数据,就是把数据和一定频率的载波进行“与”操作,这样既可以提高发射效率又可以降低电源功耗。

调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1/3的方波,如图2所示,这是由发射端所使用的455kHz晶振决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。

目前有很多种芯片可以实现红外发射,可以根据选择发出不同种类的编码。由于发射系统一般用电池供电,这就要求芯片的功耗要很低,芯片大多都设计成可以处于休眠状态,当有按键按下时才工作,这样可以降低功耗芯片所用的晶振应该有足够的耐物理撞击能力,不能选用普通的石英晶体,一般是选用陶瓷共鸣器,陶瓷共鸣器准确性没有石英晶体高,但通常一点误差可以忽略不计。

红外线通过红外发光二极管(LED)发射出去,红外发光二极管(红外发射管)内部构造与普通的发光二极管基本相同,材料和普通发光二极管不同,在红外发射管两端施加一定电压时,它发出的是红外线而不是可见光。

如图3a和图3b是LED的驱动电路,图3a是最简单电路,选用元件时要注意三极管的开关速度要快,还要考虑到LED的正向电流和反向漏电流,一般流过LED的最大正向电流为100mA,电流越大,其发射的波形强度越大。

图3a电路有一点缺陷,当电池电压下降时,流过LED的电流会降低,发射波形强度降低,遥控距离就会变小。

图3b所示的射极输出电路可以解决这个问题,两个二极管把三级管基极电压钳位在1.2V左右,因此三级管发射极电压固定在0.6V左右,发射极电流IE基本不变,根据IE≈IC,所以流过LED的电流也基本不变,这样保证了当电池电压降低时还可以保证一定的遥控距离。

2、一体化红外接收头

红外信号收发系统的典型电路如图1所示,红外接收电路通常被厂家集成在一个元件中,成为一体化红外接收头。内部电路包括红外监测二极管,放大器,限副器,带通滤波器,积分电路,比较器等。红外监测二极管监测到红外信号,然后把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。交流信号进入带通滤波器,带通滤波器可以通过30khz到60khz的负载波,通过解调电路和积分电路进入比较器,比较器输出高低电平,还原出发射端的信号波形。注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。一体化红外接收头,如图4a、4b所示:

 

红外接收头的种类很多,引脚定义也不相同,一般都有三个引脚,包括供电脚,接地和信号输出脚。根据发射端调制载波的不同应选用相应解调频率的接收头。

红外接收头内部放大器的增益很大,很容易引起干扰,因此在接收头的供电脚上须加上滤波电容,一般在22uf以上。有的厂家建议在供电脚和电源之间接入330欧电阻,进一步降低电源干扰。

红外发射器可从遥控器厂家定制,也可以自己用单片机的PWM产生,家庭遥控推荐使用红外发射管(L5IR4-45)的可产生37.91KHz的PWM,PWM占空比设置为1/3,通过简单的定时中断开关PWM,即可产生发射波形。

红外编解码解析

1、编码格式

现有的红外遥控包括两种方式:PWM(脉冲宽度调制)和PPM(脉冲位置调制)。

两种形式编码的代表分别为NEC 和PHILIPS 的RC-5、RC-6 以及将来的RC-7。

PWM(脉冲宽度调制):以发射红外载波的占空比代表“0”和“1”。为了节省能量,一般情况下,发射红外载波的时间固定,通过改变不发射载波的时间来改变占空比。例如常用的电视遥控器,使用NEC upd6121,其“0”为载波发射0.56ms,不发射0.56ms;其“1”为载波发射0.56ms,不发射1.68ms;此外,为了解码的方便,还有引导码,upd6121 的引导码为载波发射9ms,不发射4.5ms。upd6121 总共的编码长度为108ms。

但并不是所有的编码器都是如此,比如TOSHIBA 的TC9012,其引导码为载波发射4.5ms,不发射4.5ms,其“0”为载波发射0.52ms,不发射0.52ms,其“1”为载波发射0.52ms,不发射1.04ms。

PPM(脉冲位置调制):以发射载波的位置表示“0”和“1”。从发射载波到不发射载波为“0”,从不发射载波到发射载波为“1”。其发射载波和不发射载波的时间相同,都为0.68ms,也就是每位的时间是固定的。

通过以上对编码的分析,可以得出以某种固定格式的“0”和“1”去学习红外,是很有可能不成功的。即市面上所宣传的可以学习64 位、128 位必然是不可靠的。

另外,由于空调的状态远多于电视、音像,并且没有一个标准,所以各厂家都按自己的格式去做一个,造成差异更大。比如:美的的遥控器采用PWM 编码,码长120ms 左右;新科的遥控器也采用PWM 编码,码长500ms 左右。如此大的差异,如果按“位”的概念来讲,应该是多少位呢?64?128?显然都不可能包含如此长短不一的编码。

2、红外遥控编码格式

红外遥控器的编码格式通常有两种格式:NEC 和RC5

NEC 格式的特征:

1:使用38 kHz 载波频率

2:引导码间隔是9 ms + 4.5 ms

3:使用16 位客户代码

4:使用8 位数据代码和8 位取反的数据代码

 

不过需要将波形反转一下才方便分析:

 

NEC 协议通过脉冲串之间的时间间隔来实现信号的调制(英文简写PWM) 。 逻辑“0”是由0.56ms的38KHZ载波和0.560ms 的无载波间隔组成; 逻辑“1”是由0.56ms 的38KHZ 载波和1.68ms 的无载波间隔组成; 结束位是0.56ms 的38K 载波。

 

下面实例是已知 NEC 类型遥控器所截获的波形: 遥控器的识别码是Address=0xDD20;其中一个键值是Command=0x0E;

 

注意: 波形先是发低位地址再发高位地址。 所以0000,0100,1011,1011 反转过来就是1101,1101,0010,000 十六进制的DD20;键值波形如下:

 

也是要将0111,0000 反转成0000,1110得到十六进制的0E; 另外注意8 位的键值代码是取反后再发一次的,如图0111,0000 取反后为1000,1111。 最后一位是一个逻辑“1”。

RC5 编码相对简单一些: 同样由于取自红外接收头的波形需要反相一下波形以便于分析:

 

反相后的波形:

 

根据编码规则:

 

得到一组数字: 110, 11010, 001101根据编码定义:

 

第一位是起始位S通常是逻辑1

第二位是场位F通常为逻辑1, 在RC5 扩展模式下它将最后6位命令代码扩充到7 位代码(高位MSB) , 这样可以从64 个键值扩充到128 个键值。

第三位是控制位C它在每按下了一个键后翻转, 这样就可以区分一个键到底是一直按着没松手还是松手后重复按。

如图所示是同一按键重复按两次所得波形, 只有第三位是相反的逻辑, 其它的位逻辑都一样。

 

其后是五个系统地址位:11010=1A, 最后是六个命令位:001101=0D。

本文整合自网络,版权归原作者,如果涉及侵权,请及时联系我们删除!

2020.05.07

今天把红外发射功能调试了下,做下总结,希望帮助后来人。这次只讲发射

,编码格式NEC格式。

红外发射接收电路:

简单的也可以这样:

如果想简单省事,还可以在网上(某宝)购买现成的NEC编码红外解码模块,注意:

这里买最便宜的就行,我买了两种一种贵的一种便宜的,结果完全一样。下面聊聊

怎么发射红外。

说明:

1、PWM波形没必要1:2,1:1也是可以的;

2、我刚开始用的100ma的红外管,结果不行,后来换成1A的红外管,可以;

3、实现由很多种方案,最简单的就是PWM+定时器。 我为了减少资源,就用了一个

定时器模拟PWM,同时实现计时功能;

说说我的设计思路:

1、我有8路红外发射;

2、由于硬件设计导致不是所有的IO口是PWM输出口,因此全部用定时器+IO模拟PWM;

3、为了减少对硬件资源定时的需求,我就用了一个定时器;

4、为了减少重复代码工作量,采用面向对象思路进行封装;

具体实现思路如下:

一、驱动分离,需要用户提供的API接口

typedef void pwm_timer_start(uint16_t hwUs); typedef void pwm_timer_stop(void); typedef void pwm_io_set(bool bValue);

主要是为了隔离驱动层。

二、提供给用户的接口

一个初始化API,初始化模块,内存等。

一个供用户调用的启动发送接口。

一个检测是否发送服务任务,main调用。

一个中断服务程序,由timer中断调用。

void software_pwm_init(void); bool software_pwm_start(ir_encoder_mode_t tIrEncoderMode,software_pwm_api_t* ptSoftwarePwmApi,uint8_t* pchBuffer,uint8_t chBufferSize); fsm_rt_t software_pwm_service_process(void); fsm_rt_t software_pwm_irq(void);

三、内部发送机制

内部实现了两个list单链表,一个free表,一个TX表。用户启动发送,

仅仅是从free获得一个内存把数据打包然后放入TX链表。发送服务检查

TX链表是否有数据要发送,然后启动真实的数据发送。

extern bool my_list_add_memory_block_to_net_work_heap(my_list_memory_t **pptFreeList,void *pBlock, uint32_t wBlockSize,uint16_t hwUserStructMaxSize,list_item_init *pItemIint); extern bool my_list_free_list(my_list_memory_t **pptFreeList,my_list_memory_t *ptItem); extern my_list_memory_t *my_list_malloc_memory(my_list_memory_t **pptFreeList); extern bool my_list_add_memory(my_list_memory_t **pptActiveList,my_list_memory_t *ptNewItem,bool bIsAddHead); extern bool my_list_free_memory(my_list_memory_t **pptAddList,my_list_memory_t **pptDeleteList); extern my_list_memory_t *my_list_delete_memory(my_list_memory_t **pptTempList);

四、发送原理

1、首先发送引导码:9ms的载波发送和4.5ms关断。

9ms/(1/38ms)=9*38个PWM

38K=26us的PWM

设置timer时间=13us,每次IO口取反,计数2*9*38,然后关闭IO,定时4.5ms。

2、发送数据

按Bit发送,先发送低Bit。发送完一个bit后,右移一位,同时计数加1。

0.56ms/(1/38ms) = 21

设置timer时间=13us,每次IO口取反,计数2*21,然后关闭IO。

bit 0 定时0.56ms;bit 1定时1.68ms;

重复为以上发送一个字节,然后检查发送长度,发送下一个字节。

3、结束位是0.56ms 的38K 载波

当数据全部发送完成后,需要发送0.56ms的38K载波。

0.56ms/(1/38ms) = 21

设置timer时间=13us,每次IO口取反,计数2*21,然后关闭IO。

波形如下:

2021.05.16

问题一:偶尔不识别

用红外控制LED七彩灯带,在家里测试没有问题,可是在客户哪里测试发现,有的灯带可以控制,有的灯带不能控制。我开始

以为是红外编码不一样造成的,但是我用遥控器测试,没有问题,那就不是编码问题。今天用另外的红外管抓取红外通信数据,

测试发现,连续发送两包,第二包总是抓取不到?这是为啥呢?突然想起来,两包红外发送不能间隔太短,否则处理不过来,第

二包不识别,于是加大发送间隔,没有问题了。

问题二:兼容性差

测试发现有的控制器可以很好地进行控制,有的控制器接收误差太大(1、不识别,需要发送两次或者多次;2、误码率高,个别按键

识别为其它按键)。但是用同一款遥控器测试,就没有问题,能够很稳定的控制。

代码和遥控器的区别:

1、38K的占空比是1:2,不是网上说的1:3;

2、NEC编码我只发送了全码,没有发送简码;用示波器查看,遥控器发送了全码后,又发送了简码。

我感觉占空比影响不大,把简码发送补全,测试OK。

上面博客说的NEC编码很乱,这里从新梳理下:

nec 编码格式

·头码: 9ms高电平 + 4.5ms低电平 

·码0: 0.56ms高电平 + 0.56ms低电平 

·码1: 0.56ms高电平 + 1.68ms低电平 

·结束位: 0.56ms高电平 

·发码顺序为先发低位再发高位 

·单键码 :头码 + 16位系统码 + 8位数据码 + 8位数据码反码 

·连续键码(发简码):9ms高电平 + 2.25ms低电平 + 结束位 

·简码重复周期:108ms

引导码 + 系统码(16位)+ 数据码(8位)+ 数据码反码(8位)+ 结束码

全码发送:

引导码 + 系统码(16位)+ 数据码(8位)+ 数据码反码(8位)+ 结束码

简码发送:

9ms高电平 + 2.25ms低电平 + 结束位 

1是全码,2是全码周期108ms,3是简码周期108ms



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3