项目场景:
使用PT2262作为遥控器,VS838红外管接收信号,STM32F103解码
问题描述:
PT2262遥控器如下:
PT2262数据发送格式如下:
这里有一个问题,我目前还没见过数据‘0’的波形,是我调的有问题吗,欢迎大家来指正
数据分析:
完整的一次数据传输包括一次同步码,8位地址码,4位数据码,每个码为两个组高低电平组成,经过示波器实地测量后发现,没有发现数据‘’0‘’码,故我将数据‘F’码当做数据‘0’
解决方案:
使用STM32F103的定时器输入模式
(别问我为什么不用方波输入模式,问就是我画电路板的时候画错了,阿巴阿巴)
这里只采集高电平时间,但也足够使用了,采集到的数据如下表所示
这里面DATA4的数据格式存在问题,这个问题本身是偶发性的,最终决定代码中放弃采集奇数位数据(即每一个数据的第一个高电平时间)
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
static uint16_t keytime = 0;
static uint16_t key = 0;
if(htim->Instance == TIM4)
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4)
{
keytime = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
if(key_flag == 0 &&keytime > 14000 &&keytime < 16000) //等待码
{
key = 0;
key_flag = 1;
}
else if(key_flag %2&&keytime> 1000&&keytime<2000)
{
key <<= 1;
key_flag++;
}
else if(key_flag %2&&keytime> 200&&keytime<900)
{
key <<= 1;
key_flag++;
}
else if(key_flag != 0&&!(key_flag %2) &&keytime> 200&&keytime<900)
{
key_flag++;
}
else if(key_flag != 0&&!(key_flag %2) &&keytime> 1000&&keytime<2000)
{
key |= 0x01;
key_flag++;
}
else if(key_flag == 25)
{
if(key == 7)
KEY_SetStatu(1);
else if(key == 11)
KEY_SetStatu(2);
else if(key == 13)
KEY_SetStatu(3);
else if(key == 14)
KEY_SetStatu(4);
key_flag = 0;
}
else
key_flag = 0;
}
__HAL_TIM_SetCounter(&htim4,0);
}
}
初始化代码:
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_3);
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);
HAL_TIM_Base_Start_IT(&htim4);