硬汉嵌入式论坛

 找回密码
 立即注册
查看: 860|回复: 0
收起左侧

[客户分享] 红外+NEC协议的编解码驱动

[复制链接]

10

主题

34

回帖

64

积分

初级会员

积分
64
发表于 2024-9-26 16:10:08 | 显示全部楼层 |阅读模式
硬件平台:正点原子-潘多拉IOT开发板,STM32L475

软件平台:FreeRTOS

之前学习ESP32时,ESP32有一个外设RMT,可以直接捕获电平宽度,也可以直接输出对应电平宽度的信号;捕获的值以列表形式存储,用户根据其电平宽度(时间)解码,这种方式比较灵活,可以对应不同的红外协议。
所以本驱动也是按照这个思路,IR为红外发送,与协议无关;NEC为协议,与用什么发送无关:
1.解码:
IR:使用定时器捕获功能,以下降沿为开始,到相反边沿时记录电平宽度的时间并同时开始为下一次电平宽度计时,低电平和高电平各自存储在同一个结构体但不同的缓存里,并分别记录高低电平数量。
NEC:不断读取IR接收的数据,并试图解码,当数据接收完成时解码成功,返回地址和数据,如收到重复码,并大于10个重复码时,以一个固定时间间隔返回重复标志

2.编码
IR:根据发送序列里配置的逻辑0-1,持续时间,使用两个个定时器,一个输出38KHz左右的PWM,一个控制PWM的输出时间,来驱动红外发射头。
NEC:调用IR层的void IR_Send_Add(uint8_t logic, uint16_t time),将头码,地址码,地址反码,数据码,数据反码,结束码添加进发送序列,然后IR_Send_Start启动定时器。

功能:支持单按和长按,单按时立即返回结果,长按时也立即返回结果并在固定时间(可配置,几百个ms)后以固定时间间隔返回同一个结果。体验接近遥控器

应用层:
调用  if(NEC_Read(&addr, &cmd, &repeat) == 0)  接收
调用  NEC_Send(addr, data);                               发送

源码:包含定时器驱动,ir,nec
IR_NEC.7z (5.71 KB, 下载次数: 24)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 14:53 , Processed in 0.255283 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表