Renesas R7FA8D1BH 的定时器(PWM)的输出模式应用介绍和实践
目录
概述
1 PWM参数介绍
1.1 周期配置
1.2 占空比
2 应用范例
2.1 有一次的模式
2.2 单次模式输出
2.3 单次脉冲模式
2.4 周期输出
2.5 脉宽调制输出
2.6 三角波PWM输出
3 PWM输出延时
4 一个用于案例
4.1 代码介绍
4.2 源代码文件
概述
本文主要介绍Renesas R7FA8D1BH (Cortex®-M85)的 General PWM相关的功能,包括其定时器的特性,参数配置方法,各类模式下使用的要点。并写一个产生4路PWM的案例介绍FSP下API函数的应用方法。
1 PWM参数介绍
1.1 周期配置
最大的时期
RA Configuration编辑器将根据所选的周期时间、单位和时钟速度自动计算周期计数值和源时钟分配器。当选择的周期单位为“Raw counts”时,32位计时器的最大周期设置为0x40000000000, 16位计时器的最大周期设置为0x4000000。这将为计时器配置最大周期和1024的计数时钟除数。
请注意
与32位通道相比,16位通道固有地具有更小的最大周期。当在16位通道上设置数百毫秒或更长时间的周期值时,一定要检查生成的输出以确认实际配置的值,因为它将比32位通道更早剪辑。一般来说,如果需要较长的硬件延迟,建议使用AGT或RTC等低功耗定时器。
1.2 占空比
更新周期和占空比
周期和占空比在调用R_GPT_PeriodSet()或R_GPT_DutyCycleSet()后下一次计数器溢出后更新。要在下一个计数器溢出之前强制它们更新,请在计数器运行时调用R_GPT_Reset()。
请注意
手动修改定时器周期计数时,32位GPT的最大值为0x100000000。这个数字超出了timer_cfg_t::period_counts的32位值。设置定时器的最大周期,将timer_cfg_t::period_counts设置为0。
2 应用范例
2.1 有一次的模式
GPT定时器本身不支持单次模式。单次模式是通过在调用回调之前停止中断服务程序中的计时器来实现的。如果在计时器到期之前中断没有得到服务,计时器将生成多个事件。在这种情况下,回调只被调用一次,但如果计时器链接到Transfer (r_dtc),则可能生成多个事件。
2.2 单次模式输出
在单次模式下,输出波形比配置的周期小一个PCLKD周期。配置的周期必须至少为2次才能产生输出脉冲。该模块可产生的单次信号示例如下:
2.3 单次脉冲模式
单脉冲模式是一种非对称PWM模式,提供了对输出上升沿和下降沿的更多控制。用户提供一个周期和初始输出电平,并通过指定每个周期的前后边缘的比较匹配值来控制信号。
请注意
尽管它的名字,一次脉冲模式连续工作,不停止后的第一个周期。
单次脉冲模式输出,该模块产生的PWM信号示例如下所示。可以在溢出中断中使用R_GPT_DutyCycleSet()修改前边和后边匹配值。
如果启用死区时间,只需要设置GTIOCnA的匹配值;GTIOCnB的匹配值将在硬件中自动配置。
2.4 周期输出
GTIOC引脚在定时模式下每次定时器到期时切换两次。这是通过定义占空比为50%的PWM波来实现的,这样产生的方波周期(从上升沿到上升沿)与GPT定时器的周期相匹配。由于周期输出实际上是PWM输出,因此在奇数周期值的停止电平上的时间比停止电平对面的时间短一个周期。
该模块可以产生的周期信号示例如下:
2.5 脉宽调制输出
PWM输出信号在周期开始时高,在周期结束时低。
该模块可产生的PWM信号示例如下:
2.6 三角波PWM输出
该模块产生的PWM信号示例如下所示。duty_cycle_counts可以在波峰中断中使用R_GPT_DutyCycleSet()进行修改,并在对称PWM的下一个波谷进行更新,或者在波峰/波谷中断中进行修改,并在非对称PWM的下一个波谷/波峰进行更新。
3 PWM输出延时
在选定的mcu上,可以配置一个额外的PWM输出延迟电路,以便以GPT核心时钟周期的1/32倍的增量微调上升沿和下降沿延迟。在使用R_GPT_PwmOutputDelayInitialize初始化GPT通道之前,必须配置PWM输出延迟功能。
请注意
1. 在锯齿波PWM模式下,当捕获比较设置(GTCCRn)大于或等于周期设置(GTPR) - 2时,不能改变输出延迟设置。
2. 在三角形PWM模式中,当计数器计数时,不能改变输出延迟设置,并且捕获比较设置(GTCCRn)小于或等于2。
3. 当使能PWM输出延迟电路时,PWM信号延迟3个GPT核心时钟周期。
4. 当GPTCLK被用作GPT核心时钟时,在写入给定引脚的上升沿或下降沿输出延迟设置之间需要以下延迟:Write_Interval[ns] = Period_of_PCLKA [ns] × 6 + Period_of_GPTCLK [ns] × 4)。
4 一个用于案例
4.1 代码介绍
代码21行: 打开第一路定时器,初始化和配置参数
代码23行:使能定时器
代码27行:配置占空比
代码32行: 打开第2路定时器,初始化和配置参数
代码34行:使能定时器
代码36行:配置占空比
代码43行: 打开第3路定时器,初始化和配置参数
代码45行:使能定时器
代码47行:配置占空比
4.2 源代码文件
创建bsp_pwm.c文件,编写如下代码
/*FILE NAME : bsp_pwm.cDescription: pwm interfaceAuthor : tangmingfei2013@126.comDate : 2024/06/03*/
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include "bsp_pwm.h"
#include "hal_data.h"void pwm_init( void )
{fsp_err_t err;uint32_t duty_cycle_counts = 80;// timer 1 GPT_IO_PIN_GTIOCAR_GPT_Open(&g_timer1_ctrl, &g_timer1_cfg);R_GPT_Start(&g_timer1_ctrl);/* Set the calculated duty cycle. */err = R_GPT_DutyCycleSet(&g_timer1_ctrl, duty_cycle_counts, GPT_IO_PIN_GTIOCA);assert(FSP_SUCCESS == err);// timer 2 GPT_IO_PIN_GTIOCBR_GPT_Open(&g_timer2_ctrl, &g_timer2_cfg);R_GPT_Start(&g_timer2_ctrl);err = R_GPT_DutyCycleSet( &g_timer2_ctrl, duty_cycle_counts,GPT_IO_PIN_GTIOCB);assert(FSP_SUCCESS == err);// timer 6 GPT_IO_PIN_GTIOCA & GPT_IO_PIN_GTIOCBR_GPT_Open(&g_timer3_ctrl, &g_timer3_cfg);R_GPT_Start(&g_timer3_ctrl);err = R_GPT_DutyCycleSet(&g_timer3_ctrl, duty_cycle_counts, GPT_IO_PIN_GTIOCA|GPT_IO_PIN_GTIOCB);
}/* End of this file */