【STM32--HAL库 红外发送】

前言

通常使用红外接收模块来接收遥控器发送来的数据,可不可以按照一定的协议来发送数据,从而库用控制一些常用的设备.

一. NEC协议

上一篇文章介绍过该协议,但我感觉不是很全面,在此再对其发送进行一定说明.
NEC协议是一种常见的红外遥控编码协议,被广泛应用于很多消费电子产品的遥控器中,比如电视、音响等。

NEC协议的工作原理如下:

  1. 载波频率:NEC协议使用的载波频率为 38kHz。

  2. 编码格式:NEC协议将每个按键的编码分成 4 个部分:引导脉冲、地址码、地址码的反码、命令码、命令码的反码。

  3. 引导脉冲:引导脉冲是一个9ms的高电平脉冲,用于提示接收器开始接收数据。

  4. 地址码和命令码:每个按键都有特定的地址码和命令码,用于识别按下的是哪个按键。每个码的高位先传输。地址码和地址码的反码用于识别遥控器发送的正确性,而命令码和命令码的反码用于执行相应的操作。

  5. 重复码: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
************************************************/

五. 结果

输出波的大概模样
在这里插入图片描述
前面大红方波的展开波

在这里插入图片描述
下图是查看波的频率
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值