STM32--HAL库,红外发送
前言
通常使用红外接收模块来接收遥控器发送来的数据,可不可以按照一定的协议来发送数据,从而库用控制一些常用的设备.
一. NEC协议
上一篇文章介绍过该协议,但我感觉不是很全面,在此再对其发送进行一定说明.
NEC协议是一种常见的红外遥控编码协议,被广泛应用于很多消费电子产品的遥控器中,比如电视、音响等。
NEC协议的工作原理如下:
-
载波频率:NEC协议使用的载波频率为 38kHz。
-
编码格式:NEC协议将每个按键的编码分成 4 个部分:引导脉冲、地址码、地址码的反码、命令码、命令码的反码。
-
引导脉冲:引导脉冲是一个9ms的高电平脉冲,用于提示接收器开始接收数据。
-
地址码和命令码:每个按键都有特定的地址码和命令码,用于识别按下的是哪个按键。每个码的高位先传输。地址码和地址码的反码用于识别遥控器发送的正确性,而命令码和命令码的反码用于执行相应的操作。
-
重复码:NEC协议还定义了一个重复码,当用户长按遥控器上的某个按键时,遥控器会发送该按键的重复码,以避免连续发送相同的命令。
二. 思路简介
由红外接收,看到了接收到的波,那么发送,就要发送某一个波,让其接收模块接收,并解析出同遥控器按键一样的波(上一篇文章中示波器显示的).
根据NEC协议,要发送波,波的频率就得在38KHZ,并把数据搭载到该波上,再由接收模块进行接收.
三. CUBEMX配置
定时器2来产生,38KHZ的载波,且占空比为50%.
定时器1来控制数据(通过定时来改变占空比)
四. HAL库代码
1 送单个位的红外信号
// 发送单个位的红外信号,根据位的值选择发送的持续时间
void IR_LED_SendBit(uint8_t bit)
{
if (bit) {
// 发送逻辑1,持续1.68ms
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,947);
HAL_Delay_us (560);
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,0);
HAL_Delay_us(1680);
} else {
// 发送逻辑0,持续0.56ms
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,947);
HAL_Delay_us (560);
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,0);
HAL_Delay_us(560);
}
}
2 发送NEC红外信号
// 发送NEC红外信号,根据用户码和按键码生成红外数据
void IR_LED_SendNEC(uint8_t user, uint8_t key)
{
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,947);//设置定时器的占空比,最大为1895
HAL_Delay_us (9000);
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,0);
HAL_Delay_us(4500);
// 将用户码和按键码组合成一个32位的数据
uint32_t data = ((~key & 0xFF) << 24) | ((key & 0xFF) << 16) | ((~user & 0xFF) << 8) | (user & 0xFF);
uint8_t i;
// 发送32位数据
for (i = 0; i <= 32; i++) {
// 根据数据的当前位判断发送1还是0
IR_LED_SendBit(data & 0x01);
// 将数据右移一位,处理下一位
data >>= 1;
}
}
3 main函数
IR_LED_SendNEC(0X00, 0x1C);
HAL_Delay (200);
4 定时器微妙级延时
#define DLY_TIM_Handle (&htim1)//定时器延时微妙级函数
void HAL_Delay_us(uint16_t nus)
{
__HAL_TIM_SET_COUNTER(DLY_TIM_Handle, 0);
__HAL_TIM_ENABLE(DLY_TIM_Handle);
while (__HAL_TIM_GET_COUNTER(DLY_TIM_Handle) < nus)
{
}
__HAL_TIM_DISABLE(DLY_TIM_Handle);
}
5 提示(说明)
由于发送的代码时低位在前,而接收时反过来接收的,因为懒得改代码,所以就将按键的值(二进制值)始末颠倒了,下图时将按键值颠倒了后对应的十六进制值,根据实际情况进行修改,嫌麻烦的可以改代码.
/************************************************
**# 键值 #十六进制
1 45
2 46
3 47
4 44
5 40
6 43
7 7
8 15
9 9
0 19
* 16
# D
up 18
down 52
right 5A
left 8
ok 1C
************************************************/
五. 结果
输出波的大概模样
前面大红方波的展开波
下图是查看波的频率