开发环境:
IDE:MKD 5.30
开发板:野火启明6M5开发板
MCU:R7FA6M5BH3CFC
脉冲宽度调制(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 的计数器支持递增计数,递减计数和递增/递减计数。详细的通道名称如下表所示。
打开RA Smart Configurator,在配置界面里面依次打开“Pins->Peripherals->Timers:GPT”配置GPT模块,将GPT6 的 GTIOC6B 信号输出连接到 P600 引脚。
接下来就是添加PWM stack。
接下来需要配置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
最后看下代码吧:
/*******************************************************************************************************************//**
* 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(); //初始化系统时钟
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
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
笔者这里只是使用了R_GPT_Open()和R_GPT_Start()函数,就是公用默认的频率和占空比就好了。
大部分初始化的工作已经通过软件生成了,因此实现起来就比较简单。
接下来就看看PWM的输出,PWM 信号可以通过示波器看到,下面笔者就是用逻辑分析仪查看波形。
首先笔者使用的逻辑分析仪是Kingst LA5016,当然啦,其他的也可以,关于逻辑分析仪的相关使用笔者这里就不介绍了,可以查看官方资料。
首先将P600引脚接到逻辑分析仪的CH0,然后下载程序到板子中,打开Kingst VIS,然后进行采样。
从上图可以看到,实际测量的频率和占空比与理论是相符的。
更多回帖