当前位置: 首页 > news >正文

红外遥控器 数据格式,按下及松开判断

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。

同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。

红外遥控的编码目前广泛使用的是:NEC Protocol 的PWM(脉冲宽度调制)和Philips

RC-5 Protocol 的PPM(脉冲位置调制)。

本次适配的遥控器也为NEC协议。

NEC协议特征:

1、8位地址和8位指令长度;

2、 地址和命令2次传输(确保可靠性)

3、PWM脉冲宽度调制,以发射红外载波的占空比代表“0”和“1”;

4、载波频率为38Khz;

5、位时间为1.125ms或2.25ms;

NEC码位定义:

一个脉冲对应560us的连续载波,一个逻辑1传输需要2.25ms(560us脉冲+1680us低电平),一个逻辑0的传输需要1.125ms(560us脉 冲+560us低电平)。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑1应该是560us低+1680us高,逻辑0应该是560us低+560us高。

NEC遥控器指令的数据格式:

同步码头、地址码、地址反码、控制码、控制反码。同步码由一个9ms的低电平和一个4.5ms的高电平组成,地址码、地址反码、控制码、控制反码均是8位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。

NEC码规定的连发码(由9ms低电平+2.5m高电平+0.56ms低电平+97.94ms高电平组成),如果在一帧数据发送完毕之后,按键仍然没有放开,则发射重复码,即连发码,可以通过统计连发码的次数来标记按键按下的长短/次数。

同步码为9ms低电平,4.5ms高电平组成,所以可以通过判断9ms后的高电平持续时间来判断是否有连发。

硬件连接:

APMF107输入引脚

红外接收头位于按键板

程序设计思路:

红外接收头接受到红外信号,通过PC3输入引脚进行接收,由于红外波形是一个不断产生高低电平的脉冲,可以通过中断的方式进行数据的接收处理,不同码位对应有不同的时间,逻辑0和逻辑1的高电平持续时间不同,可以通过定时器计数来判断码位以及发送的是逻辑0还是逻辑1.

这里有两种处理方式,第一种为使用定时器中断以及定时器的输入捕获功能进行处理,第二种为使用定时器计数功能和外部中断触发的方式。由于PC3输入引脚不支持定时器的复用和映射功能,所以本次适配采用第二种方式,采用定时器2以及外部中断3。

初始化配置定时器和中断,初始化GPIO_PC3上拉输入,设置IO口与中断的映射关系。空闲状态为高电平,所以中断触发为下降沿触发,在触发中断后如果波形为空闲状态就设为上升沿触发,波形为起始码接收状态,接收下降沿,计算脉宽时间,在9ms范围就为有效波形,更新接受状态准备接收4.5ms,中断设为下降沿触发,准备下次捕获。在4.5ms则表示起始位接收完成,在2,5ms表示数据发送一次后发送的连发码。更新状态准备接受地址码,判断脉宽的周期得到传输的逻辑0还是1,将对应的位进行赋值。地址码占两个字节正码和反码,所以判断赋值的位数是否是16位来标志地址码的接受是否完成,然后将状态更新为接收控制码,与地址码一样计算脉宽周期然后赋值,赋值的位数为32位此次数据接收完成。

在有按键按下时,需要通过串口向上层SOC发送按键的索引以及按键的状态(按下和松开)。定义一个全局变量,按键标志位,什么时候按下,在数据接收完成后标志位置1表示按键已经按下。什么时候松开呢?定义一个静态局部变量初始为空闲状态,用来保存前一次的状态,当当前的状态由其他状态切换到空闲状态,读取定时器7的计数保存下这个时间,当前状态和前一次状态都为空闲,并且保存的计数时间不为0,再读取定时器7计数的时间,用后面的时间减去前面的时间,如果这个时间大于一个设定的值,就代表按键已经松开,标志位置0.

定义一个枚举,保存对应按键的索引,通过键值的判断,赋值对应的索引。按键状态的上报与判断松开的方式同理,只上报按键状态发生改变的那一次。

//按键键值//红外波形的状态typedef enum {}IR_State_enum;//键值索引枚举//初始化 
void apm_remote_init(void) 
-->gpio(pc3)、定时器(tmr2)、外部中断3//中断服务程序————接收处理红外信号 
void apm_remote_nec_handle(void)//松开判断函数 
u8 remote_keystate(void)//红外键值检测上报 
void apm_remote_val(void)  
key_event_report(msg.index, SET);//上报按键

http://www.lryc.cn/news/180586.html

相关文章:

  • win32进程间通信方式(13种)
  • 基于Vue+ELement搭建动态树与数据表格实现分页模糊查询
  • 多线程案例 - 单例模式
  • 云原生Kubernetes:对外服务之 Ingress
  • Java21 新特性
  • Rest Template 使用
  • IDEA git操作技巧大全,持续更新中
  • 计算机操作系统 (王道考研)笔记(四)I/O系统
  • 【Java基础】抽象类和接口的使用
  • Golang的性能优化
  • 实现两栏布局的五种方式
  • 博物馆门票预约APP的设计与实现(源码+lw+部署文档+讲解等)
  • 【AI视野·今日Robot 机器人论文速览 第四十四期】Fri, 29 Sep 2023
  • 一维数组和二维数组的使用(char类型)
  • 1.基本概念 进入Java的世界
  • 程序在线报刊第一期
  • k8s 拉取镜像报错 no basic auth credentials
  • Koa处理请求数据
  • 关于浮点数的 fld、fadd、fstp 汇编指令介绍
  • 知识图谱小白入门(1):neo4j的安装与CQL的使用
  • 一个用java的get请求
  • 作为SiteGPT替代品,HelpLook的优势是什么?
  • uni-app:实现页面效果2(canvas绘制,根据页面宽度调整元素位置)
  • 【24种设计模式】责任链模式(Chain of Responsibility Pattern)
  • 微信小程序一对多个页面间传递数据进行通信,事件触发的实现方法
  • 软件测试之Python基础学习
  • 模块化编程+LCD1602调试工具——“51单片机”
  • 【Linux】UDP的服务端 + 客户端
  • 德国自动驾驶卡车公司【Fernride】完成1900万美元A轮融资
  • 实现水平垂直居中的十种方式