通用 PWM定时器(GPT,General PWMTimer)是RA MCU 的其中一种32/16位的定时器外设。在GPT当中,可分为GPT32和GPT16,它们最主要的区别是计数器的不同。GPT32是32位的定时器,包含的计数器是32位的,所能计数的范围为:0~0xFFFF_FFFF;而GPT16是16位的定时器,包含的计数器是16位的,所能计数的范围为:0~0xFFFF。
定时器(Timer)最基本的功能就是定时,比如定时发送串口数据、定时采集AD数据、定时触发中断处理其它事务等等。如果把定时器与GPIO引脚结合起来使用的话可以实现更加丰富的功能,可以对输入信号进行计数,可以测量输入信号的脉冲宽度,可以输出单个脉冲、PWM等波形,等等。通过定时器生成PWM波形信号来控制电机状态是工业控制的普遍方法,这方面知识非常值得深人了解。
GPT模块可用于计数事件、测量外部输入信号、作为通用计时器并产生周期性中断、以及输出周期性或PWM信号到GTIOC引脚。GPT也可用于输出单个脉冲,但是注意这是通过软件来实现的,GPT硬件本身不支持输出单个脉冲(One-Shot)功能。当使用单个脉冲(One-Shot)模式时,必须要开启中断,计时器需要在脉冲周期结束后在ISR 中断服务函数中被停止。
二:PWM知识总结如下
PWM(Pulse Width Modulation 脉宽调制)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。它是一种对模拟信号电平进行数字编码的方法。是指在一定时间内波形的高电平(即 1 状态)所占用的时间比例。
通过高分辨率计数器的使用,方波占空比被调制用来对一个模拟信号的电平进行编码。PWM 信号任然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有,要么完全无。比如我们的电压输出是 5V的,那么经过改变 PWM 的占空比,可以达到在一定时间内输出 3.3V 或者 1.3V 的效果。
这里我们对定时器输出脉冲的频率进行一个简单的测试
PWM是脉冲宽度调制,具有两个非常重要的参数:频率和占空比。
频率:PWM的频率是整个周期的倒数。
占空比:占空比是指一个周期内高电平所占的比例。
定时器的输出部分由比较器和输出控制构成,用于编程输出信号的周期、占空比、极性。高级定时器的输出部分在不同通道上有所不同。
三:FSP的配置过程

void PWM_init(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_GPT_Open(&g_timer1_ctrl, &g_timer1_cfg);
/* Handle any errors. This function should be defined by the user. */
assert(FSP_SUCCESS == err);
/* Start the timer. */
R_GPT_Start(&g_timer1_ctrl);
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);
R_BSP_SoftwareDelay (1000, BSP_DELAY_UNITS_MILLISECONDS);
err = R_GPT_PeriodSet(&g_timer1_ctrl, 10000);//频率
assert(FSP_SUCCESS == err);
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);//不加延时可能会设置不成功
err = R_GPT_DutyCycleSet(&g_timer1_ctrl, 5000, GPT_IO_PIN_GTIOCB);//占空比
assert(FSP_SUCCESS == err);
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);
R_GPT_Start(&g_timer1_ctrl);
}4.2 脉宽修改函数如下所示:void UpdataDuty(uint32_t value)
{
fsp_err_t err = FSP_SUCCESS;
err = R_GPT_PeriodSet(&g_timer1_ctrl, 10000);//频率
assert(FSP_SUCCESS == err);
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);//不加延时可能会设置不成功
err = R_GPT_DutyCycleSet(&g_timer1_ctrl, value, GPT_IO_PIN_GTIOCB);//占空比
assert(FSP_SUCCESS == err);
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);
R_GPT_Start(&g_timer1_ctrl);
}void TestDuty(void)
{ static int data = 1000 ;
data = data + 1000 ; if(data >10000) data = 1000 ;
UpdataDuty(data);
}五:实物验证:
我要赚赏金
