热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

STM32多通道红外信号传输优化方案

任务:采用NEC协议,实现4路红外的38KHz载波编码发送单片机:STM32F103ZET61、NEC协议简介​利用红外传输信息,编码协议有很多,我采用了常用的NEC协议进

任务:采用NEC协议,实现4路红外的38KHz载波编码发送

单片机:STM32F103ZET6


1、NEC协议简介

​ 利用红外传输信息,编码协议有很多,我采用了常用的NEC协议进行编码。

​ NEC协议构成包括引导码、地址码、地址反码、控制码、控制反码。其采用PWM脉冲位置调制,以发射红外载波的占空比代表“0”和“1”。

​ NEC码的位定义:一个脉冲对应560us的连续载波,一个逻辑1传输需要2.25ms(560us脉冲+1680us低电平),一个逻辑0的传输需要1.125ms(560us脉冲+560us低电平)。一体化红外接收头HS0038B在收到脉冲时为低电平,没有脉冲时为高电平。这样的话,在接收头端收到的信号是:逻辑1对应560us低+1680us高,逻辑0对应560us低+560us高。

​ NEC同步码由9ms高电平和4.5ms低电平组成。另外,如果一直按住按键,遥控器会发送重复码(9ms高电平+2.5m低电平+0.56ms高电平+97.94ms低电平)。
在这里插入图片描述


2、载波实现及TIM配置

TIM_HandleTypeDef TIM3_Handler; //定时器句柄
TIM_OC_InitTypeDef TIM3_CH2Handler; //定时器3通道2句柄//TIM3 PWM部分初始化
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
void TIM3_PWM_Init(u16 arr,u16 psc)
{ TIM3_Handler.Instance=TIM3; //定时器3TIM3_Handler.Init.Prescaler=psc; //定时器分频TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式TIM3_Handler.Init.Period=arr; //自动重装载值TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;HAL_TIM_PWM_Init(&TIM3_Handler); //初始化PWMTIM3_CH2Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1TIM3_CH2Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比TIM3_CH2Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //输出比较极性为高HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH2Handler,TIM_CHANNEL_1);//配置TIM3通道1HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH2Handler,TIM_CHANNEL_2);//配置TIM3通道2HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH2Handler,TIM_CHANNEL_3);//配置TIM3通道3HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH2Handler,TIM_CHANNEL_4);//配置TIM3通道4HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_1);//开启PWM通道1HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_2);//开启PWM通道2HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_3);//开启PWM通道3HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_4);//开启PWM通道4}//定时器底层驱动,时钟使能,引脚配置
//此函数会被HAL_TIM_PWM_Init()调用
//htim:定时器句柄
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{GPIO_InitTypeDef GPIO_Initure;if(htim->Instance==TIM3){__HAL_RCC_TIM3_CLK_ENABLE(); //使能定时器3__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟__HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟GPIO_Initure.Pin=GPIO_PIN_6 | GPIO_PIN_7;//PA6,PA7GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速HAL_GPIO_Init(GPIOA,&GPIO_Initure); GPIO_Initure.Pin=GPIO_PIN_0 | GPIO_PIN_1;//PB0, PB1HAL_GPIO_Init(GPIOB,&GPIO_Initure); }
}//设置TIM3通道1~4的占空比
//compare:比较值
void TIM_SetTIM3Compare(u32 compare, u8 CH)
{if(CH == 1) TIM3->CCR1=compare; else if(CH == 2) TIM3->CCR2=compare; else if(CH == 3) TIM3->CCR3=compare; else if(CH == 4) TIM3->CCR4=compare;
}

3、编码发送

void IRSend(u8 num, u8 CH){u8 addr = REMOTE_ID;/* 发送引导码 */NEC_Start(CH);/* 发送地址码 */NEC_Send_Byte(addr, CH);/* 发送地址反码 */NEC_Send_Byte(~addr, CH);/* 发送控制码 */NEC_Send_Byte(num, CH);/* 发送控制反码 */NEC_Send_Byte(~num, CH);Logical_0(CH);//停止位,如果没有这个的话,上面发的最后一位的时长检测会出问题;//理论上给个电平跳变就行,不一定发逻辑0。跳变完恢复为空闲状态
}void NEC_Start(u8 CH){TIM_SetTIM3Compare(947, CH);delay_us(9000);TIM_SetTIM3Compare(0, CH);delay_us(4500);}void NEC_Send_Byte(u8 value, u8 CH){u8 i;for(i = 0; i <8; i++){if(value & 0x80){Logical_1(CH);}else {Logical_0(CH);}value <<= 1;}
}void Logical_0(u8 CH){TIM_SetTIM3Compare(947, CH);delay_us(560);TIM_SetTIM3Compare(0, CH);delay_us(560);
}void Logical_1(u8 CH){TIM_SetTIM3Compare(947, CH);delay_us(560);TIM_SetTIM3Compare(0, CH);delay_us(1680);
}

推荐阅读
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细探讨了在Android 8.0设备上使用ChinaCock的TCCBarcodeScanner进行扫码时出现的应用闪退问题,并提供了解决方案。通过调整配置文件,可以有效避免这一问题。 ... [详细]
  • andr ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • 配置多VLAN环境下的透明SQUID代理
    本文介绍如何在包含多个VLAN的网络环境中配置SQUID作为透明网关。网络拓扑包括Cisco 3750交换机、PANABIT防火墙和SQUID服务器,所有设备均部署在ESXi虚拟化平台上。 ... [详细]
  • 本文介绍如何在华为CE交换机上配置M-LAG(多链路聚合组),以实现CE1和CE2设备作为VLAN 10网关的高可用性。通过详细的配置步骤,确保网络冗余和稳定性。 ... [详细]
author-avatar
null
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有