433MHz无线通信

您所在的位置:网站首页 430遥控器怎么对码 433MHz无线通信

433MHz无线通信

2023-10-12 10:14| 来源: 网络整理| 查看: 265

 

基本概念

工作频率:433.92MHz

调制方式:ASK/OOK,FSK,GFSK

现有遥控与接收器方案中,多数使用ASK/OOK调试方式。ASK即“幅移键控”又称为“振幅键控”,也有称为“开关键控”(通断键控)的,所以又记作OOK(On-Off keyed)信号。ASK是一种相对简单的调制方式。幅移键控(ASK)相当于模拟信号中的调幅,不同的是与载频信号相乘的是二进制数码。幅移就是把频率、相位作为常量,而把振幅作为变量,信息比特是通过载波的幅度来传递的。如下图所示,ASK调制方式的典型时域波形,虚线部分表示二进制的0和1,红色实线部分表示调制信号。

 

国家标准

标准可参考“信部无[2005]423号 关于发布《微功率(短距离)无线电设备的技术要求》的通知”,要求如下:

(十一)各类民用设备的无线控制装置

不得用于无线控制玩具、模型等。

1.使用频率:314-316MHz,430-432MHz,433.00-434.79MHz

  发射功率限值:10mW(e.r.p)

  占用带宽:不大于400kHz

编码与解码

以遥控器为例,在明确调制方式后,需要为遥控器编码方式进行约定。一组遥控编码通常需要包含“引导码/起始码”、“用户码”、“数据码”、“结束码”、“重复码”,格式如下:

 

确定编码组成后需要明确“逻辑0”、“逻辑1”的表示方法,可以遵循标准的编码方案,也可以进行自定义。标准编码方案可以使用“曼彻斯特编码”等方案,在自定义编码方案时可以参考下图所示的编码规则,主要是电平顺序与电平长度的组合。

 

以遥控的编码为例进行分析,得到如下编码波形:

 

假设:

高电平长码 + 低电平短码表示逻辑1

高电平短码 + 低电平长码表示逻辑0

可以得到该组数据为“0x88 0x03 0xBD 0xB6”。

 

解码过程是对编码过程的逆向,解码程序需要根据编码方案进行设计。遥控器的解码方案请参考“参考示例”。

参考示例

根据测得的遥控器编码波形可知,433MHz接收端输出的信号中,电平维持时间有20ms、9ms、1.6ms、700us这几种。使用1.6ms高电平 + 700us低电平表示逻辑1,700us高电平 + 1.6ms低电平表示逻辑0,9ms高电平表示引导/起始码,700us高电平 + 20ms低电平表示结束码,同时也表示“重复码“”的起始。

程序设计中,对700us的电平进行检测并计数,要保证做够的容错能力,需要将定时器中断做到100us以下,甚至更小,显然使用定时器中断处理时不合理的。在本示例中,采用外部中断 + 定时器计数的方式进行电平长度采样。外部中断采用上升沿和下降沿触发,在中断中根据当前电平切换边沿触发方式。定时器使用系统时钟(16.6MHz)的64分频作为时钟源,具有足够的分辨率,可提高接收机的容错能力。

数据采样逻辑中,下降沿时判断当前高电平表示的逻辑值,上升沿是对上一步中产生的逻辑值进行确认,若逻辑值合法则对该逻辑值进行记录,若不合法,这舍弃该逻辑值,并初始化接收机,等待下一次数据。程序流程图如下:

 

示例代码:

代码基于中颖电子SH79F3212书写。

外部中断初始化为上升沿触发,当前电平INT45Level默认为低。

使用定时器3作为计数器

/*---------------定时器时钟使用系统频率64分频------------------*/ //1ms计数260 //实测引导码高电平长度为9.7ms,低电平长度为2ms #define HeadCont_H 2540 //9.7ms #define HeadCont_L 500 //2ms //实测逻辑1为高电平1.7ms+低电平0.6ms #define OneCode_H 450 //1.7ms #define OneCode_L 160 //0.6ms //假设0码为高电平0.6ms+低电平1.7ms #define Zero_H 160 #define Zero_L 450 //容错范围 #define FaultTolerant 50 寄存器定义 uint16 T3Counter; bit INT45Level = 0; bit ZeroCode; //接收到逻辑0 bit OneCode; //接收到逻辑1 bit MaybeRemoteStart; //疑似接收到起始码 bit RemoteStart; //开始接收遥控数据 bit ReadOver; //接收完成 #define DefRemoteDataBufLen 10 //默认遥控数据长度 idata uint8 RemoteDataBuffer[DefRemoteDataBufLen]; //接收缓冲区 idata uint8 ReadTab[DefRemoteDataBufLen]; //已接收,待处理数据 idata uint8 ReadBitCont; //读取Bit计数 idata uint8 ReadBuffer; //数据缓存区 idata uint8 ReadByteCont; //读取字节计数 外部中断服务程序 void INT45_interrupt() interrupt 9 { u8 backtemp; backtemp = INSCON; INSCON = 0x00; if((EXF1&0x20) == 0x20) { //读取T3计数器 INSCON |= 0x40; T3CON = 0x00; T3Counter = 0x0000|(TH3 (HeadCont_H - FaultTolerant))&&(T3Counter < (HeadCont_H + FaultTolerant))) { MaybeRemoteStart = 1; //疑似遥控数据头 } else { if((T3Counter> (OneCode_H - FaultTolerant))&&(T3Counter < (OneCode_H + FaultTolerant))) { OneCode = 1; ZeroCode = 0; } else { if((T3Counter > (Zero_H - FaultTolerant))&&(T3Counter < (Zero_H + FaultTolerant))) { ZeroCode = 1; OneCode = 0; } else { ZeroCode = 0; OneCode = 0; } } } INT45Level = 0; //当前电平为低 EXF0 = 0x80; //设置为上升沿触发 } else //处理上升沿 { if(RemoteStart) { if((T3Counter >(OneCode_L - FaultTolerant))&&(T3Counter < (OneCode_L + FaultTolerant))) { if(OneCode) { //接收到一个bit 为1 GetOneByte(); } else { //数据出错,丢弃 RemoteStart = 0; OneCode = 0; ZeroCode = 0; ReadOver = 0; } } else { if((T3Counter > (Zero_L - FaultTolerant))&&(T3Counter < (Zero_L + FaultTolerant))) { if(ZeroCode) { //接收到一个bit 为0 GetOneByte(); } else { //数据出错,丢弃 RemoteStart = 0; OneCode = 0; ZeroCode = 0; ReadOver = 0; } } else { if(ZeroCode && (T3Counter > 4000)) //结束码,同时也是重复码的起始 { ReadOver = 1; OneCode = 0; ZeroCode = 0; RemoteStart = 0; GetOneByte(); } else { //干扰数据,接收器初始化 RemoteStart = 0; OneCode = 0; ZeroCode = 0; ReadOver = 0; } } } } else { if(MaybeRemoteStart) { if((T3Counter > (HeadCont_L - 20))&&(T3Counter < (HeadCont_L + 20))) { RemoteStart = 1; //遥控数据开始发送 ReadBitCont = 0; //读取Bit计数 ReadBuffer = 0; //数据缓存区 ReadByteCont = 0; //读取字节计数 ReadOver = 0; MaybeRemoteStart = 0; } } } INT45Level = 1; //当前电平为高 EXF0 = 0x40; //设置为下降沿触发 } } EXF1 = 0x00; INSCON = backtemp; } GetOneByte()子函数,接收完整字节并处理 void GetOneByte() { int i; if(ReadBitCont


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3