前言
本文是关于PWM(脉冲宽度调制)在RA-Eco-RA2L1-48PIN-V1.0开发板上的应用。本文将会从PWM是什么,怎么用来入手,帮助大家理解PWM。
一、PWM是什么
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称 脉宽调制 ,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
在瑞萨RA系列MCU中有两种定时器,一种是通用PWM定时器GPT,另外一种是异步通用定时器AGT。
1.GPT的特点
1、32位定时器,共有4个通道(GPT32,编号为0-3)
2、16位定时器,共有6个通道(GPT16,编号4-9)
3、支持三种计数模式(上计数模式、下计数模式、上下计数模式)
4、每个通道都可以独立选择时钟源
5、每个通道都有两个输入\输出引脚
6、每个通道都有两个输出比较\输入捕获寄存器
7、对于每个通道的两个输出比较\输入捕获寄存器,都提供了四个缓冲寄存器,并且当其不作为缓冲使用时能够当作比较寄存器来使用。
8、在输出比较模式下,GPT定时器支持缓冲寄存器切换功能,并且切换的时机可以选择在波形的峰值或者波谷发生。这就使得可以生成左右不对称的PWM波形。
9、每个通道都有寄存器用于设置帧周期,并能在计数器溢出或者下溢时生成中断。
10、可以在PWM操作中生成死区时间。
11、可以同步启动、停止和清除任意通道的计数器。
12、计数器可以根据最多4个ELC(Event Link Controller)事件来启动、停止、清零、向上计数、向下计数或进行输入捕获操作。ELC事件是外部或者内部触发的事件,可以触发计数器的不同操作。
13、计数器可以根据两个输入引脚的状态来启动、停止、清零、向上计数、向下计数或进行输入捕获操作。输入引脚的状态变化直接影响计数器的行为。
14、计数器可以根据最多两个外部触发信号来启动、停止、清零、向上计数、向下计数或进行输入捕获操作。外部触发信号可以是来自其他硬件模块的信号。
15、当检测到输出引脚之间的短路时,可以禁用输出引脚。这是一种保护机制,防止因为短路导致的硬件损坏。
16、可以生成用于控制无刷直流电机(BLDC)的PWM波形。
17、比较匹配到A-D事件、溢出/下溢事件以及输入UVW边沿事件可以输出到ELC。这些事件可以用于触发其他模块的操作。
18、可以为输入捕获和输入UVW信号启用噪声滤波器。噪声滤波器可以消除输入信号中的噪声,确保信号的准确性。
19、总线时钟(Bus clock)使用PCLKB,核心时钟(Core clock)使用PCLKD。PCLKB和PCLKD是微控制器中的时钟信号,分别用于总线和核心的时钟同步。
2.GPT功能
参数 |
描述 |
---|
Count clock |
定时器的计数时钟源,包括:PCLKD, PCLKD/4, PCLKD/16, PCLKD/64, PCLKD/256, PCLKD/1024 |
Output compare/Input capture registers(GTCCR) |
比较/捕获寄存器,用于输出比较或输入捕获操作,分为GTCCRA和GTCCRB两个寄存器 |
Compare/Buffer registers |
比较寄存器/缓冲区,包括:GTCCRC,GTCCRD,GTCCRE,GTCCRF |
Cycle setting registers |
周期设置寄存器:GTPR,用于设置定时器的计数周期(PWM的频率) |
Cycle setting buffer register |
周期设置缓冲寄存器:GTPBR,用于更新计数周期时的缓冲处理 |
I/O pins |
I/O引脚:GTIOnA和GTIOnB,n为0-9 |
External trigger input pin |
外部触发输入引脚:GTETRGA和GTETRGB,用于触发定时器的外部信号输入 |
Counter clear source |
计数器清除的触发源,包括:GTPR寄存器比较匹配、输入捕获事件、引脚输入状态、ELC事件、GTETRGn (n = A, B) 引脚输入 |
Compare match output |
比较匹配的输出模式,包括:低电平输出、高电平输出、翻转输出 |
Input captue function |
支持输入捕获功能,用于记录外部信号事件的发生时间 |
Automatic addition of dead tiome |
自动插入死区时间功能,可用于避免H桥驱动中的直通短路情况(无死区缓冲功能) |
PWM mode |
支持PWM模式,生成占空比可控的PWM信号 |
Phase count function |
支持相位计数功能,适用于旋转编码器等应用 |
Buffer operation |
支持双缓冲操作,允许在不中断信号输出的情况下更新寄存器值 |
One-shot operation |
支持单次运行模式,可在触发后完成一个周期的定时或PWM输出 |
DTC activation |
支持数据传输控制器(DTC)激活,适用于多种中断事件 |
Brushless DC motor control function |
支持无刷直流电机控制功能 |
Interrupt sources |
提供六种中断源 |
3.GPT框图


二、代码实现
示例:选择排序(selection sort)是一种简单直观的排序算法,首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
1.e2配置

首先配置时钟源PCLKD为48MHz

将P103引脚配置为GPT2(GTIOC2A)


定时器配置
PWM中
频率 = 主频 / period
+占空比 = cycle / period
2.hal_entry()中代码如下
voidhal_entry(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);
assert(FSP_SUCCESS == err);
(void) R_GPT_Start(&g_timer0_ctrl);
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);
err = R_GPT_PeriodSet(&g_timer0_ctrl, 4800);
assert(FSP_SUCCESS == err);
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);
uint32_t duty_cycle = 0;
int8_t direction = 1;
while(1)
{
err = R_GPT_DutyCycleSet(&g_timer0_ctrl, duty_cycle, GPT_IO_PIN_GTIOCA);
assert(FSP_SUCCESS == err);
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);
duty_cycle += direction * 100;
if (duty_cycle >= 4800)
{
duty_cycle = 4800;
direction = -1;
}
elseif(duty_cycle <= 0)
{
duty_cycle = 0;
direction = 1;
}
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);
}