打印
[其他]

使用MM32L0130 IRM实现红外发码

[复制链接]
1482|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 MM灵灵灵 于 2022-10-17 10:04 编辑

使用MM32L0130 IRM实现红外发码

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易于实现等显著优点,被诸多电子设备包括消费电子、家用电器、安防器材等广泛采用,如智能手环、机顶盒、3D眼镜、智能扫地机、空调、电扇、通道闸、红外栅栏等,近年来也越来越多的应用到计算机和手机系统中。

灵动股份推出的MM32L0130系列MCU具有片上IRM红外调制器,该模块使用片上的定时器和串口,实现数据的 FSK/ASK 调制,以满足红外发码的需求。

一.IRM介绍

1.1 IRM功能框图


1.2 IRM主要特征

  • 支持 APB 接口
  • 两个调制信号源,分别为通道 1 和通道 2
  • 通道 1 和通道 2 调制信号源均可选,来源包含
      1)恒 0
      2)恒 1
      3)TIM3 的 OC1 通道
      4)TIM4 的 OC1 通道
      5)TIM16 的 OC1 通道
      6)TIM17 的 OC1 通道
  • 基带信号源可选,来源包含
      1)IRM 数据寄存器
      2)UART1_TX
      3)UART2_TX
      4)LPUART_TX
  • 可实现数据的 ASK、FSK 调制,调制方式可选
  • 输出信号极性可选

二.功能概述

2.1 波形产生单元

调制信号选择功能:两个通道, channel_1 和 channel_2,通过寄存器配置可选择通道输入为恒 0、恒1、 TIM3 的 OC1 通道、 TIM4 的 OC1 通道、 TIM16 的 OC1 通道、 TIM17 的 OC1 通道。

基带信号选择功能:被发送的红外信号对应源数据,可以通过寄存器配置选择源为 IRM_DR、 UART1_TX、UART2_TX、 LPUART1_TX。

调试方式:可选 FSK 或 ASK。

极性可选,输出可为正常或反相波形。

2.2 调制功能说明

2.21 FSK 调制

用不同的频率来表示不同的符号。本模块为二进制频移键控(2FSK)。信号可以看成是频载为 f1 和 f2的两个振幅键控信号的合成。该功能模式下,调制信号源为频率为 f1、 f2 的两个方波:被调制信号为 0,则对应输出 f1;被调制信号为 1 则对应输出 f2。

波形如下:


2.22 ASK 调制

用不同的幅度来表示不同的符号。本模块为 OOK(On-Off Keying)调制,是 ASK 调制的一个特例,把一个幅度取为 0,另一个幅度为非 0,就是 OOK。又名 2ASK(二进制振幅键控)。该功能模式下,通道 1 信号源应为恒 0,通道 2 信号源应该频率为 f2 的方波:被调制信号为 0,则对应输出 0;被调制信号为 1 则对应输出 f2。

波形如下:


三.实验


原理图中PA9连接D1(红外发射管)、PA10连接D2(红外接收头),红外发射电路使用T1(N-MOS管)控制红外发射管的导通或截至,在导通的时候,红外发射管会发射出红外光,反之,不会发射出红外光。要使两者通信成功,收/发红外波长与载波频率需一致,在这里波长就是940nm,载波频率就是38KHz。当红外接收头接收到红外载波信号时,其OUT引脚输出低电平,反之,OUT引脚输出高电平。

3.1 实验1:实现数据FSK调制

程序中配置PA9作为IRM红外调制器的发送引脚,配置调制信号通道1选择TIM3_OC1,调制信号通道2选择TIM4_OC1,基带信号源选择UART1_TX信号,调制方式选择FSK调制,以实现红外发码。主要代码如下:

3.11 IRM配置

void IRM_FSK_Config(void)
{
    IRM_InitTypeDef IRM_InitStruct;

    RCC_APB1PeriphClockCmd(RCC_APB1ENR_IRM, ENABLE);
    IRM_FSK_Clock_Init(TIM3, TIM4);
    IRM_StructInit(&IRM_InitStruct);
    IRM_SetIRMData(0);
    IRM_InitStruct.IRM_Polarity = IRM_Polarity_Normal;
    IRM_InitStruct.IRM_Modulation = IRM_Modulation_FSK;
    IRM_InitStruct.IRM_DataSelectSource = IRM_DataSource_UART1_TX;
    IRM_InitStruct.IRM_Channel1ClockSource = IRM_Channel1ClockSource_TIM3OC1;
    IRM_InitStruct.IRM_Channel2ClockSource = IRM_Channel2ClockSource_TIM4OC1;

    IRM_Init(&IRM_InitStruct);
    UART1_NVIC_Init(600);

    IRM_StartCmd(ENABLE);
}

3.12 调制信号配置

