2.1 38KHz载波产生

常用的38KHz载波的产生方法有455KHz晶振分频法、时基电路搭建法、微控制器PWM模块产生法。为减少硬件规模、缩减成本,故由STM32的定时器输出PWM波,得到占空比1:3的红外载波。

STM32 的定时器分为高级定时器(TIMER1、TIMER2)、基本定时器(TIMER6、TIMER7) 和通用定时器(TIMER2~ TIMER5),具有非常强大的功能。其中通用定时器可以用于输入捕获、输出比较和PWM等,通过定时器的预分频器和RCC时钟控制预分频器,脉冲长度和 波形周期能够在几个微秒到毫秒间进行调整。此外,每个通用定时器都是完全独立,不曾共享任何资源。

本模块使用定时器TIM2的通道CH1输出占空比1:3的载波信号。操作流程图如下图所示:

程序代码如下:

/********************************************************************
* Function Name  : TIM2_PWM_Init(u16 arr,u16 psc)
* Function       : TIM2的通道CH1的PWM模式初始化
* parameter      : arr - 自动重装值psc - 时钟预分频数
* Description    : 频率f = 72M/[(psc+1)*(arr+1)]
* Return         : void
*********************************************************************/
void TIM2_PWM_Init(u16 arr,u16 psc)
{/* 初始化结构体定义 */GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef       TIM_OCInitStructure;/* 使能相应端口的时钟 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);    //使能定时器2时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //使能GPIO外设时钟/* GPIOA.0初始化 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                               // TIM2 CH1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 // PA.0 复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_0);/* TIM2 初始化*/TIM_TimeBaseInitStructure.TIM_Period = arr;                             //下一个更新事件装入活动的自动重装载寄存器周期的值TIM_TimeBaseInitStructure.TIM_Prescaler = psc;                  //作为TIMx时钟频率除数的预分频值 TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;                //时钟分割:TDTS = Tck_timTIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);/* 定时器TIM2 Ch1 PWM模式初始化 */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;               //选择定时器模式:TIM PWM1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   //比较输出使能//TIM_OCInitStructure.TIM_Pulse = (arr+1)/2;                    //占空比 50%TIM_OCInitStructure.TIM_Pulse = (arr+1)/3;                              //占空比1:3TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性:TIM输出比较极性高TIM_OC1Init(TIM2, &TIM_OCInitStructure);/* 使能TIM2在CCR1上的预装载寄存器 */TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); /* 使能定时器 */TIM_Cmd(TIM2, ENABLE);
}

示波器(RIGOL DG1102E)查看38KHz载波信号的波形,如下图所示:

2.2 按键设计

设置STM32的GPIO口为输入模式,通过读取IO口状态,判断是否有按键按下。为避免干扰产生一些误操作,在检测到电平变化后延时一段时间,再重新读取IO口状态。

本模块设置了5个独立按键的接口,实现流程图如下图所示:

程序代码如下:

/********************************************************************
* Function Name  : KEY_Init(void)
* Function       : 按键端口初始化
* parameter      : void
* Description    : void
* Return         : void
*********************************************************************/
void KEY_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   // Enable PORTA clock/* 初始化KEY1-->KEY5 上拉输入 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6 |GPIO_Pin_7;   // Config portGPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;                // Input pull-upGPIO_Init(GPIOA, &GPIO_InitStructure);                                      // Init GPIOA3~7
}/********************************************************************
* Function Name  : KEY_Scan(u8 mode)
* Function       : 按键扫描
* parameter      : mode - 0,不支持连续按;1,支持连续按
* Return         : 0 - 没有任何按键按下1 - KEY0按下2 - KEY1按下
*********************************************************************/
u8 KEY_Scan(u8 mode)
{        static u8 key_up = 1;if(mode)  key_up=1;  if(key_up&&(KEY1==0||KEY2==0|KEY3==0|KEY4==0|KEY5==0)){  // key downdelay_ms(10);   // eliminate debouncingkey_up = 0;if(KEY1==0)      return VOL_UP;else if(KEY2==0) return VOL_DOWN;else if(KEY3==0) return CH_UP;else if(KEY4==0) return CH_DOWN;else if(KEY5==0) return PWR_ON;}else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1&&KEY5==1){key_up = 1;     }return 0;// 无按键按下
}

2.3 STM32接收红外信号并测其脉宽

向量中断控制器(NVIC)与Cortex-M3内核的逻辑紧密耦合、相互交融,共同完成对中断的控制。

STM32有两个优先级概念—抢占式优先级和响应优先级,响应优先级又被称为亚优先级或副优先级,STM32的每个中断源都需要指定这两种优先级。

高抢占式优 先级的中断可以在具有低抢占式优先级的中断处理中被响应,即所谓的中断嵌套。当两个中断源的抢占式优先级相同时,两者间就没有嵌套关系,后到来的中断就需 要等待前一个中断处理完后才能被响应;若两个中断同时到达,中断控制器会根据它们响应优先级的高低决定优先处理哪一个;若两个中断的抢占式优先级和响应优 先级都相同,则根据它们在中断表中的排列顺序决定两者的处理先后。

每个中断源都需要指定抢占式优先级和响应优先级,这就需要相应的寄存器记录每个中断的优先级。Cortex-M3中定义8比特来设置中断优先级,故有8中分配方式,优先级分组如下:

1)所有8位都用来指定响应优先级;

