基于STM32HAL库模拟美的空调遥控器(R05D协议)
本文介绍了美的空调红外协议的原理及其实现过程,包括协议手册的理解、时序验证、硬件电路。通过分析遥控器波形,确定了高位先发的编码规则,并提供了相应的代码实现,包括载波38kHz的生成和0、1数据位的发送方法。最终实现对空调温度、模式、风速的设置。
前言
美的空调采用R05D红外协议,因此用一般红外编码发射模块无法直接对空调进行控制,本文通过获取R05D协议手册并且使用用红外接收管对原有遥控器红外接收进行波形分析。
一、R05D红外协议手册
R05D电控功能说明书:https://wenku.baidu.com/view/c46594141ed9ad51f01df2c3.html
二、编码格式
1.对于一般情况(无定时设定、无经济运行设定、无摇摆设定)。
编码格式:(不管是开机还是从其它模式转入或改变温度、风速时均发送相同的、包含所有设定信息的代码)
L,A,A’,B,B’,C,C’, S, L,A,A’,B,B’,C,C’
1.1 第一帧和第二帧相同
1.2 采用MSB在先,LSB在后;也就是高位先发(重点:手册没讲,是通过接收管波形分析出来的!!!!下一部分时序分析有说明)
1.3 L为引导码;S为分隔码;A为识别码(A=10110010=0xB2,预留方案时A=10110111=0xB7),A’为A的反码;B’为B的反码;C’为C的反码。
1.4 B,C所代表的含义如下


2.波形规范:(接收端输出波形)
2.1 引导码:L
2.2 两帧之间分隔符:S
2.3 数据“0”
2.4 数据“ 1”
2.5 一次发码的终止符:
2.6 发射波形
3.实际波形
使用逻辑分析仪测量红外接收器接收到的遥控器信号
由上图可知:
A:10110010 (0XB2) 设备识别码
B:00111111 (0X3F) 高风
C:10010000 (0X90) 设定温度27℃,制冷模式
三、功能实现
1.器材
本项目采用STM32F103C8T6作为主控
使用940nm红外发射器
2.电路连接
STM32需要选择具有PWM输出功能的引脚,本项目使用了PB11引脚,使用TIM2_CH4产生38kHz方波作为载波,连接至三极管的基极,控制发射器的通断。
3.代码实现
使用STM32CUBEMX进行配置,将定时器2通道4配置为38kHz的PWM输出,72000k/5/378=38.09≈38k。
将定时器4配置为72分频,用于获取us延时函数。
//us延时函数
void user_delaynus_tim(uint32_t nus)
{
uint16_t differ = 0xffff-nus-5;
//设置定时器4的技术初始值
__HAL_TIM_SetCounter(&htim4,differ);
//开启定时器
HAL_TIM_Base_Start(&htim4);
while( differ<0xffff-5)
{
differ = __HAL_TIM_GetCounter(&htim4);
};
//关闭定时器
HAL_TIM_Base_Stop(&htim4);
}
void Normal_Code(uint8_t A, uint8_t B, uint8_t 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();
}
void Lead_Code()
{
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, 189);
user_delaynus_tim(4400);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, 0);
user_delaynus_tim(4400);
}
void Stop_Code()
{
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, 189);
user_delaynus_tim(540);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, 0);
user_delaynus_tim(5220);
}
void Send_0_Code()
{
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, 189);
user_delaynus_tim(540);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, 0);
user_delaynus_tim(540);
}
void Send_1_Code()
{
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, 189);
user_delaynus_tim(540);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, 0);
user_delaynus_tim(1620);
}
void Send_Byte(uint8_t data)
{
int i;
for(i=7;i>=0;i--)
{
if(data & (1<<i))
{
Send_1_Code();
}
else
{
Send_0_Code();
}
}
}
4.函数调用
void main()
{
Normal_Code(0xB2, 0x9F, 0x00); //制冷 低风 17
}
更多推荐



所有评论(0)