打印

请教STM32 IrDA+TSOP34838接收红外遥控器信号问题

[复制链接]
10115|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xsq5360|  楼主 | 2010-5-11 09:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我目前再做一个项目,其中涉及到利用STM32的IrDA接口接收红外遥控器的信号,遥控器信号频率是37.92khz,接收芯片采用TSOP34838,频率为38khz,TSOP34838输出接STM32F103VCH6的UART5_RX。
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/T7NEC6JZ`Y$Q)QA`F6KVU40.jpg
但调试好像总是不对。首先一个问题是,载波频率和波特率有什么关系?IrDA初始化代码中需设置波特率,该参数具体如何设置?

按照遥控器的产品说明,每次按键发送数据格式为0x00+0xFF+按键码,但实测各种波特率(600~115200),接收到数据不同,例如实测1200波特率单次按键7接收14个数据,分别为0x00 0x00 0x80 0x66 0x66 0x86 0x00 0x18 0x66 0x98 0x00 0xFE 0x00 0xFE。


IrDA初始化配置代码:
/*******************************************************************************
* Function Name  : UART5_Configuration
* Description    : 配置UART5,实现红外遥控器接收
* Input          : None
* Output         : None
* Return         : None
* Note           : 遥控器SNP-2102载波频率37.92KHz;接收芯片TSOP34838为38KHz;
*******************************************************************************/
void UART5_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
   /* Configure USART5 Rx (PD.2)as input floating */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
   GPIO_Init(GPIOD, &GPIO_InitStructure);
   USART_InitStructure.USART_BaudRate = 1200;
   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
   USART_InitStructure.USART_StopBits = USART_StopBits_1;
   USART_InitStructure.USART_Parity = USART_Parity_No ;
   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
   USART_InitStructure.USART_Mode = USART_Mode_Rx;  
   USART_Init(UART5, &USART_InitStructure);
   /* Enable the USART5 */
   USART_Cmd(UART5, ENABLE);
   /* Set the USART5 prescaler,在红外的通常模式下PSC[7:0]只能设置为00000001 */
   USART_SetPrescaler(UART5, 0x1);
   /* Configure the USART5 IrDA mode */
   USART_IrDAConfig(UART5, USART_IrDAMode_Normal);
   /* Enable the USART5 IrDA mode */
   USART_IrDACmd(UART5, ENABLE);
}

主程序中等待接收红外控制信号:
while (1)
   {
  for(i=0;i<28;i++)
  {
  /* Wait until a byte is received */
  while(USART_GetFlagStatus(UART5, USART_FLAG_RXNE) == RESET)
     {
      }
     /* Read the received byte */
     ReceivedData = USART_ReceiveData(UART5);
  }
     switch(ReceivedData[2])
     {
        case 0x42: //7  
          break;
        case 0x52: //8   
          break;
        case 0x4A: //9
          break;
        default:
          break;
      }
   }

再次深表谢意!
沙发
笑苍天| | 2010-5-11 10:46 | 只看该作者
你说的和IrDA毫无关系,和波特率也无关。
你说的应该是遥控编码识别。
遥控指令编码规律  
    遥控器所发送的功能指令码一般采用多位二进制串行码,其编码规律为:头脉冲、系统码、资料码、资料反码和结束位。头脉冲用做一帧命令的起始位;系统码用于区别不同类的电器;资料码用于完成命令功能。每次进行发送都是先发送脉宽4510us、周期2*4510us的头脉冲,然后连续发送两次系统码、接着发送资料码及资料反码、最后发送结束位,波形见下

使用特权

评论回复
板凳
IJK| | 2010-5-11 11:19 | 只看该作者
建议LZ看一下STM32的一篇AN:AN3174 Implementing an RC5 infrared remote control receiver with the STM32F10xx microcontrollers 。
  看过就很清楚了。
网址:http://www.st.com/mcu/familiesdocs-110.html

使用特权

评论回复
地板
xsq5360|  楼主 | 2010-5-11 15:56 | 只看该作者
刚注册21ic账号,第一次发帖咨询,这么快就得到大家的回复,非常感谢“笑苍天”和“IJK”!
正如笑苍天所言,今天才发现手头的遥控器并不支持IrDA SIR串行红外,联系遥控器厂家得知其使用芯片为SC6122,正在参照相关例程进行调试。

使用特权

评论回复
5
pkat| | 2010-5-11 20:48 | 只看该作者
学习了

使用特权

评论回复
6
apple| | 2010-12-11 09:14 | 只看该作者
IRDA应该不能正确接收红外遥控信号

使用特权

评论回复
7
luoqindong| | 2014-9-23 13:46 | 只看该作者
:)学习了,一直认为IrDA能接收红外遥控的信号

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

57

帖子

1

粉丝