2)最高1位指定抢占式优先级,最低7位指定响应优先级;

3)最高2位指定抢占式优先级,最低6位指定响应优先级;

4)最高3位指定抢占式优先级,最低5位指定响应优先级;

5)最高4位指定抢占式优先级,最低4位指定响应优先级;

6)最高5位指定抢占式优先级,最低3位指定响应优先级;

7)最高6位指定抢占式优先级,最低2位指定响应优先级;

8)最高7位指定抢占式优先级,最低1位指定响应优先级;

在STM32中指定中断优先级的寄存器减少到4位,可以通过固件库函数

NVIC_PriorityGroupConfig()进行选择,该函数的参数有5个,如下:

1)NVIC_PriorityGroup_0: 选择第0组;

2)NVIC_PriorityGroup_1: 选择第1组;

3)NVIC_PriorityGroup_2: 选择第2组;

4)NVIC_PriorityGroup_3: 选择第3组;

5)NVIC_PriorityGroup_4: 选择第4组。

EXTI,即外部中断/事件控制器,由19个产生事件/中断要求的边沿检测器组成,每个输入线可以被独立的配置为脉冲或挂起和对应的触发事件(上升沿、下降沿、双边沿),每个输入线都能够被独立的屏蔽掉。EXTI控制器主要特点如下:

1)支持多达19个中断/事请求

2)每个中断/事件都有独立的触发和屏蔽;

3)每个中断线都有专用的状态位;

STM32外部中断实现红外脉宽测量的原理为:检测到红外脉冲下降沿后,进入中断处理函数,然后分别对红外信号的高和低电平进行测量,并把测量的结果的暂存到一个临时数组中。软件流程图如下图所示:

在硬件仿真下点全速运行的按钮,然后用红外设备对着红外一体接收管按下按键,在Watch1窗口查看数组中数据是否在协议规定范围内。然后把该数据调制后发送给接收设备,看它和原始红外设备发送码数据是否一致。接收到的脉宽数据如下图所示:

