FPGA(13) 实验综合8 红外遥控

FPGA(13)实验综合8 红外遥控

  • 红外遥控简介
  • 红外接收头
  • 关键代码

红外遥控简介

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强2,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。由于它不能穿过障碍物去控制被控对象的能力,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。

红外遥控器传输协议的编码目前广泛使用的是:NEC协议和Philips RC-5协议

NEC协议中,每一帧数据包括了引导码、地址码、地址码的反码、数据码、和数据码的反码,如下图所示

FPGA(13) 实验综合8 红外遥控_第1张图片
具体格式如下图,取反的意义在于,将地址和数据都传输两次,能够提高可靠性
FPGA(13) 实验综合8 红外遥控_第2张图片
(读数据时低位在前,所以从后往前读 )
引导码指的是先发一个9ms的高电平脉冲,其后是4.5ms的低电平

这里先说明一下NEC中的0和1的定义

FPGA(13) 实验综合8 红外遥控_第3张图片
逻辑1为2.25ms,脉冲时间560us;逻辑0为1.12ms,脉冲时间560us。所以我们可以判断脉冲时间长短来解码。一般载波占空比为1/3至1/4。

载波脉冲:未受调制的周期性振荡信号称为载波,载波频率比输入信号要高,属于高频信号,输入信号调制到一个高频载波上就好像装上了加速器

调制:将信号源的信息处理到载波上,使其变为适合于信道传输的形式的过程

主流的调制方式有两种:
PPM(Pulse Position Modulation,脉冲位置调制)
:通过脉冲间隔判断编码是1还是0
PWM(Pulse Width Modulation,脉冲宽度调制)

NEC协议数据重复码(连发码)
按键一直按时只发送一次完整信息,后面每隔110ms发送一次重复码。重复码数据包含9ms的AGC(自动增益控制)载波脉冲开始,接着2.25ms空闲信号,随后560us的载波脉冲

AGC:自动增益控制是指使放大电路的增益自动地随信号强度而调整的自动控制方法。

红外接收头

集成红外监测二极管、自动增益放大器(AGC),带通滤波器(Band Pass)、解调器(Demodulator)等

内部对信号做了取反处理,所以逻辑1和0的判断方式调转。

关键代码

这里判断是否为重复码

            st_start_judge : begin
                if(neg_remote_in) begin   
                    time_cnt_clr <= 1'b1;   
                    //重复码高电平2.25ms 2.25/0.125 = 18      
                    if(time_cnt >= 15 && time_cnt <= 20) begin
                        time_done <= 1'b1;
                        judge_flag <= 1'b1;
                    end    
                    //同步码高电平4.5ms 4.5/0.125 = 36
                    else if(time_cnt >= 33 && time_cnt <= 38) begin
                        time_done <= 1'b1;
                        judge_flag <= 1'b0;                        
                    end
                    else
                        error_en <= 1'b1;
                end                       
            end

通过拼接的方式解析控制码

                else if(neg_remote_in) begin
                    time_cnt_clr <= 1'b1;
                    data_cnt <= data_cnt + 1'b1;    
                    //解析控制码和控制反码        
                    if(data_cnt >= 6'd16 && data_cnt <= 6'd31) begin 
                        if(time_cnt >= 2 && time_cnt <= 6) begin  //0.565/0.125 = 4.52
                            data_temp <= {1'b0,data_temp[15:1]};  //逻辑“0”
                        end
                        else if(time_cnt >= 10 && time_cnt <= 15) //1.69/0.125 = 13.52
                            data_temp <= {1'b1,data_temp[15:1]};  //逻辑“1”
                    end
                end
            end
            st_r

通过判断控制反码的反码是否等于控制码来校验

            st_rec_data : begin                                  
                if(pos_remote_in) begin
                    time_cnt_clr <= 1'b1;
                    if(data_cnt == 6'd32) begin
                        data_en <= 1'b1;
                        data_cnt <= 6'd0;
                        data_temp <= 16'd0;
                        if(data_temp[7:0] == ~data_temp[15:8])    //校验控制码和控制反码
                            data <= data_temp[7:0];
                    end
                end

你可能感兴趣的:(嵌入式)