STM32红外的学习与控制

[复制链接]
10538|19
 楼主| xiaozhismh 发表于 2011-7-15 15:15 | 显示全部楼层 |阅读模式
本帖最后由 xiaozhismh 于 2011-7-15 15:33 编辑

STM32红外的学习与控制
         刚毕业不久,这可以说是我在公司做的第一个项目吧,跟大家分享一下!一、环境:
         公司所采用的是STM32F103RBT6芯片,本人开发是基于官方提供的V3.5.0的函数库。
二、所要实现的功能是:
         1.  开发板能够学习由遥控器发送来的红外码,并在串口上打印出来。
         2.  上位机通过串口程序,发送学习来的码,可控制红外设备。
         3.  发送时共有四路,上位机发送码子时,可选择通道。

三、实现:

         0.  在写功能之前先要对我们所用的模块和时钟进行初始化。
                       (此部分 自己看手册)
         1.  开发板能够学习由遥控器发送来的红外码,并在串口上打印出来。

              红外的学习功能我是利用中断+定时,来记录红外码高低电平的时间长度,程序如下:

/********TIM2本人设置的是技术一次为1us*************/
  1. void EXTI9_5_IRQHandler(void)
  2. {
  3.         if(EXTI_GetITStatus(EXTI_Line7) != RESET)
  4.         {
  5.                 EXTI_ClearITPendingBit(EXTI_Line7);
  6.                 if(num == 0)
  7.                 {
  8.                         TIM_Cmd(TIM2, ENABLE);
  9.                         TIM_SetCounter(TIM2, 0x0000);
  10.                 }
  11.                 else
  12.                 {
  13.                         Ir_data[2*(num-1)] = TIM_GetCounter(TIM2);       
  14.                         Ir_data[2*num-1] = (TIM_GetCounter(TIM2) >> 8);
  15.                         TIM_SetCounter(TIM2, 0x0000);
  16.                 }
  17.                 num++;
  18.         }
  19. }
  20. [code]此部分代码记录了红外高低电平的时长,并保存在数组Ir_data中,在主程序while(1)里可设置相应的标识打印出这些数据。


  21.          2.  上位机通过串口程序,发送学习来的码,可控制红外设备。
  22.          3.  发送时共有四路,上位机发送码子时,可选择通道。
  23.                      二和三的功能我用一个函数实现了,因为,功能三,只需要有相应的标识就行了,函数如下:

  24. /*************TIM2的设置通接受时是一样的******************/

  25. [code]void send_IrDa(void)
  26. {
  27.         unsigned char i;
  28.         uint16_t TIMPeriod;
  29.                
  30.         TIM_Cmd(TIM2, ENABLE);

  31.         for(i = 0; i < LENGTH/2 - 1; i++)
  32.         {
  33.                 TIMPeriod = ((Ir_data[2*i + 1] << 8) | Ir_data[2*i]);
  34.                 if(TIMPeriod == 0)
  35.                         break;
  36.                 TIM_SetAutoreload(TIM2, TIMPeriod);
  37.                 while(TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) == RESET);
  38.                 TIM_ClearFlag(TIM2, TIM_FLAG_Update);

  39.                 switch(Ir_data[LENGTH-1])
  40.                 {
  41.                         case 1:
  42.                                 GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_1) ? GPIO_ResetBits(GPIOB, GPIO_Pin_1) : GPIO_SetBits(GPIOB, GPIO_Pin_1);
  43.                                 break;                
  44.                         case 2:
  45.                                 GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) ? GPIO_ResetBits(GPIOB, GPIO_Pin_12) : GPIO_SetBits(GPIOB, GPIO_Pin_12);
  46.                                 break;                
  47.                         case 4:
  48.                                 GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_13) ? GPIO_ResetBits(GPIOB, GPIO_Pin_13) : GPIO_SetBits(GPIOB, GPIO_Pin_13);         
  49.                                 break;       
  50.                         case 8:
  51.                                 GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_14) ? GPIO_ResetBits(GPIOB, GPIO_Pin_14) : GPIO_SetBits(GPIOB, GPIO_Pin_14);  
  52.                                 break;               
  53.                         default:
  54.                                 printf("\nERROR about channel choose\n");
  55.                                 break;
  56.                 }
  57.         }

  58.         while(TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) == RESET);
  59.         TIM_ClearFlag(TIM2, TIM_FLAG_Update);

  60.         TIM_Cmd(TIM2, DISABLE);
  61.         GPIO_ResetBits(GPIOB, GPIO_Pin_1 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14);
  62. }
