0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用MM32L0130片上IRM模块实现红外发码

灵动MM32MCU 来源:灵动MM32MCU 作者:灵动MM32MCU 2022-10-13 17:03 次阅读

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

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

1

IRM介绍

1.1 IRM功能框图

c694efce-4ad4-11ed-a3b6-dac502259ad0.png

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

功能概述

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。
波形如下:

c6ab15ce-4ad4-11ed-a3b6-dac502259ad0.png

FSK 调制波形

2.22 ASK 调制

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

c6c05f60-4ad4-11ed-a3b6-dac502259ad0.png

ASK 调制波形

3

实验

本次实验使用MM32L0130片上IRM驱动红外发射管实现红外发码。硬件使用灵动股份设计的EVB-L0136开发板,红外模块原理图如下:

c6dcbb88-4ad4-11ed-a3b6-dac502259ad0.png

原理图中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配置

voidIRM_FSK_Config(void)
{
IRM_InitTypeDefIRM_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

voidIRM_FSK_Clock_Init(TIM_TypeDef*chan1_tim,TIM_TypeDef*chan2_tim)
{
u32ui_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

#defineIRM_FREQUENCE38000

3.13 配置UART1 RX中断

voidUART1_NVIC_Init(u32baudrate)
{
UART_InitTypeDefUART_InitStruct;
NVIC_InitTypeDefNVIC_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收发测试

voidIRM_Transmit_Test(void)
{

u16i,getcount;
u8irm_string[]={0xFF,0xFF,0x55,0xAA,0xF0,0x0F,0x80,0x01};
u8getbyte;
IRM_Initialize();
while(1){
getcount=0;
for(i=0;i< sizeof(irm_string); i++) {
            Output_Byte(UART1, irm_string[i]);
            if(SUCCESS == UART1_CheckRxdByte(&getbyte, 10000)) {
                if(getbyte == irm_string[i]) {
                    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,逻辑分析仪获取一段数据如下:

c6eda86c-4ad4-11ed-a3b6-dac502259ad0.png

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

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

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

c70584f0-4ad4-11ed-a3b6-dac502259ad0.png    

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

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

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

3.21 IRM配置

voidIRM_ASK_Config(void)
{
IRM_InitTypeDefIRM_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

voidIRM_FSK_Clock_Init(TIM_TypeDef*chan1_tim,TIM_TypeDef*chan2_tim)
{
u32ui_tim_value;
ui_tim_value=(u32)((RCC_GetSysClockFreq())/IRM_FREQUENCE);
TIM_Init(chan1_tim,(ui_tim_value)-1,0);
}

定义IRM_FREQUENCE为38000

#defineIRM_FREQUENCE38000

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

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

c7232e56-4ad4-11ed-a3b6-dac502259ad0.png

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

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

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

c734fc58-4ad4-11ed-a3b6-dac502259ad0.png

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




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5036

    浏览量

    117748
  • 红外遥控
    +关注

    关注

    22

    文章

    346

    浏览量

    45006
  • 调制器
    +关注

    关注

    3

    文章

    784

    浏览量

    44720
  • IRM
    IRM
    +关注

    关注

    1

    文章

    2

    浏览量

    1712
  • MM32
    +关注

    关注

    1

    文章

    105

    浏览量

    574

原文标题:灵动微课堂 (第231讲) | 使用MM32L0130 IRM实现红外发码

文章出处:【微信号:MindMotion-MMCU,微信公众号:灵动MM32MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用MM32L0130 IRM实现红外

    1、使用MM32L0130 IRM实现红外  红外
    发表于 10-21 14:22

    MM32L0130系列MCURTC外设具有哪些特征

    夏令时补偿,支持数字校准补偿晶振精度的偏差。灵动微电子推出的MM32L0130系列MCURTC外设具有以下特征:可编程的日历功能,包括时、分、秒、小时(12/24 小时制)、日期、星期、月份、年份软件
    发表于 10-31 15:57

    MM32L0130系列MCURTC模块具有哪些功能呢

    1 MM32L0130 RTC简介RTC 模块是用于提供时间(时、分、秒、亚秒)和日期(年、月、日)功能的定时计数器,日历以 BCD的格式显示。内部包含周期性的唤醒单元,用于唤醒低功耗模式。支持
    发表于 11-02 14:37

    基于MM32L0130的低功耗电子时钟设计方案相关资料分享

    1、基于MM32L0130的低功耗电子时钟设计  MM32L0130作为灵动微电子推出的一款低功耗芯片,内置多种省电工作模式保证低功耗应用的要求。前面章节分别对MM32L0130
    发表于 11-09 16:00

    基于MM32L0130的LPUART外设应用简介

    运行,并且可以将MCU从低功耗模式唤醒。本文介绍MM32全新低功耗系列MM32L0130的LPUART外设,实现基本UART收发通信、通过UART中断使MCU从低功耗模式中唤醒。1 LPUART 简介
    发表于 12-09 16:04

    请问有人使用IAR进行过MM32L0130的开发吗?

    我在使用IAR8.30进行MM32L0130开发板试用时遇到了一个棘手的问题,其例程能够下载到开发板(至少在IAR中任何报错,也可以在线调试),可是就是一直开在时钟配置阶段,一直没有配置成功,有人遇到过这样的问题吗?或者在调试其他单片机时是否有类似现象?麻烦指导一下解决办法
    发表于 12-18 21:48

    灵动微MM32L0130系列32位微控制器的详细介绍

    全新MM32L0130系列是灵动微电子针对低功耗应用推出的新一代MCU产品,其搭载了Arm®Cortex®-M0+内核,采用了先进的低功耗架构设计和技术手段,实现了最低700nA的RTC运行功耗,最低250nA的待机功耗和低于100nA的最低功耗表现。
    发表于 04-28 16:18 502次阅读

    使用MM32L0130 SLCD驱动LCD显示

    灵动股份推出的MM32L0130系列MCU具有片上SLCD液晶显示控制器,SLCD 驱动器是用于单色无源液晶显示器(SLCD)的数字驱动器,具有多达 8 个公共端和多达 63 个分段端, SLCD
    的头像 发表于 10-21 10:54 1549次阅读

    MM32L0130 RTC日历和闹钟

    RTC 模块是用于提供时间(时、分、秒、亚秒)和日期(年、月、日)功能的定时计数器,日历以 BCD码的格式显示。内部包含周期性的唤醒单元,用于唤醒低功耗模式。支持夏令时补偿,支持数字校准补偿晶振精度的偏差。灵动微电子推出的MM32L0130系列MCU片上RTC外设具有以下
    的头像 发表于 10-28 10:37 955次阅读

    基于MM32L0130的低功耗电子时钟设计

    MM32L0130作为灵动微电子推出的一款低功耗芯片,内置多种省电工作模式保证低功耗应用的要求。前面章节分别对MM32L0130片上外设SLCD和RTC做了相关描述,并列举对应程序实现SLCD驱动
    的头像 发表于 11-04 10:12 1089次阅读

    MM32L0130 产品手册(中文版)

    MM32L0130 产品手册(中文版)
    发表于 02-27 18:24 0次下载
    <b class='flag-5'>MM32L0130</b> 产品手册(中文版)

    MM32L0130 产品手册(英文版)

    MM32L0130 产品手册(英文版)
    发表于 02-27 18:25 0次下载
    <b class='flag-5'>MM32L0130</b> 产品手册(英文版)

    MM32L0130 用户手册(中文版)

    MM32L0130 用户手册(中文版)
    发表于 02-27 18:26 0次下载
    <b class='flag-5'>MM32L0130</b> 用户手册(中文版)

    MM32L0130 用户手册(英文版)

    MM32L0130 用户手册(英文版)
    发表于 02-27 18:26 0次下载
    <b class='flag-5'>MM32L0130</b> 用户手册(英文版)

    使用MM32L0130和HYS1254的电子秤方案验证

    NPI提了需求,需要验证使用友商SDADC芯片和MM32L0130微控制器集成的一个系统应用方案。
    的头像 发表于 10-17 17:16 326次阅读
    使用<b class='flag-5'>MM32L0130</b>和HYS1254的电子秤方案验证