hx1838红外遥控(1):接收时序的解码

hx1838红外遥控(1):接收时序的解码sma天线
本⽂开发环境:
MCU型号:STM32F103C8T6
IDE环境: MDK 5.27
代码⽣成⼯具:STM32CubeMx 5.6.1
HAL库版本:STM32Cube_FW_F1_V1.8.0
本⽂内容:
STM32 使⽤ 定时器捕获功能捕获红外时序
解码 hx1838 时序
附件:
MDK5 ⽰例⼯程
红外遥控器 + 红外接收头 :
测试过程请注意遥控和接收头的距离不要过远,本⽂遥控在1m以上会有不稳定现象,实际操作可以使⽤⽰波器或逻辑分析仪捕获波形,保证接收头收到的遥控数据是完整的。
⼀、接收头的滤波输出
hx1838 红外接收头⾃带了滤波的功能,本⽂使⽤的接收头中,当接收到38Khz的PWM 时,输出低电平,否则输出⾼电平:智能婴儿床
由于接收头的滤波功能,所以程序只需要检测⾼低电平的时长既可。
⼆、NEC编码
本⽂使⽤的 红外遥控器采⽤了NEC编码规则:
NEC 载波频率为 38Khz
瓶嘴引导码:9ms ⾼电平 + 4.5ms 低电平
1 码 :0.56 ms ⾼电平 + 0.56 ms 低电平
0 码 : 0.56ms ⾼电平 + 1.68 ms 低电平
结束码 :0.56ms ⾼电平
数据帧格式:引导码 + 地址 + 地址反码 + 键值 + 键值反码 + 结束码
重复帧格式:9ms ⾼电平 + 2.25ms低电平 + 结束位 + 结束码
⾼位在前,即⾸先收到的是⾼位的数据
注:本⽂使⽤的接收头,电平极性与协议相反。所以,当捕获到⼀个 9ms 低电平 + 4.5ms ⾼电平时,即收到⼀个引导码。三、时序图
这是逻辑分析仪捕获到当遥控上按键 [1] 被按下⼀次的时序:
根据 NEC 的编码格式,可以实际看出这⼀帧数据的含义:
由于红外接收头输出的极性相反,所以⾼电平宽的波形为1码,⾼电平窄的波形为0码。
四、解码
菠萝去皮机
只需要获取每个波形⾼低电平时长,通过然后将对应的数据置1或清0,最后读取整个数据即可。本⽂将时序的解码分为三个部分:
时序捕获
这部分程序负责捕获⾼低电平的之间变化,并记录其持续的值记录到数组中,初始化时,将定时器通道配置为下降沿捕获,当捕获到⼀个下降沿,就将捕获极性改为上升沿,并记录此时时间,下⼀次捕获时,说明获得了⼀个低电平,将两次时间作差,既可以得到低电平的时间。
时序解码
这部分程序负责读取时序捕获的值,并根据时长判断码值,最后合并成数据,如读取数组第⼀个值和
第⼆个值分为为 9ms 和 4.5 ms,那么将认为捕获到⼀个引导码,读取到⼀个0.56ms低电平和0.56ms⾼电平,则认为读取到⼀个 0 码。
执⾏程序
这部分根据解析到的键值执⾏相应的代码
五、STM32CubeMx 输⼊捕获配置
这⾥只列出关键配置,关于 Mx 配置定时器捕获原理及完整的⽰例,详见: 的输⼊捕获部分
本⽂将 TIM1 的 CH1 设置为输⼊捕获通道:
并打开了定时器溢出中断和捕获中断:
将定时器配置为72分频,即计数频率为 1M (TIM1 时钟源为 72M),可以捕获us级别的时间间隔。
六、程序
假牙清洁剂程序主要分为4个部分:
调试语句
波形捕获
波形解码
程序执⾏
使能捕获
空闲状态:本⽂使⽤变量sta_idle来标志空闲状态,空闲状态只能是没有数据正在捕获中。
1. 调试部分
当 宏定义 RX_DBG_EN 为 1 时,RX_DGB 等效于 printf ,可以正常的打印数据,当 RX_DBG_EN 为0 时 RX_DGB 为空语句,程序不打印数据。
#define  RX_DBG_EN  0
#if RX_DBG_EN
#define RX_DBG(format, ...) printf(format, ##__VA_ARGS__)
#else烷基叔丁基醚
#define RX_DBG(format, ...) ;
#endif
这样,可通过RX_DBG_EN 宏,来控制程序是否打印调试信息。
本⽂⽰例⼯程中,宏被关闭,如果需要查看调试信息,将值改为1即可。由于打印数据较多,有⼀定概率打印不完整,⼀般重复3-4次即可获取⼀次完整数据。打开调试宏请避免使⽤连按功能。
2. 波形捕获
本⽂设置了TIM1的CH1为捕获通道,波形的捕获需要2个回调函数:
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
极性捕获函数⽤来捕获 IO ⼝的电平跳变,并记录当时计时的值
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
因为定时器溢出以后,计数会清0(本⽂配置决定),所以当捕获的电平在计数周期末时⽐如(9999),下⼀个电平来时候,可能捕获的值为550,所以计算时间差需要 550 + 10000(1次溢出)- 9999
2.1 捕获中断回调函数
rx_rcv_init() 是 HAL_TIM_IC_CaptureCallback() ⼦函数:

本文发布于:2024-09-24 00:27:10,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/150752.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:捕获   数据   低电平   程序
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议