STM32上的红外遥控器



你好

使用stm32微控制器从各种家用遥控器读取,解码和随后发送红外信号的库的说明。 基于用于arduino的IRremote ,并适用于stm32。

该库使用一个计时器来接收和发送信号。 接收器连接到任何引脚(GPIO_Input),发送器连接到以PWM生成(PWM)模式工作的定时器的一个通道。 在该示例中,使用了定时器4的第一个通道-PB6(发送器)和PB5引脚(接收器)。

为了接收信号,定时器在中断模式下工作-每隔50μs就会检查输入引脚的状态,并且在发送期间它将切换到PWM生成模式,发送信号,然后切换回中断模式。

设置在文件IRremote.h中

extern TIM_HandleTypeDef htim4; //     -   50  (     72) #define MYPRESCALER 71 //   1 #define MYPERIOD 49 // 50  //     -     #define MYSYSCLOCK 72000000 //     recive_IR #define RECIV_PIN (HAL_GPIO_ReadPin(recive_IR_GPIO_Port, recive_IR_Pin)) 

如果要配置另一个计时器,则需要指定相应的结构名称-htim4,并在IRremote.和irSend.文件中执行相同的操作。 我懒得定义所有这种经济。 在古巴选择其他计时器时,您只需要指定通道和内部时钟源即可...



该程序将配置其他所有内容。 如果选择其他通道号,则还需要在irSend.s文件中对其进行重命名。

对于其余的设置,我认为一切都很清楚-根据系统频率(在72 MHz的示例中),每50μs替换一次预分频器和溢出值。 以下内容显示了引脚的频率和读数。

以下是定义所涉及协议的定义...

 ////////////////////////////////////   //////////////////////////////////////// #define DECODE_RC5 1 //     RC5   0 #define SEND_RC5 1 //       RC5   0 #define DECODE_RC6 1 #define SEND_RC6 1 ... 

禁用不必要的协议会减少程序的大小。 原则上,通常可以切掉未使用的协议和相应文件的功能(文件具有特征名称)。

该程序非常简单,my_decode(&results)函数解码接收到的信号并显示按钮代码,协议类型和数据包长度...



我没有其他遥控器。

要发送解码信号,请使用具有相应名称的功能...

 sendSAMSUNG(0x707048b7, 32); my_enableIRIn(); 

my_enableIRIn()函数是必需的,它禁用PWM并将定时器置于接收模式。 相同的函数用于初始化(无限循环之前)。 由于此功能,您将无法捕获自己的信号-可以解决,但我认为没有意义。

如果您无法确定协议类型...


...然后没有什么可担心的,无论如何都会收到按钮代码。

如果您不仅需要接收未知信号,还需要发送未知信号,则需要取消注释“原始数据输出”的行...



...并使用sendRaw()函数发送读取的数据...

 uint8_t khz = 38; //    ,    36  40  unsigned int raw_signal[] = {1300, 400, 1300, 400, 450, 1200, 1300, 400, 1300, 400, 450, 1200, 500, 1200, 450, 1250, 450, 1200, 500, 1200, 450, 1250, 1300}; sendRaw(raw_signal, sizeof(raw_signal) / sizeof(raw_signal[0]), khz); my_enableIRIn(); //   ( ) 

向我发送“原始”消息对我不起作用。

该库将DWT计数器用于微秒延迟。 据我所知,并不是所有的stm32都具有它,并且可能并非在所有地方都对其进行同样的配置。 如果您的石头没有DWT,则需要在irSend.s文件末尾的custom_delay_usec(未签名的长期使用)函数中提出一些要替换的内容,该设置位于开头。

仅此而已。

图书馆

Source: https://habr.com/ru/post/zh-CN456890/


All Articles