STM32使用HAL库解码433遥控芯片EV1527

devtools/2024/11/15 4:46:50/

1、首先了解一下433遥控芯片ev1527的基本资料:

这是他编码的关键信息:
在这里插入图片描述
也就是说,一帧数据是:一个同步码+20位内码+4位按键码。
内码20位=2^20=1048576个地址。
发送就是一帧数据接一帧数据不间断发送。

2、解码思路

从上面的帧结构来分析,我的解码思路是:
1、STM32单片机配置一个引脚中断,设置为上下沿触发
2、单片机配置1个定时器,用于记录时间
3、抓住关键特征,可以看到,同步码是一帧数据的开头,它的特征是124CLK的低电平时间,所以:
3.1、测量这一帧数据的低电平时间,
3.2、如果低电平时间为124clk,就认为收到同步码,接下来要开始收数据码
3.3、收到同步码后,不断测量数据码的低电平时间,并存入BUF[24]这个数组,
3.4、接收完24个低电平后,一帧数据接收完毕。如果中途接收到同步码,就从头开始接收数据码。
3.5、解码:DATA(H)的低电平是4CLK,DATA(L)的低电平是12CLK,分析数组中的低电平时间,就可以完成解码。

3、配置

定时器配置:
在这里插入图片描述
IO口配置为上下边沿触发
在这里插入图片描述
记得打开中断
在这里插入图片描述

4、程序编写

首先头文件:

#ifndef __EV1527_H
#define __EV1527_H#include "main.h"typedef struct
{uint8_t ucRecOK;	/*接收成功*/uint8_t ucKeyCode;	/*按键码*/uint32_t ulChipID;	/*芯片ID*/uint16_t usaLowTime[24];/*24位低电平数据时间长度*/
}ev1527Type_T;extern ev1527Type_T g_tEV1527Rx;void EV1527_Decode(ev1527Type_T *tpEV1527);/*EV1527解码*/
#endif

再C文件:

#include "ev1527.h"
#include "tim.h"ev1527Type_T g_tEV1527Rx;/*
******************************************************
* 说明:PA0引脚中断回调函数,上下边沿中断配合定时器1,统计低脉冲宽度,因为引导码的特征值是低脉冲宽度是124CLK。
* 输入:
* 输出:
******************************************************
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{uint16_t usPortLevel;uint16_t usLowTime;static uint8_t ucLeadCodeFind = 0;static uint8_t ucTimePos;	usPortLevel = GPIOA->IDR & 0X0001;if(usPortLevel)/*上升沿,完成低脉冲检测*/{usLowTime = __HAL_TIM_GetCounter(&htim1);__HAL_TIM_DISABLE(&htim1);if(usLowTime > 9920 &&  usLowTime < 14880)/*引导码,12400,误差20%*/{ucLeadCodeFind = 1;ucTimePos = 0;}/*可先进行低电平时间判断,滤除杂波干扰*/else/*其他低脉冲*/{if(ucLeadCodeFind)/*只有找到引导码的情况下,才进行数据接收*/{g_tEV1527Rx.usaLowTime[ucTimePos++] = usLowTime;if(ucTimePos >= 24){ucTimePos = 0;ucLeadCodeFind = 0;g_tEV1527Rx.ucRecOK = 1;/*置位接收完成标志*/}}}}else/*下降沿,启动低脉冲宽度检测*/{__HAL_TIM_SetCounter(&htim1,0);	__HAL_TIM_ENABLE(&htim1);}
}
/*
******************************************************
* 说明:解码EV1527,使用低电平时间判断,低电平280-520ms之内,判断为1,否则为0;
* 输入:tpEV1527指针,解码完毕后,赋值到指向的结构体中的按键码和芯片ID;
* 输出:
******************************************************
*/
void EV1527_Decode(ev1527Type_T *tpEV1527)
{uint8_t i;uint32_t ulCombinedCode = 0;for(i=0; i< 24; i++)/**/{ulCombinedCode <<= 1; /** 400us,误差±30%。* 示波器实测最后一位的低电平时间比其他位的低电平时间要长,可考虑增加宽度。* 可能是发射芯片发射完最后一位后,转入到引导脉冲所需时间比较长导致。*/if(tpEV1527->usaLowTime[i] > 280 && tpEV1527->usaLowTime[i] < 520){ulCombinedCode |= 0x01;}}tpEV1527->ucKeyCode = ulCombinedCode & 0x0000000f;tpEV1527->ulChipID = (ulCombinedCode & 0xfffffff0) >> 4;
}

