发斯蒂芬

更多塔克创新资讯欢迎登陆【塔克社区 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/

X-CTR100控制器具有红外接收头,例程实现NEC协议的红外遥控器进行解码显示,遥控器需要自行准备。

原理

红外遥控是一种广泛应用的通信和控制手段,由于其结构简单、功耗低、抗干扰能力强、可靠性高及成本低等优点而广泛应用于家用电器、工业控制和智能仪器系统中。通用红外遥控系统由发射和接收两大部分组成。应用编码/解码专用集成电路芯片来进行控制操作。

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

红外遥控器是通过发送一定的控制信号来实现对电器的控制,这个控制信号就是一串红外脉冲编码信号。通过发送的不同编码脉冲来表示不同的功能按键信号,电器通过红外接收系统接收到编码脉冲,并进行相应的解码执行相应的功能,这样就实现了红外遥控家用电器的目的。由此可见编码在红外遥控系统中的重要性,不过编码方式目前还没有一个统一的国际标准,每个生产厂家所使用的编码格式各不相同。目前使用的编码标准主要有RC5、NEC、SONY、REC80、SAMSWNG等,主要是欧洲和日本生产厂家所使用的编码格式。国内家用电器的生产厂家,其编码方式多数是按照上述的各种编码方式进行编码的,应用较多的是NEC型编码方式。

本教程以常用的NEC编码标准进行说明,例程也是针对NEC编码遥控器设计。

扫描二维码关注公众号,回复: 1830902 查看本文章

NEC标准:遥控载波的频率为38KHz(占空比1:3)当某个键按下时,系统首先发射一个完整的全码,如果按键超过108ms仍未松开,接下来发射的代码(连发代码)将由起始码(9ms)和结束码(2.5ms)组成。

一个完整的全码 = 引导码 +用户码 +用户码 + 数据码 + 数据码 + 数据反码。

其中,引导码高电平9ms,低电平4.5ms;系统码8位,数据码8位,共32位;其中前16位为用户识别码,能区别不同的红外遥控设备,以防止不同的机种遥控码互相干扰。后16位为8位的操作码和8位的操作反码,用于核对数据是否接收准确。收端根据数据码做出应该执行上面动作的判断。连发代码是在持续按键时发送的码。它告知接收端。某键是在被连续的按着。

NEC标准下的发射码表示发射数据0时用"0.56ms高电平 + 0.565ms低电平 = 1.125ms"表示;数据1用"高电平0.56ms + 1.69ms = 2.25ms"表示。需要注意的是:当一体化接收头收到38kHz红外信号时,输出端输出低电平,否则为高电平。所以一体化接收头输出的波形和发射波形是反向的。

例程

使用定时器输入捕获功能实现了遥控器红外解码,解码后的键值和按键次数通过串口输出显示。

硬件说明

硬件资源:

  • 串口UART1
  • LED灯
  • 红外遥控接收头
  • NEC编码红外遥控器(需自备)

红外接收部分硬件电路,

软件说明

X-SOFT软件生态,X-API扩展文件如下。

ax_ir.c—— 红外接收源文件

ax_ir.h——红外接收头文件

红外码的解码通过定时器TIM9的通道CH1输入捕获事件实现,通过中断函数void TIM1_BRK_TIM9_IRQHandler()实现红外解码。

用户接口函数

void AX_IR_Init(void); //红外遥控接口初始化

uint16_t AX_IR_ReadKeyStatus(void); //读取按键值和键次数

特殊说明,1.8固件 PLL_N 默认为360,实测解码错误,之前固件版本为336,改为336后,解码正常。

修改位置为,system_stm32f4xx.c,400行位置。

#if defined (STM32F40_41xxx)

#define PLL_N 336 //360

/* SYSCLK = PLL_VCO / PLL_P */

#define PLL_P 2

#endif /* STM32F40_41xxx */

使用定时器输入捕获功能实现了遥控器红外解码,解码后的键值和按键次数通过串口输出显示。

主程序代码如下。

int main(void)

{    

    uint16_t a;

    uint8_t key,cnt;

    

    //XRT1初始化

    AX_Init(115200);

    printf("***X-CTR100 红外接收例程***\r\n\r\n");

    printf("请对着红外接收头按遥控器\r\n");    

    

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2    

    

    //红外接收初始化

    AX_IR_Init();

    

    while (1)

    {

        a = AX_IR_ReadKeyStatus();

        

        key = a&0x00FF; // 取出键值

        cnt = ((a&0x7F00)>>8); //取出按键次数

        

        if(a)

        {    

            if(a < 0x8000) //按键未抬起

            {

                printf("Key = %X Count = %d \r\n", key, cnt );    

            }

            else

            {

                printf("Key = %X Count = %d END\r\n", key, cnt);                

            }    

        }

        

        AX_Delayms(100);

    }

}

实现效果

遥控器对准红外接收头按键,显示键值和按键次数。

猜你喜欢

转载自www.cnblogs.com/xtark/p/9252390.html