开发环境:
IDE:MKD 5.30
开发板:野火启明6M5开发板
MCU:R7FA6M5BH3CFC
1 PWM简介
脉冲宽度调制(PWM),是英文“Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。
在瑞萨RA6M5系列 MCU 中有两种定时器,一种是通用 PWM 定时器 GPT,另外一种是异步通用定时器 AGT,在这里我们使用通用定时器GPT进行PWM输出。
RA6M5系列共有 10 个 GPT 定时器(GPT0 ~ 9),而 GPT 又分为 GPT32 和 GPT16。 GPT32 有4个(GPT0 ~ 3),计数器为 32bit,用 GPT320 ~ GPT323 来表示; 而 GPT16 有6个(GPT4 ~ 9),计数器为 16bit,用 GPT164 ~ GPT169 来表示。GPT 的计数器支持递增计数,递减计数和递增/递减计数。详细的通道名称如下表所示。
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输出
POWM输出有以下相关的函数:
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
最后看下代码吧:
void hal_entry(void)
{
fsp_err_t err = FSP_SUCCESS;
SysTick_Init();
R_SCI_UART_Open (g_uart4.p_ctrl, g_uart4.p_cfg);
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
R_BSP_NonSecureEnter();
#endif
}
笔者这里只是使用了R_GPT_Open()和R_GPT_Start()函数,就是公用默认的频率和占空比就好了。
大部分初始化的工作已经通过软件生成了,因此实现起来就比较简单。
2.3 实验现象
接下来就看看PWM的输出,PWM 信号可以通过示波器看到,下面笔者就是用逻辑分析仪查看波形。
首先笔者使用的逻辑分析仪是Kingst LA5016,当然啦,其他的也可以,关于逻辑分析仪的相关使用笔者这里就不介绍了,可以查看官方资料。
首先将P600引脚接到逻辑分析仪的CH0,然后下载程序到板子中,打开Kingst VIS,然后进行采样。
从上图可以看到,实际测量的频率和占空比与理论是相符的。