文件说明:
在这里插入图片描述
接收一帧数据后,就是解码了
在这里插入图片描述
注释已经写得非常明白了。

5、使用

直接在main函数里面判断是否接收完成,然后调用解码即可:

        if(g_tEV1527Rx.ucRecOK){g_tEV1527Rx.ucRecOK = 0;EV1527_Decode(&g_tEV1527Rx);			}

实际解码如下图:
在这里插入图片描述
在这里插入图片描述

6、写在最后

1、直接示波器测量4CLK的时间长度,不要用计算振荡电阻的结果。
2、有些芯片在发完最后一个数据位,然后紧接发同步脉冲的高电平,不知道是他们的芯片速度问题还是其他原因,最后一个数据位的低电平时间,要比其他数据位的低电平时间要长。所以,在判断的时候,要特殊关注一下。这个问题在我的解码函数里面有注释。


http://www.ppmy.cn/devtools/15211.html

相关文章

前端表单滑块验证码开发

Jsp页面用javascript加 滑动验证条_jsp验证码滑动实现-CSDN博客 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&quo…

分类算法——决策树(五)

认识决策树 决策树思想的来源非常朴素&#xff0c;程序设计中的条件分支结构就是if-else结构&#xff0c;最早的决策树就是利用这类结构分割数据的一种分类学习方法。 决策树分类原理详解 为了更好理解决策树具体怎么分类的&#xff0c;通过一个问题例子&#xff1a; 问题…

ADOP告诉您光分路器的类型?如何选择?

&#x1f331;在无源光网络&#xff08;PON&#xff09;中&#xff0c;光分路器作为核心光器件&#xff0c;可帮助多个用户共享一个PON接口&#xff0c;最大限度地扩展了光网络性能。那么你知道目前市面上有多少种光分路器吗&#xff1f;该如何选择呢&#xff1f; 阅读本文后&a…

【教程】MySQL数据库学习笔记(五)——约束(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 第三章 《数据定义语言DDL》 第四章 《数据操…

HiveQL-DML总览

一、LOAD Hive在将数据加载到表中时不进行任何转换。加载操作目前是纯拷贝/移动操作&#xff0c;将数据文件移动到与配置单元表相对应的位置。 语法&#xff1a; load data [local] inpath filepath [overwrite] into table tablename [partition (partcol1val1, partcol2val…

Java23种设计模式-结构型模式之享元模式

享元模式&#xff08;Flyweight Pattern&#xff09;:主要用于减少创建大量相似对象时的内存占用。通过共享对象&#xff0c;享元模式可以减少内存中对象的数量&#xff0c;从而提高程序的性能。 角色&#xff1a; 1.享元角色&#xff08;Flyweight&#xff09;&#xff1a;享…

【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(三)、功能仿真测试

本次实验&#xff08;一&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天大学】实验&#xff1a;时序逻辑设计——三色灯开关&#xff08;一&#xff09;、实验指导书 本次实验&#xff08;二&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天…

webpack -vite(Rollup )-Gulp (一)

vite基于什么打包 Vite 是一个现代的前端构建工具&#xff0c;它在开发环境中利用浏览器原生的 ES 模块加载机制实现快速启动和热更新&#xff0c;而在生产环境打包时&#xff0c;默认基于 Rollup 进行构建。Rollup 是一个JavaScript 模块打包器&#xff0c;尤其擅长处理 ES 模…