配置TIM3输出PWM,频率为38KHZ(和载波频率一致),占空比为1/2

配置TIM4输出PWM,频率为3.8KHZ(一个非载波频率),占空比为1/2
void IRM_FSK_Clock_Init(TIM_TypeDef* chan1_tim, TIM_TypeDef* chan2_tim)
{
    u32 ui_tim_value;

    ui_tim_value = (u32)((RCC_GetSysClockFreq()) / IRM_FREQUENCE);

    TIM_Init(chan1_tim, (ui_tim_value) - 1, 0);
    TIM_Init(chan2_tim, (ui_tim_value) * 10 - 1, 0);

}

定义IRM_FREQUENCE为38000
#define IRM_FREQUENCE                   38000

3.13 配置UART1 RX中断

void UART1_NVIC_Init(u32 baudrate)
{
    UART_InitTypeDef UART_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;

    RCC_UART_ClockCmd(UART1, ENABLE);

    NVIC_InitStruct.NVIC_IRQChannel = UART1_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPriority = 3;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);

    UART_StructInit(&UART_InitStruct);
    UART_InitStruct.BaudRate = baudrate;
    UART_InitStruct.WordLength = UART_WordLength_8b;
    UART_InitStruct.StopBits = UART_StopBits_1;
    UART_InitStruct.Parity = UART_Parity_No;
    UART_InitStruct.HWFlowControl = UART_HWFlowControl_None;
    UART_InitStruct.Mode = UART_Mode_Rx | UART_Mode_Tx;

    UART_Init(UART1, &UART_InitStruct);
    UART_ITConfig(UART1, UART_IT_RXIEN, ENABLE);
    UART_Cmd(UART1, ENABLE);

    UART1RX_GPIO_Init();
}


3.14 IRM收发测试

void IRM_Transmit_Test(void)
{

    u16 i, getcount;
    u8 irm_string[] = {0xFF, 0xFF, 0x55, 0xAA, 0xF0, 0x0F, 0x80, 0x01};
    u8 getbyte;
    IRM_Initialize();
    while(1) {
        getcount = 0;
        for(i = 0; i < sizeof(irm_string); i++) {
            Output_Byte(UART1, irm_string);
            if(SUCCESS == UART1_CheckRxdByte(&getbyte, 10000)) {
                if(getbyte == irm_string) {
                    getcount++;
                }
            }
            delay_x_cycle(1000);
        }
        if(getcount == sizeof(irm_string)) {
            __NOP();
        }
        else {
            __NOP();
        }
    }
}


定义数组irm_string[]存放需要IRM调制的数据,IRM对数据进行FSK调制后,通过IRM_TX引脚发送,控制MOS管驱动红外发射管以发射红外光,红外接收头对红外光进行解码后,由UART1_RX引脚接收,将收到的数据与数组irm_string[]中的数据进行比对,看收/发数据是否一致,并进行统计。

FSK模式下,调制信号源为频率为38K、3.8K的两个方波:被调制信号为0时,则对应输出38KHZ;被调制信号为1时,则对应输出3.8KHZ,逻辑分析仪获取一段数据如下:


通道4为IRM_TX发出的调制信号。

通道5是UART1_RX接收到的数据,符合红外接收头特性。

观察串口调试助手打印数据,和irm_string[]中的数据一致。


3.2 实验2:实现数据ASK调制

程序中配置PA9作为IRM红外调制器的发送引脚,配置调制信号通道1为恒1,调制信号通道2选择TIM4_OC1,基带信号源选择UART1_TX信号,调制方式选择ASK调制,以实现红外发码。

该实验与前面实验1相比,只是选择IRM的另一种调制模式,代码只需在实验1的基础上改动即可,主要代码如下:

3.21 IRM配置

void IRM_ASK_Config(void)
{
    IRM_InitTypeDef IRM_InitStruct;

    RCC_APB1PeriphClockCmd(RCC_APB1ENR_IRM, ENABLE);
    IRM_ASK_Clock_Init(TIM4);
    IRM_StructInit(&IRM_InitStruct);
    IRM_SetIRMData(0);
    IRM_InitStruct.IRM_Polarity = IRM_Polarity_Normal;
    IRM_InitStruct.IRM_Modulation = IRM_Modulation_ASK_PSK;
    IRM_InitStruct.IRM_DataSelectSource = IRM_DataSource_UART1_TX;
    IRM_InitStruct.IRM_Channel1ClockSource = IRM_Channel1ClockSource_KeepHigh;              
    IRM_InitStruct.IRM_Channel2ClockSource = IRM_Channel2ClockSource_TIM4OC1;

    IRM_Init(&IRM_InitStruct);
    UART1_NVIC_Init(600);

    IRM_StartCmd(ENABLE);
}

3.22 调制信号配置

