MCU裸机:一、315/433MHz/IR射频解码开发
MCU裸机:一、315/433MHz/IR射频解码开发
Frist
文章目录
- MCU裸机:一、315/433MHz/IR射频解码开发
- MCU裸机开发大多基于其寄存器和一些外设信号处理的简易逻辑
- 一、315/433MHz信号数据帧解读
- 二、程序解码功能实现
- 1.首先构造一个315/433MHz的解码结构体(方便后续的移植)
- 2.解码逻辑函数编写
- 3.应用层书写(这一层是看应用场景需求编写)
- 总结
MCU裸机开发大多基于其寄存器和一些外设信号处理的简易逻辑
对于刚入行的我希望在博客上进行一些微处理器的开发,并将所学知识和技术以及方案进行记录总结,此篇内容将会介绍一些遥控无线模块如IR、RF433、RF315等信号基本处理。
一、315/433MHz信号数据帧解读
此例中使用WL531系列芯片作为315/433MHz的转码方案。
- 硬件电路如下:
- 逻辑分析仪抓取的波形如下:
抓取 初始波形,可以看见是有很多乱序的杂波。(所以需要经过一定的处理)
提取完整两帧波形
放大分析得出转码波形的每一个数据bit都由一个周期的方波组成,频率为617.88Hz,定义抓取数据帧的每一个周期方波在占空比为25%(高电平时长为425us左右)时该bit=0;占空比为75%(高电平时长为1.63984ms左右)为bit=1。
红外:(NEC、RC-5协议)后续更新。
二、程序解码功能实现
1.首先构造一个315/433MHz的解码结构体(方便后续的移植)
将所需要的形参及硬件接口层进行声明和定义:
#define IR_Pin RC1 //硬件接口
typedef struct IRDecode //解码逻辑层
{unsigned char LeadCode1; //引导码(用于记忆和学习部分)unsigned char LeadCode2;unsigned char LeadCode3;unsigned char LeadCode4;unsigned char IRCode1Control; //控制码(处理后最终编码)unsigned char IRCode2Control;unsigned char IRCode3Control;unsigned char IRCode4Control;unsigned char IRCode1Data; //传递码(源数据帧流)unsigned char IRCode2Data;unsigned char IRCode3Data;unsigned char IRCode4Data;unsigned char IRCode1; //采集码(原始数据解码运用)unsigned char IRCode2;unsigned char IRCode3;unsigned char IRCode4;unsigned char IRWaveCount; //连续发波计时unsigned char IRHighLevelCount;unsigned char IRLowLevelCount; unsigned char IRHighLevelFlag : 1;unsigned char IRLowLevelFlag : 1;unsigned char IRCodeLength : 6;unsigned char IRLearnableFlag : 1;
}IRDecode;
//应用层
typedef struct IRWorkData{ //数据帧事件处理unsigned char IRKeyState1 :1;unsigned char IRKeyState2 :1;unsigned char IRKeyState3 :1;unsigned char IRKeyState4 :2;
// unsigned char IRKey1Transfer :1;unsigned char IRKey2Transfer :1;unsigned char IRKey3Transfer :1;unsigned char IRKey4Transfer :1;unsigned char IRKey4LongPressFlag :1;unsigned short int IRLongKey4Count;
}IRWorkData;
IRDecode IRDriver;
IRWorkData IRKeyHandle;
2.解码逻辑函数编写
利用125us定时器对数据入口的高低电平进行计数,计算出高低电平的时间转化为bit缓存起来,后续输出完整数据帧进行下一步工作:
//可更改或优化其中计数的阈值应用在其他协议上
//码值获取(循环调用us级)
void ScanGetIRCode(void){if(IR_Pin){IRDriver.IRHighLevelFlag=1;if(IRDriver.IRHighLevelCount<=250) IRDriver.IRHighLevelCount++;// //低电平时长超时滤波*16us=2ms,重新读值
// if(IRDriver.IRHighLevelCount>=16){// IRDriver.IRCodeLength=0;
// } if(IRDriver.IRLowLevelFlag){ //上升沿IRDriver.IRLowLevelFlag=0;IRDriver.IRLowLevelCount=0;IRDriver.IRHighLevelCount=0;}}else{IRDriver.IRLowLevelFlag=1;if(IRDriver.IRHighLevelFlag){ //下降沿//高电平采样编码,下降沿处理if((IRDriver.IRHighLevelCount>1)&&(IRDriver.IRHighLevelCount<=11)){//码值1获取if(IRDriver.IRCodeLength<8){IRDriver.IRCode1=IRDriver.IRCode1>>1;if((IRDriver.IRHighLevelCount>=8)&&(IRDriver.IRHighLevelCount<=11)){IRDriver.IRCode1|=0x80;} else{IRDriver.IRCode1&=0x7F;}}//码值2获取else if(IRDriver.IRCodeLength<16){IRDriver.IRCode2=IRDriver.IRCode2>>1;if((IRDriver.IRHighLevelCount>=8)&&(IRDriver.IRHighLevelCount<=11)){IRDriver.IRCode2|=0x80;} else{IRDriver.IRCode2&=0x7F;}}//码值3获取else if(IRDriver.IRCodeLength<24){IRDriver.IRCode3=IRDriver.IRCode3>>1;if((IRDriver.IRHighLevelCount>=8)&&(IRDriver.IRHighLevelCount<=11)){IRDriver.IRCode3|=0x80;} else{IRDriver.IRCode3&=0x7F;}}//码值4获取else{IRDriver.IRCode4=IRDriver.IRCode4>>1;if((IRDriver.IRHighLevelCount>=8)&&(IRDriver.IRHighLevelCount<=11)){IRDriver.IRCode4|=0x80;} else{IRDriver.IRCode4&=0x7F;}}IRDriver.IRCodeLength++;//只处理32位数据if(IRDriver.IRCodeLength>=32){IRDriver.IRCodeLength=0;if((IRDriver.IRCode1==IRDriver.LeadCode1)){ //原始码IRDriver.IRCode1Data=IRDriver.IRCode1;IRDriver.IRCode2Data=IRDriver.IRCode2;IRDriver.IRCode3Data=IRDriver.IRCode3;IRDriver.IRCode4Data=IRDriver.IRCode4;IRDriver.IRWaveCount=0; //数据帧结束计时}//接收数据帧清零IRDriver.IRCode1=0xFF; //防止误判IRDriver.IRCode2=0;IRDriver.IRCode3=0;IRDriver.IRCode4=0;}}else{IRDriver.IRCodeLength=0; //高电平杂波滤除}IRDriver.IRHighLevelFlag=0;IRDriver.IRLowLevelCount=0;IRDriver.IRHighLevelCount=0; }if(IRDriver.IRLowLevelCount<=250) IRDriver.IRLowLevelCount++;//低电平时长超时滤波*16us=2ms,重新读值if(IRDriver.IRLowLevelCount>=12){IRDriver.IRCodeLength=0;}}
}
3.应用层书写(这一层是看应用场景需求编写)
通过对数据帧间隔信号的获取,可以处理数据帧为波包的一种标志位跟随,即有数据帧发送到MCU时缓存可见有数据,反之缓存中的数据清零。(以追求实际操作信号的同步):
//数据帧及连续发波处理(循环调用ms级)
void IRContinnuousWave(void){if(IRDriver.IRWaveCount<=254) IRDriver.IRWaveCount++;if(IRDriver.IRWaveCount>=36&&IRDriver.IRCode4Data!=0){ //72ms完整数据帧间隔时间//原始码数据帧清零IRDriver.IRCode1Data=0;IRDriver.IRCode2Data=0;IRDriver.IRCode3Data=0;IRDriver.IRCode4Data=0;}
}
总结
上述内容可以拓展到一些内似协议的解码和编码上面去,但是程序暂时并未进行面向对象的封装以及队列的优化,暴露了C/C++的编程功底不行,需要多练多学。
MCU裸机:一、315/433MHz/IR射频解码开发相关推荐
- 315 433MHZ无线遥控接收解码源程序 Keil源程序 含AD格式电路图
315 433MHZ无线遥控接收解码源程序 Keil源程序 含AD格式电路图 YID:1620670090555205
- 315Mhz RF射频解码 串口输出方案(支持2262/1527多种编码方式)
315Mhz RF射频解码 串口输出方案 一.简介 二.使用前准备 三.测试方法 四.测试现象 总结 原文链接:https://www.yourcee.com/newsinfo/2929023.htm ...
- 315/433无线模块解码
315/433无线模块解码 1.超外差315/433无线模块 现在这种接收模块一般用PRO480R/SYN480R,外围再加一些简单的典型电路,性价比高,1块多就可以买到,可实现灯光.门禁.汽车.安防 ...
- MM32射频解码(产品检验,可靠稳定)
MM32射频解码 本人曾负责开发风扇灯产品,故将射频解码的算法和程序进行总结,以便日后学习完善,也与大家分享.射频模块与MM32的通信协议为类似于EV1527的协议,每帧发送32位数据,前20位为 ...
- MCU裸机编程的状态机框架--第一部分
MCU裸机编程的状态机框架--第一部分 1 状态机的概念 1.1 状态机的要素 1.2 状态迁移表 1.3 状态机思路实现一个时钟程序 1.4 状态机应用的注意事项 1.5 更复杂的状态机 2 单片机 ...
- 硬件编解码开发 linux,Intel平台硬件加速视频编解码开发
视频编解码分为硬件加速以及非硬件加速.硬件加速是指通过显卡,FPGA等硬件进行视频编解码,由于硬件有专门优化,所以性能高,能耗低,非硬件加速编解码是指通过CPU进行视频编解码,性能就没那么高(虽然有相 ...
- Arduino - 315/433MHz RF无线收发模块
貌似又是为了找个合适的库文件进行了N多周折. 元件如下图(左边为接收模块,右边为发送模块): 接线图如下: 以下为控制代码: [库文件:RCSwitch]点此下载 [注意点:接收模块数据线要接到Ard ...
- GD32官方资料学习体系(主要包括MCU选型、原理图PCB设计、软件开发入门及用户手册等)
GD32快速上手指南 硬件开发 1.<选型手册> 2.<GD32xxx 系列硬件开发指南> 3.<GD32xxx Datasheet> 软件开发 1.<GD3 ...
- 基于 CNT 的射频辐射热计开发研究的 CPX-VF 低温探针台
有时,我们喜欢强调我们的低温探针台如何用于有趣的研究.我们最新的应用重点是由阿克伦大学领导并发表在上个月的IEEE Transactions on Microwave Theory and Techn ...
- AMD 硬解码开发(四)之边摸索边编译samples
下载资源 下载资源我们直接从官网页面进入链接就行了: 或者直接戳链接:https://github.com/GPUOpen-LibrariesAndSDKs/AMF 界面如图: 但我下了很久都没下载下 ...
最新文章
- C# 高性能 TCP 服务的多种实现方式
- java实现网站错别字搜索对的结果_Java问题:根据输入的关键词查询出搜索结果,再将搜索结果中的关键词用红色显示?这个怎么实现?...
- 喜笑等动作收集起来的扎金花GAME
- 跨浏览器兼容的HTML5视频音频播放器
- TIDB介绍 新数据库趋势
- element table多选和单选
- 计算机视觉标准数据集整理—PASCAL VOC数据集
- springmvc 基础内容
- WINDOWS用VS2010开发NPAPI插件步骤
- redis-LinkedList
- 江苏计算机专业接本,江苏农牧科技职业学院专接本或专转本的通知
- tensorflow出现问题Passing (type, 1) or 1type as a synonym of type is deprecated
- 基金购买和赎回线下业务
- linux还原防火墙设置,Linux防火墙设置教程
- 如何屏蔽迅雷9右侧广告首页
- 高速数据采集存储系统分类
- OpenFlow协议初探——OpenFLow中的流和流表
- mysql自定义变量比较大小_MySQL 自定义变量@ 常用案例
- 除了知网、百度,还有什么查阅资料的网站或软件吗?
- 手机移动视频监控系统方案