学习型通用红外遥控设备(二)相关推荐

  1. 基于STM32的学习型通用红外遥控设备的设计实现(一)

    1.1处理器 处理器为STM32,代码在其两个系列的CPU上调试通过,为STM32F103ZET和STM32F103VBT. 软件平台:Keil uVision4;电路设计:Altium Design ...

  2. 学习型通用红外遥控设备(三)

    3.1 红外脉宽存储及FLASH的读写 根据STM32型号的不同,FLASH容量由16K到1024K不等. FLASH模块主要由三部分组成:主存储器.信息块.闪存存储器接口寄存器.模块组织见<S ...

  3. 学习型通用红外遥控设备(四)

    四.硬件电路: 说些闲话. 如果有其他单片机的基础,STM32上手还是挺快的,一周左右应该可以.红外遥控器 的制作,算是熟悉STM32之后的练手.就市场来看,STM32的应用还是挺广泛的.之前在成都实 ...

  4. 学习型红外遥控器设计(1) 绪论

    学习型红外遥控器设计(0) 摘要   (1) 绪论  (2) 方案设计   (3) 遥控解码   (4) 编码还原  (5) 硬件实现   (6) 总结展望 1.1  选题的目的意义 上世纪八十年代初 ...

  5. 学习型红外遥控器设计(5) 万能学习型红外遥控器实现

    学习型红外遥控器设计(0) 摘要   (1) 绪论  (2) 方案设计   (3) 遥控解码   (4) 编码还原  (5) 硬件实现   (6) 总结展望 如方案设计所述,制作万能学习型红外遥控器, ...

  6. 学习型红外遥控器设计(4) 红外遥控编码还原

    学习型红外遥控器设计(0) 摘要   (1) 绪论  (2) 方案设计   (3) 遥控解码   (4) 编码还原  (5) 硬件实现   (6) 总结展望 如方案设计所述,制作红外编码发射装置,该装 ...

  7. 学习型红外遥控器硬件结构说明

    本篇文章上接:智能家居中红外遥控芯片分析比较 2 硬件结构  学习型红外遥控器由红外一体化接收电路. 反相器.温度传感器.AT89C52单片机.红外发送电路.E PROM存储器.键盘及 LCD显示器和 ...

  8. 学习型红外遥控器设计(3) 红外遥控解码学习

    学习型红外遥控器设计(0) 摘要   (1) 绪论  (2) 方案设计   (3) 遥控解码   (4) 编码还原  (5) 硬件实现   (6) 总结展望 如方案设计所述,制作红外接收解码装置,该装 ...

  9. 【原创分享】学习型多功能红外遥控器实现(续)--- 09.06

    前几天我还探讨了这个学习型遥控器的实现问题,今天发这篇文章,仅是针对我上次说到的方法的一个实现. 上次说的方法 目前已经实现 感觉方法还是不错的 这里我拿出来分享下 希望对想做这个的朋友一点点的帮助. ...

最新文章

  1. Machine Learning | (8) Scikit-learn的分类器算法-随机森林(Random Forest)
  2. apache2.2 虚拟主机配置
  3. php调用shell执行scp,Shell中使用scp命令实现文件上传代码
  4. 【arduino】arduino代码运行时间测试函数,代码性能运行时间测试方法
  5. 这样写交互说明,开发不会约你去爬山~
  6. js调用WebService(复杂对象传入)[原创]
  7. js 获得明天0点时间戳_js实现一个简单钟表动画(javascript+html5 canvas)
  8. 华为联发科可以升级鸿蒙吗,华为鸿蒙系统降临!首批升级手机确定,联发科芯片被放弃?...
  9. boost::filesystem使用手册
  10. 堆积如山的Java面试简历,如何脱颖而出?写简历前你先要做这些
  11. Gitlab-IDEA使用教程
  12. Django新手入门(三)——使用PyCharm创建Django项目
  13. [A3C]:算法原理详解
  14. 根据CTP接口计算现手、增仓、开平、对手盘 (2)
  15. 古代五大美男的悲惨结局:潘安被灭三族
  16. 【Linux】MBR磁盘分区表只能有四个分区?
  17. 智能门锁触控中应用的电容式触摸芯片
  18. PHP时间戳和日期互转换
  19. 厦门之旅第一篇Gradle多渠道打包(动态设定App名称,应用图标,背景图片,状态栏颜色)
  20. 不懂就问,机器人做核酸是一种什么体验?|一周AI新闻

热门文章

  1. 集成电路中的ESD防护,一篇入门
  2. banner.txt的图案
  3. Golang 控制台百行代码贪吃蛇小游戏
  4. Codeblocks编译多个源文件
  5. 鸿蒙系统和三星系统,三星ONE UI对比鸿蒙系统反应速度:都曾不被看好,如今都很快!...
  6. Ubuntu中修改grub重启出现 Memtest86 解决方法
  7. 功能强大的离线浏览器(2)
  8. 威联通NAS搭建jellyfin影音库:docker环境一行脚本部署(支持硬件解码、海报刮削)
  9. 社区疫情防控平台需求工程--软件需求规格说明
  10. 蓝桥ROS机器人之绚丽贪吃蛇