完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、设计思路
通常红外遥控采用NEC传输协议,而美的空调采用的是R05D红外协议(应该是自己设计的协议),因此用一般红外编码发射模块无法直接对空调进行控制。 解决方法:获取R05D协议手册 + 用红外接收管对原有遥控器红外接收进行波形分析。 一、R05D红外协议原理 1.协议手册理解 总的来说,编码与时序都跟NEC不一样。 下面1–5点为编码讲解;6–10点为时序讲解
L 10110010 01001101 10111111 01000000 00010000 11101111 S L ...(省略) L 0xB2 0x4D 0xBF 0x40 0x10 0xEF S L 0xB2 0x4D 0xBF 0x40 0x10 0xEF
很明显,编码与时序都跟NEC不一样,注定通过控制GPIO时序来发送R05D协议的编码2.验证时序(重点) 通过示波器分析遥控器发送的红外编码 L引导码后 接收到A=10110010=0xB2 A‘=01001101=0xB7 因此,证实了上面一部分第3点。高位先发,低位后发!!这跟NEC不一样(NEC采用低位先发送),所以普通红外编码发射模块根本不适用!!二、硬件实现 1.需要的材料
由于买的发射模块自带编码,不用NEC编码只能改电路(这里推荐直接买红外发射模块就好了,不带任何编码的那种) 根据原理图,把IRT引出来跟STM32的IO口相接 实物图如下: 直接焊接一条杜邦线,跟STM32相连接 这时候,只需要控制STM32GPIO的输出,就可以控制红外发射的波形,而不需要用到编码芯片了3.STM32 GPIO选择 本人用的是蓝桥杯嵌入式的开发板(stm32f103rbt6),至于其他芯片也几乎大同小异。这里选择使用PA1,属于定时器2通道2 通过搞懂协议原理和修改电路并进行连接后,只需要写出对的时序控制代码就能控制空调了!!三、代码实现 1.载波38kHZ实现 由于TIM2的输入时钟为72MHZ,通过分频和自动重装载值的设定,得出PWM的频率为72Mhz / 5(预分频) / 378(计数次数) ≈ 38Khz void TIM_PWM_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* TIM2 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* PA1引脚设置 */ TIM_TimeBaseStructure.TIM_Period = 378; //72 000khz/378/5 = 38.09khz TIM_TimeBaseStructure.TIM_Prescaler = 5-1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //TIM2预分频设置:72kHZ。APB1分频系数2,输入到TIM3时钟为36MHzx2 = 72MHz /* Channel 2 Configuration in PWM mode */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择PWM模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能 // TIM_OCInitStructure.TIM_Pulse=500;//设置占空比时间 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM2, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能预装载寄存器 //使能TIM2定时计数器 TIM_Cmd(TIM2, ENABLE); } 2.R05D时序实现 通过改变比较计数器,来输出高电平和低电平 void Lead_Code() { TIM_SetCompare2(TIM2,189); //接收器拉低 delay_us(4400); TIM_SetCompare2(TIM2,0); //接收器拉高 delay_us(4400); } void Stop_Code() { TIM_SetCompare2(TIM2,189); //接收器拉低 delay_us(540); TIM_SetCompare2(TIM2,0); //接收器拉高 delay_us(5220); } void Send_0_Code() { TIM_SetCompare2(TIM2,189); //接收器拉低 delay_us(540); TIM_SetCompare2(TIM2,0); //接收器拉高 delay_us(540); } void Send_1_Code() { TIM_SetCompare2(TIM2,189); //接收器拉低 delay_us(540); TIM_SetCompare2(TIM2,0); //接收器拉高 delay_us(1620); } void Send_Byte(u8 data) { int i; for(i=7;i>=0;i--) { if(data & (1< { Send_1_Code(); } else { Send_0_Code(); } } } void Normal_Code(u8 A, u8 B, u8 C) { Lead_Code(); Send_Byte(A); Send_Byte(~A); Send_Byte(B); Send_Byte(~B); Send_Byte(C); Send_Byte(~C); Stop_Code(); Lead_Code(); Send_Byte(A); Send_Byte(~A); Send_Byte(B); Send_Byte(~B); Send_Byte(C); Send_Byte(~C); Stop_Code(); } 3.调用函数并验证 void main() { 初始化函数(); Normal_Code(0xB2, 0x9F, 0x00); //制冷 低风 17 } 至于调控温度,模式,自行根据协议修改发送数值就OK了! |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9057 浏览 16 评论
4086 浏览 18 评论
1176浏览 3评论
604浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
597浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2334浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1895浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 17:03 , Processed in 1.436481 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号