利用stm32f407的PA8引脚的复用功能输入捕获功能,将遥控器每个按键所对应的波形记录下来,再通过红外发射头发射出去,进而来控制电器。
由于要对所有遥控器适用,这就要求程序要能够在不知道红外编码方式的前提下学习,所以我决定将遥控器发出来的所有波形都记录下来,用的时候再按这个波形发射就能够实现遥控,中间不需要解码出相应的键值码。
编程学习波形的大致思路:
将遥控器每一个按键所对应的波形学习下来(即储存高低电平的时间 参考nec编码协议部分内容)每一位信息应该对应两个时间,所以要存储200多个时间信息,建立二维数组进行存储,利用输入捕获捕获到下降沿的时候开始计时,并立即设置为上升沿捕获,上升沿时来时读取低电平时间存到数组第一位,立即将计数器清零并设置为下降沿捕获,开始计数,下降沿来时读取计数器的数值存储到素组第二位,依次类推,直到这个键值信息存储完毕,结束判断是根据是不是超过90ms的高电平,结束时最后一位可以不要。
发射学习到的波形:
利用定时器产生38khz的载波频率,将数组里边的数值作为发射时间,奇数位为发射红外引号,偶数位不发射,这样就能产生学习到的波形。具体载波发生器参见32定时器章节。
设计步骤:准确采集红外信息 解码采集到的信息 储存信息并能编码发送
发现问题及解决方案:如果不解码不好存储,(采集到的波形数据太大,尤其是空调的)所以需要转换思路,在不知道编码协议的情况下,根据自己采集到的波形规律自己设计程序解码,再按照自己的解码方式编码发送出去即完成接收和发送,从而达到万能遥控的目的
无论哪种编码方式都会有起始位(大部分是一位起始位,也有的是两位起始位)所以必须要确定好起始位,几乎所有的红外编码格式都是有一个固定的发射红外的时间(比如NEC协议 先发射560us的红外,紧接着再发560us或者1680us来决定是0还是1)所以起始位结束后(接收端)就会有一个560us的低电平(不一定是560us,但是不会超过800us)这样就能把起始位提取出来,等需要的时候再发射出去,而且同一个公司的遥控器用的起始位大体相同,但是为了保险起见一个遥控器的起始位单独存起来,换遥控器就采集新的起始位。
解码思路:从第三位有效数据开始判断是不是小于1000us若是则将前两位保存起来作为起始信号,第三位作为发射红外的时间,紧接着再往下判断是不是大于1000us,若是则提取出来作为延时时间,例如nec协议 9000 4500(起始位) 560(发射时间) 560(延时时间0) 560(发射时间) 1680(延时时间1) 不同的编码协议不一定就是这个数据所以要能够自适应
关键字:STM32F407 万能红外遥控器
引用地址:
基于STM32F407的万能红外遥控器
推荐阅读最新更新时间:2024-03-16 16:26
STM32F407的UDP发送数据
探究WaveShare的F407的板子好几天了,这两天一直止步于网卡模块的udp发包,因为截包工具总是收不到我代码里面发出去的数据包,我的要求是只发特定数据,不管收到的数据包 记录下整个测试过程,以便以后翻阅 使用开发板自带的例程,udp_echo_server的例子,在此基础上修改,main函数是 int main(void) { /*! At this stage the microcontroller clock setting is already configured to 168 MHz, this is done through SystemInit() function which
[单片机]
STM32F407 单通道ADC采样,DMA传输
最近在研究STM32F4的ADC采样功能,中间遇到了一些问题,写下来以备后用。 F4和F1有很多库函数是不一样的,在参照F1的教程的时候,不能直接抄他的实验代码,否则会出错。 因为要用DMA将ADC转换得到的值快速传递到SRAM中,所以就需要对ADC相关的DMA进行设置,这一步很重要。在写ADC1的DMA初始化函数前,一定要查Reference Manual的DMA request mapping,搞清楚是某一个具体的peripheral对应的是DMA1还是DMA2,用到的是哪一个stream和channel。例如这次实验要用到的外设ADC1,可以查到,ADC1归DMA2 Stream0或者Stream4的Channel0管理,不
[单片机]
STM32F407上移植emwin
环境: 主机:WIN8 开发环境:MDK5.13 emwin版本:STemWinLibrary522 mcu: stm32f407VGT6 开发板:安富莱STM32-X3 TFT型号:艾蓝2.8寸TFT,主控芯片:ILI9325 说明: 在STM32F407上移植emwin,驱动屏幕接口为FSMC 移植步骤: 1.MDK新建文件结构: 2.GUIConf.c文件修改 a)增加宏定义: #define GUI_NUMBYTES (1024 * 80) #define GUI_BLOCKSIZE 0x80 b)GUI_X_Config(void)函数中增加语句
[单片机]
STM32F407 外扩SRAM
字节控制功能。支持高/低字节控制。 看看实现 IS62WV51216 的访问,需要对 FSMC进行哪些配置。 这里就做一个概括性的讲解。步骤如下: 1)使能 FSMC 时钟,并配置 FSMC 相关的 IO 及其时钟使能。 要使用 FSMC,当然首先得开启其时钟。然后需要把 FSMC_D0~15,FSMCA0~18 等相关IO 口,全部配置为复用输出,并使能各 IO 组的时钟。 使能 FSMC 时钟的方法: RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE); 对于其他 IO 口设置的方法前面讲解很详细,这里不做过多的讲解。 2)设置 FSMC BANK1 区域 3。
[单片机]
stm32f207/stm32f407擦除内部flash讲解
STM32F4Discovery开发包使用的STM32F407VGT6芯片,内部FLASH有1M之多。平时写的代码,烧写完之后还有大量的剩余。有效利用这剩余的FLASH能存储不少数据。因此研究了一下STM32F4读写内部FLASH的一些操作。 【STM32F4 内部Flash的一些信息】 STM32F407VG的内部FLASH的地址是:0x08000000,大小是0x00100000。 写FLASH的时候,如果发现写入地址的FLASH没有被擦除,数据将不会写入。FLASH的擦除操作,只能按Sector进行。不能单独擦除一个地址上的数据。因此在写数据之前需要将地址所在Sector的所有数据擦除。 在STM32F4的编程手册上可找到F
[单片机]
stm32F407-RDA5820N模块的使用
RDA5820N是一款广播FM接受或发射模块,支持50M~115M频段FM和RDS/RBDS接收和发射,支持电源范围为1.8-5.5V。更多详细介绍请看数据手册。 RDA5820N模块是在做2018年电赛无线话筒扩音系统时使用的发射模块,接收模块用的使TEA5767,当然RDA5820N也是可以的,但是当时考虑到价格,所以用了TEA5767,本篇文章主要分享RDA5820N的.c和.h文件。 rda5820.h #ifndef __RDA5820_H #define __RDA5820_H #include sys.h #include myiic.h #define RDA5820_R00 0X0
[单片机]
STM32F407 RTC 配置理解与总结
RTC: Real time clock 相比较而言,STM32F407的RTC比STM32F1的更加容易配置。当然,F4的资源相对也就更加丰富很多了。具体的资源可查看官方参考手册,通过下面的图表也可以了解其大致功能 1、开始的时候对于 ALRAM A/B的功能没有怎么理解,后面再来看时发现其很简单,举个简单的例子,就比如,定的闹钟,当然,这个也是可以实现闹钟的功能。只是通过这个简单的例子来说明,ALARM A/B的用途或者功能吧 2、自动唤醒与时间戳及时间篡改事件,与1的差不多,细细体会就知道 3、RTC_AFO 与 RTC_AFI 就是对外输出及检测外部时间事件 4、 RTC
[单片机]
stm32f407之认识硬件
单片机型号:STM32F407VGT6 本文档介绍STM32F407VGT6型号的具体解释,如下图所示。 具体解释:STM32,gerneral purpose,以太网接口,100引脚,1024K Flash空间,LQFP封装,-40到85摄氏度。
[单片机]