STM32 红外复制程序及思路

由于这段时间在中科院实习,内容是开发红外学习及发送系统。索性将开发思路写下来,代码关键部分稍微解释。二赛君原创,勿未经同意转载。红外通信编解码原理,以及涉及到的局部知识比如Flash 串口等不做说明,自行谷歌。

控制器学习有两种,固定码学习和波形复制式学习。后者具有较强适应性,主要是把原始红外信号进行完全复制,无需知道红外码信息,只需要记录信息的脉冲宽度(即时间长短),并对信号进行适当压缩,将压缩后的信息存储在ROM或Flash存储器中,在发射时将存储在存储器中的编码载波到高频上,还原为原始信号,就完成了学习红外信号的过程。适用于各种型号遥控器。此次设计采用的是波形复制。

点击查看原图

图1 控制系统结构图

系统实现以下功能:

(1)接收发送能力。对红外遥控信号进行调制接收存储,系统设计中采用一体化红外接收头来完成接收红外遥控信号。

(2)存储能力。红外节点需要具有一定的存储空间,对接收到的红外遥控指令代码进行存储和排序。

(3)通信能力。利用PC机串口调试助手向控制系统发送控制命令,学习模式还是发送模式;

(4)数据处理能力红外系统需要对接收到的红外遥控编码信号进行载波调制处理、存储以及解调后转发,最后通过红外发射电路发送出去,从而可以远程控制设备。

以下是部分要点:

调制载波频率为 38KHz,原因是可以避免其它红外噪声光源的干扰,最大程度上保证通信稳定性。

调制只需要根据高低电平时间控制定时器的开关即可。

利用定时器捕获中断获取高低电平时间。

void TIM1_CC_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM1,TIM_IT_CC1) == SET)   // ²¶»ñµ½ÉÏÉý»òÕßϽµÑØ
    {
        TIM_ClearITPendingBit(TIM1,TIM_IT_CC1);   // Çå³ýÖжϱêʶλ
        if (flag==0)
        { 
			      TIM1_ICInitStructure.TIM_Channel = TIM_Channel_1;
			      TIM1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;   //ÉèÖÃÉÏÉýÑز¶»ñ
			      TIM1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
			      TIM1_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
			      TIM1_ICInitStructure.TIM_ICFilter = 0x0;      // Â˲¨ÉèÖÃ
			      TIM_ICInit(TIM1, &TIM1_ICInitStructure);
			
		              value[2*num_value]=TIM_GetCounter(TIM1);  //²¶»ñÖµ
			      flag=1;
        }
		    else
		    {
			      TIM1_ICInitStructure.TIM_Channel = TIM_Channel_1;
			      TIM1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;   // ÉèÖÃϽµÑز¶»ñ    
			      TIM1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
			      TIM1_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
			      TIM1_ICInitStructure.TIM_ICFilter = 0x0;      // Â˲¨ÉèÖà   
			      TIM_ICInit(TIM1, &TIM1_ICInitStructure);
			
			      value[2*num_value+1]=TIM_GetCounter(TIM1);  // ²¶»ñÖµ
			      flag=0;
		    }
				
		    /*  num_valueÿ½øÈëÁ½´ÎÖжϲżÓ1 */
		    j++;
		    if(j==2)
		    {
			      j=0;
			      num_value++;
		    }
				
		    /* ±È½ÏvalueÖµ £¬´æ·Å¸ßµÍµçƽʱ¼ä  */
		    if (value[1]!=0)  //ÓÐÊýÖµÖ®ºó£¬Ò²¾ÍÊǵÚÒ»´Î²»×öÔËËã
		    {
			      if(value[num_pluse+1] >= value[num_pluse])
                              {	
				        pluse[num_pluse] = value[num_pluse+1] - value[num_pluse];
			      }
			      else
			      {
				        pluse[num_pluse] = 65535*n - value[num_pluse] + value[num_pluse+1];   // ¿ÉÄÜ×îÔÚ¶à´ÎÒç³ö£¬½øÈëÒç³öº¯Êý£¬n++
			      }
													
		        n=0;    	//Òç³ö»¹Ô­Îª³õʼֵ1
		        num_pluse++;
		    }	
	  }
}

绘制的PCB点击查看原图

捕获的高低电平放置临时数组,在接收串口中断后,将数组存放至Flash中。

CSDN一篇博文可参考。http://blog.csdn.net/u013686019/article/category/1924251

留下评论