配置TIM4输出PWM,频率为38KHZ(和载波频率一致),占空比为1/2
void IRM_FSK_Clock_Init(TIM_TypeDef* chan1_tim, TIM_TypeDef* chan2_tim)
{
    u32 ui_tim_value;
    ui_tim_value = (u32)((RCC_GetSysClockFreq()) / IRM_FREQUENCE);
    TIM_Init(chan1_tim, (ui_tim_value) - 1, 0);
}

定义IRM_FREQUENCE为38000

#define IRM_FREQUENCE                   38000

其余代码同实验1,下载运行。

ASK模式下,被调制信号为1时,则对应输出38KHZ;被调制信号为0时,则对应输出0,截取逻辑分析仪的一段数据分析:


通道4为IRM_TX发出的调制信号。

通道5是UART1_RX接收到的数据,符合红外接收头特性。

观察串口调试助手打印数据,和irm_string[]中的数据一致。


实验简单演示了使用MM32L0130片上IRM模块实现红外发码,并判断收发数据的一致性。IRM模块使用片上的定时器和串口,实现数据的 FSK/ASK 调制,满足红外发码的需求。

使用特权

评论回复
沙发
地下縱情搖擺| | 2022-10-30 09:38 | 只看该作者
现在红外用的少了,不过真的是很好用,基本控制还是很OK的

使用特权

评论回复
板凳
一枝香| | 2022-10-30 10:11 | 只看该作者
红外控制是不是还有红外的库可以调用啊,就是里面很多遥控协议那种

使用特权

评论回复
地板
銀河| | 2022-10-30 10:43 | 只看该作者
属实,之前我们调试红外遥控的时候也是用定时器实现的

使用特权

评论回复
5
岁月反驳| | 2022-10-30 11:15 | 只看该作者
现在还是用2.4G吧,比较稳定,而且还好用

使用特权

评论回复
6
笨蛋无需搭理| | 2022-10-30 11:47 | 只看该作者
红外很容易受到干扰的,还需要定向,现在不建议使用了

使用特权

评论回复
7
占得人间第一春| | 2022-10-30 12:19 | 只看该作者
为啥要38K的基带啊?是因为标准么?

使用特权

评论回复
8
可爱的白兔先生| | 2022-10-30 12:51 | 只看该作者
话说,如果用这种方式,实现红外遥控的学习**功能,是不是就抓到波形记录一下就可以了

使用特权

评论回复
9
林间有新绿| | 2022-10-30 13:23 | 只看该作者
这种调制通讯真的很有意思,就上学的时候就用过,那时候还不懂嘞

使用特权

评论回复
10
热爱童话世界| | 2022-10-30 13:55 | 只看该作者
之前做过一款红外对射检测模块,就跟这种类似,但是不需要FSK调制

使用特权

评论回复
11
风吻过你的不羁| | 2022-10-30 14:27 | 只看该作者
需要这么多定时器啊?可以少用几个的吧,我觉得

使用特权

评论回复
12
maqianqu| | 2022-11-2 17:26 | 只看该作者
通信的协议是什么?红外解码的时候速度怎么样?

使用特权

评论回复
13
ccook11| | 2022-11-2 17:35 | 只看该作者
楼主可不可以通过MM32L0130 控制空调的开关和条纹呢?

使用特权

评论回复
14
jtracy3| | 2022-11-2 17:52 | 只看该作者
红外线接收头都有哪几种规格?  

使用特权

评论回复
15
jkl21| | 2022-11-2 18:22 | 只看该作者
对数据进行FSK调制,使用定时器吗?

使用特权

评论回复
16
jtracy3| | 2022-11-2 18:56 | 只看该作者
ir和irm的区别是什么?        

使用特权

评论回复
17
pentruman| | 2022-11-2 19:37 | 只看该作者
IRM-3640N3红外线接收头的载波频率,电源电压是多少?

使用特权

评论回复
18
plsbackup| | 2022-11-2 20:29 | 只看该作者
IRM 接收头最大的发射距离是多少?

使用特权

评论回复
19
vivilyly| | 2022-11-2 21:18 | 只看该作者
这个mm32如何实现编码呢?              

使用特权

评论回复
20
jackcat| | 2022-11-3 20:27 | 只看该作者
直接使用MM32L0130 对信号进行解调可以吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:上海灵动微电子股份有限公司
简介:上海灵动微电子股份有限公司成立于 2011 年,是中国本土通用 32 位 MCU 产品及解决方案供应商。 灵动股份的 MCU 产品以 MM32 为标识,基于 Arm Cortex-M 系列内核,自主研发软硬件和生态系统。目前已量产近 300 多款型号,累计交付超 4 亿颗,在本土通用 32 位 MCU 公司中位居前列。

92

主题

110

帖子

5

粉丝