2025 / 07 / 01
【RA-Eco-RA4M2开发板评测】RA-Eco-RA4M2 PWM输出

作者:ouxiaolong

开发环境:

IDE:MKD 5.38a

Renesas RA Smart Configurator:v5.1.0

开发板:RA-Eco-RA4M2

MCU:R7FA4M2AD3CFP

1 PWM简介

脉冲宽度调制(PWM),是英文“Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。

在瑞萨RA4M2系列 MCU 中有两种定时器,一种是通用 PWM 定时器 GPT,另外一种是异步通用定时器 AGT,在这里我们使用通用定时器GPT进行PWM输出。


RA4M2系列共有共 8 个GPT定时器(即8个通道), 其中包括 4 个32位GPT定时器(GPT32n (n=0~3))和 4 个16位GPT定时器(GPT16m (m=4~7))。GPT 的计数器支持递增计数,递减计数和递增/递减计数。详细的通道名称如下表所示。


PWM 输出就是对外输出脉宽(即占空比)可调的方波信号, 信号频率由周期设定寄存器 GTPR 的值决定,占空比由比较寄存器 GTCCR 的值决定。

2 PWM输出实现

2.1 RA Smart Configurator配置PWM

打开RA Smart Configurator,在配置界面里面依次打开“Pins->Peripherals->Timers:GPT”配置GPT模块,将GPT6 的 GTIOC6B 信号输出连接到 P600 引脚。

接下来就是添加PWM stack。

接下来需要配置PWM的参数。

核心参数如下:

  • Pin Output Support:使能PWM输出
  • Name:设置 GPT 模块名字,这里使用是GPT6,名字就为g_timer6
  • Channel:配置GPT通道,这里使用的第6个通道
  • Mode:配置 GPT 的工作模式为 PWM 输出模式。
  • Period:配置GPT的周期为10 KHz,需要和Period Unit配合使用
  • Period Unit:周期的单位,这里设置为KHz
  • Duty Cycle Percent:设置PWM的占空比,当然也可通过代码修改,这里就设置为50
  • GTIOCB Output Enabled:使能 GTIOCB 输出
  • GTIOCB Stop Level:设置定时器停止时 GTIOCB 输出的电平为低电平
  • GTIOC6B:选择连接到 P600 引脚,打开GPT的Pin之后,会默认关联

最后生成过程即可。

2.2 PWM输出

PWM输出有以下相关的函数:

  • R_GPT_Open()函数:进行初始化定时器模块并应用配置。
  • R_GPT_Start()函数:进行开启定时器。
  • R_GPT_PeriodSet()函数:设置频率,频率=时钟源/period,若设置频率为 10K,则 period=100M/10K=10000。
  • R_GPT_DutyCycleSet()函数:设置占空比,占空比=cycle/period ,若设置占空比为50%,则cycle=占空比* period=50%*10000=5000。
  • R_GPT_Reset()函数:将计数器值重置为 0。


最后看下代码吧:

/*******************************************************************************************************************//**
 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
 * is called by main() when no RTOS is used.
 **********************************************************************************************************************/
void hal_entry(void)
{
    fsp_err_t err = FSP_SUCCESS;

    /* TODO: add your own code here */
    SysTick_Init();   //初始化系统时钟

    /* 初始化定时器模块. */
    err = R_GPT_Open(&g_timer6_ctrl, &g_timer6_cfg);
    /* 如果初始化无错才继续. */
    assert(FSP_SUCCESS == err);

    /* 开启定时器. */
    err = R_GPT_Start(&g_timer6_ctrl);
    /* 如果初始化无错才继续. */
    assert(FSP_SUCCESS == err);

    while(1)
    {
        Delay_ms(500);
        R_IOPORT_PinWrite(&g_ioport_ctrl, GPIO_LED3, BSP_IO_LEVEL_LOW);
        R_IOPORT_PinWrite(&g_ioport_ctrl, GPIO_LED1, BSP_IO_LEVEL_HIGH);
        
        Delay_ms(500);
        R_IOPORT_PinWrite(&g_ioport_ctrl, GPIO_LED1, BSP_IO_LEVEL_LOW);
        R_IOPORT_PinWrite(&g_ioport_ctrl, GPIO_LED2, BSP_IO_LEVEL_HIGH);
        
        Delay_ms(500);
        R_IOPORT_PinWrite(&g_ioport_ctrl, GPIO_LED2, BSP_IO_LEVEL_LOW);
        R_IOPORT_PinWrite(&g_ioport_ctrl, GPIO_LED3, BSP_IO_LEVEL_HIGH);
    }

#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

笔者这里只是使用了R_GPT_Open()和R_GPT_Start()函数,就是公用默认的频率和占空比就好了。

大部分初始化的工作已经通过软件生成了,因此实现起来就比较简单。

3 实验现象

接下来就看看PWM的输出,PWM 信号可以通过示波器看到,下面笔者就是用逻辑分析仪查看波形。

首先笔者使用的逻辑分析仪是Kingst LA5016,当然啦,其他的也可以,关于逻辑分析仪的相关使用笔者这里就不介绍了,可以查看官方资料。

首先将P600引脚接到逻辑分析仪的CH0,然后下载程序到板子中,打开Kingst VIS,然后进行采样。


从上图可以看到,实际测量的频率和占空比与理论是相符的。

隐私条款

一、接受条款 使用者(也称"您")在访问或使用本网站及其服务时,即已经表示同意并不加修改地接受本《用户协议》、本网站的《隐私声明》、《法律声明》以及其关或相链接的网页和网站的条件和条款的规定。我们强烈建议:在您阅读和接受本《用户协议》时,也应阅读并接受本《用户协议》中所提到《隐私声明》、《法律声明》及其相关或相链接网页或网站所包含的资料,因为《隐私声明》、《法律声明》及其它相关网页或网站可能包含对您适用的进一步规定。(请注意:点击划有底线的词句即可链接到上述《隐私声明》、《法律声明》及其它相关或相链接的网页和网站。

 

二、使用者的资格要求 在本网站中"使用者"指的是浏览、阅读、使用本网站信息或服务的任何个人或组织。本网站的服务仅适用于根据相关法律的规定具有签订有约束力的合同的个人或组织并仅由其使用。本网站的服务不向18周岁以下的个人使用者提供,也不向临时被本网站中止或取消使用者资格的使用者提供。如果使用者不符合本条规定,请停止使用本网站或本网站的服务。