想必大家看了代码都知道了,我是利用最后一个字节选择的发送通道,具体是由函数中的switch语句实现的。
把保存在数组中的红外码通过定时器,还原出接受到得红外码子。

附:想必大家都知道红外的发送时需要载波信号的,利用此芯片的PWM功能我也产生了38K的载波信号,代码如下:

  1.         TIM_TimeBaseStructure.TIM_Period = 210;  
  2.         TIM_TimeBaseStructure.TIM_Prescaler = 8;
  3.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  4.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  5.        
  6.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  7.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  8.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  9.         TIM_OCInitStructure.TIM_Pulse = 105;        
  10.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  11.         TIM_OC3Init(TIM3, &TIM_OCInitStructure);
  12.        
  13.         TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

  14.         TIM_ARRPreloadConfig(TIM3, ENABLE);
  15.        
  16.         TIM_Cmd(TIM3, ENABLE);
这部分其实看看芯片手册,就知道了。

这个帖子是我的第一个帖子,也是我进入公司后,做的第一个比较像样的东西,希望大家给给力,多顶顶。
同时,也希望这能为那些刚入门的新手提供点帮助。
 楼主| xiaozhismh 发表于 2011-7-15 15:28 | 显示全部楼层
我的心血啊,怎么都没有人顶啊,太打击人了,刚看见人家贴了几个网站,回帖人都超10个了,自己顶~~~~
247891933hao 发表于 2011-7-15 15:44 | 显示全部楼层
我还不会STM32,但是看出你的思想了。支持一下!
 楼主| xiaozhismh 发表于 2011-7-15 16:08 | 显示全部楼层
3# 247891933hao 含泪说声,感动~~~
无冕之王 发表于 2011-7-15 16:12 | 显示全部楼层
不错,支持楼主
ttlasong 发表于 2011-7-16 10:34 | 显示全部楼层
:victory:
bnyuli 发表于 2011-7-16 14:00 | 显示全部楼层
不错 不错  看起来还是不错的
www_at91_cn 发表于 2011-7-16 14:47 | 显示全部楼层
不错,支持一下
kang78 发表于 2012-8-6 23:52 | 显示全部楼层
wifi 红外学习控制
全部支持手机控制,android,苹果,wp7
http://item.taobao.com/item.htm? ... &id=18242368470

http://item.taobao.com/item.htm? ... &id=15332255102

无线PLC
http://item.taobao.com/item.htm? ... &id=18422568894
小牛卡恩 发表于 2013-7-12 14:19 | 显示全部楼层
好,顶啦。
小牛卡恩 发表于 2013-7-12 14:20 | 显示全部楼层
兄弟,你这代码调通了吗?交流下Q:99554256
dorjones 发表于 2013-9-25 10:46 | 显示全部楼层
顶一下。~以后多交流
素年锦时 发表于 2014-2-25 09:50 | 显示全部楼层
兄弟··这个代码现在做的怎么样了··给一份··
素年锦时 发表于 2014-2-25 09:51 | 显示全部楼层
zhongchuangjie 发表于 2014-4-9 16:06 | 显示全部楼层
是用STM32进行编码和解码吗?
gxbllm 发表于 2015-6-18 12:47 | 显示全部楼层
楼主请教一下,这个记录红外高低电平数组是什么类型?u16,还u8,这个LENGTH是数组的长度吗?TIM3是用来产生38k载波的吗,发送38k载波占空比1/3吗?
xia_318 发表于 2015-6-18 13:48 | 显示全部楼层
不错!顶一下
wind~风 发表于 2015-6-18 13:55 | 显示全部楼层
帮顶一下
suoyibing 发表于 2016-3-14 15:44 | 显示全部楼层
真好,楼楼能给我发一份么,854152803@qq.com
olddog01 发表于 2016-4-22 09:37 | 显示全部楼层
哇塞  太棒了  正在学习 太好了  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

19

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部