遥控器参数
遥控器采取HS2245PT芯片,吸收模块采取LR43B无线射频吸收模块
遥控器与吸收模块选用的是下图所示的两款:
由于LR43B无论是否接管遥控旗子暗记,输出引脚DAT均有波形输出,须要我们区分遥控旗子暗记与正常状态下旗子暗记差异,我们可以用示波器不雅观察波形。LR43B供电3.3V接GND,示波器一脚接GND,一脚接DAT的任意一脚,得到正常波形如下:
然后按下遥控器提高按钮,得到如下有规律的波形:
将其放大便于不雅观察每段的波形,如下图:
按下退却撤退得到的波形如下:
可以创造无论退却撤退还是提高,比较于普通的波形来说都是在开头有一段规律特色的明显的高低电平,并且创造这两段波内容都由如下两种波组成:
将1号类型低高电平比例3:1的波命名为0码,2号低高电平比例为1:3的命名为1码。
程序逻辑
1:读取高低电平持续的韶光
2:征采每段波形的开头:读到高电平持续韶光为3500us时开始读数
3:读取每段波形中1号和2号类型电平的数量之和(这里数出来一共40段低高电平,对应一段波有着40位数据),根据每种波高电平持续的韶光判断是1号还是2号,就可以将对应位数置0或者置1,这样我可以得到两段二进制的数:
提高旗子暗记:(0100 1001 1001 0001 0000 1100 0000 0101 0001 0100)
退却撤退旗子暗记:(0100 1001 1001 0001 0000 1100 0000 0011 0001 0110)
不雅观察创造40位数中前29位数据都是一样的,这样我们可以定义一位32位的数据,将提高/退却撤退旗子暗记的前32位数对应置0置1,可以得到:
提高=0100 1001 1001 0001 0000 1100 0000 0101
退却撤退=0100 1001 1001 0001 0000 1100 0000 0011
4:在读取完前32位数据后,得到一串数字,通过校验高8位是否为0100 1001=0x49判断是否吸收到的提高退却撤退旗子暗记
5:得到末了详细数据
RF=0x49910C05为提高旗子暗记
RF=0x49910C03为退却撤退旗子暗记
例程代码
解释:选用STM32F103系列芯片,数据吸收IO口为PB13,函数应放在100us中断里, RF_DATA为遥控器数据。
u8 LR43B_FLAG=0;
u8 LR43B_COUNT=0;
u8 LR43B_STATUS=0;
u16 LR43B_HIGH_COUNT=0;
u16 LR43B_LOW_COUNT=0;
u32 LR43B_DATA1=0;
//无线遥控模块
//100us延时函数
void LR43B_SCAN(void)
{
// 1:读取高低电平持续的韶光
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13 ))
{
bit_set(LR43B_FLAG,0);
LR43B_HIGH_COUNT++;
}
else
{
bit_set(LR43B_FLAG,1);
LR43B_LOW_COUNT++;
}
if(LR43B_FLAG==3)
{
LR43B_COUNT++;
LR43B_FLAG=0;
//2:征采每段波形的开头
if(((LR43B_HIGH_COUNT>30)&&(LR43B_HIGH_COUNT<40)))
{
bit_set(LR43B_STATUS,0); //开始标志
LR43B_COUNT=0;
}
//3:将提高/退却撤退旗子暗记的前32位数对应置0置1
if(LR43B_COUNT&&btfss(LR43B_STATUS,0))
{
if(LR43B_COUNT>=2&&LR43B_COUNT<=64)
{
//根据高电平时间判断该位数据置0还是置1,LR43B_COUNT为偶数时为高电平
if(LR43B_COUNT%2==0)
{
if(LR43B_HIGH_COUNT<4) bit_clr(LR43B_DATA1,32-LR43B_COUNT/2);
else bit_set(LR43B_DATA1,32-LR43B_COUNT/2);
}
}
}
if(LR43B_COUNT==64&&btfss(LR43B_STATUS,0))
{
//4:校验高8位
if(LR43B_DATA1>>24==0x49)
{
//5:得到末了详细数据
RF_DATA= LR43B_DATA1;//终极得到值
// RF_DATA==0x49910C05提高
// RF_DATA= 0x49910C03退却撤退
}
LR43B_STATUS=0;
LR43B_DATA1=0;
}
LR43B_HIGH_COUNT=0;
LR43B_LOW_COUNT=0;
}
}