开发环境:
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输出。

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

Figure ‑ GPT各个通道详情
PWM 输出就是对外输出脉宽(即占空比)可调的方波信号, 信号频率由周期设定寄存器 GTPR 的值决定,占空比由比较寄存器 GTCCR 的值决定。
2 PWM输出实现
2.1 RA Smart Configurator配置PWM
打开RA Smart Configurator,在配置界面里面依次打开“Pins->Peripherals->Timers:GPT”配置GPT模块,将GPT6 的 GTIOC6B 信号输出连接到 P600 引脚。

Figure ‑ 打开GPT输出引脚
接下来就是添加PWM stack。

Figure ‑ 添加PWM stack
接下来需要配置PWM的参数。

Figure ‑ 配置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,然后进行采样。

Figure ‑ PWM输出实现现象
从上图可以看到,实际测量的频率和占空比与理论是相符的。