系列文章目录
1.连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下
5.Keil配置使用(使用 RASC 生成 Keil 工程)
6.Keil配置使用(使用 RASC 生成 Keil 工程)
8.问题解决、学习RA寄存器、用寄存器的方式点亮第一个LED灯。
文章目录
前言
继上篇文章中讲的SysTick系统定时器,接着讲解GPT —— PWM通用定时器,学习GPT开始......
一、PWM是什么?
脉冲周期(T):单位是时间,如纳秒(ns)、微秒(us)、毫秒(ms)等。
脉冲频率(f):单位是赫兹(Hz)、千赫兹(KHz)等。频率与脉冲周期成倒数关系,f=1/T。
脉冲宽度(W):简称“脉宽”,一般指脉冲中高电平持续的时间。单位是时间。
占空比(D):脉宽除以脉冲周期的值。
PWM(Pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量、通信、工控等方面。
PWM的频率
是指在1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个周期,单位Hz。
PWM的周期
T=1/f,T是周期,f是频率。
如果频率为50Hz ,也就是说一个周期是20ms,那么一秒钟就有 50次PWM周期。
占空比
是一个脉冲周期内,高电平的时间与整个周期时间的比例,单位是% (0%-100%)
二、通用PWM定时器(GPT)
通用 PWM 定时器(GPT,General PWM Timer)是 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定时器(GPT)是一个具有GPT32×1通道的32位定时器和一个具有GPT16×6通道的16位定时器。PWM波形可以通过控制加计数器、减计数器或加减计数器来产生。
此外, 通用定时器(GPT)是一个具有GPT 32×1通道的32位定时器和一个具有GPT 16×6通道的16位定时器。脉宽调制波形可以通过控制加计数器、减计数器或加减计数器来产生此外,可以生成PWM波形来控制无刷直流电机。
GPT也可以用作通用定时器。 可以生成脉宽调制波形来控制无刷直流电机.GPT也可以用作通用定时器.
三、RA2E1 GPT框图
引脚功能:
道
引脚名称
I/O 方向
功能
共用
GTETRGx
Input
外部触发输入引脚 x (input through the POEG)
x: A ~ D
GPT32n
n: 0 ~ 3
GTIOCnA
Input/Output
GPT 的输入输出引脚 A
GTIOCnB
Input/Output
GPT 的输入输出引脚 B
GPT16m
m: 4 ~ 9
GTIOCnA
Output
GPT 的输入输出引脚 A
GTIOCnB
Output
GPT 的输入输出引脚 B
GPT_OPS
GTIU
Input
霍尔传感器 U 相输入
GTIV
Input
霍尔传感器 V 相输入
GTIW
Input
霍尔传感器 W 相输入
GTOUUP
Output
BLDC 电机控制三相PWM输出(U相上桥臂)
GTOULO
Output
BLDC 电机控制三相PWM输出(U相下桥臂)
GTOUUP
Output
BLDC 电机控制三相PWM输出(V相上桥臂)
GTOULO
Output
BLDC 电机控制三相PWM输出(V相下桥臂)
GTOUUP
Output
BLDC 电机控制三相PWM输出(W相上桥臂)
GTOULO
Output
BLDC 电机控制三相PWM输出(W相下桥臂)
引脚功能参数:
参数 | 描述 |
---|---|
功能 |
|
计数时钟源 |
|
中断源(9个源) |
|
四、pwm输出模式
PWM 输出就是对外输出脉宽(即占空比)可调的方波信号, 信号频率由周期设定寄存器 GTPR 的值决定,占空比由比较寄存器 GTCCR 的值决定。
GPT 的输出模式有:
-
锯齿波 PWM 模式(Saw-wave PWM mode)(该模式下单缓冲或双缓冲都可使用)
-
锯齿波单脉冲模式(Saw-wave one-shot pulse mode)(该模式下使用固定的缓冲操作)
-
三角波 PWM 模式1(Triangle-wave PWM mode 1)(波谷32位传输)(该模式下单缓冲或双缓冲都可使用)
-
三角波 PWM 模式2(Triangle-wave PWM mode 2)(波峰和波谷32位传输)(该模式下单缓冲或双缓冲都可使用)
-
三角波 PWM 模式3(Triangle-wave PWM mode 3)(波谷64位传输)(该模式下使用固定的缓冲操作)
五、实操:GPT定时器 定时2s LED闪烁
1.新建工程
2.FSP配置
打开 FSP 配置界面,在 Stacks 中加入 GPT:
设置 属性:(如图只是解释 每个功能的作用)
“Common”部分:
属性 | 描述 |
---|---|
Parameter Checking | 参数检查(选择是否生成包含参数检查的代码)。 |
Pin Output Support | 支持引脚输出。 “Enabled”或“Disabled” 用于使能或禁止 GTIOCx 输出PWM信号。 “Enabled with Extra Features” 用于支持三角波输出模式, 以及用于支持“Extra Features”部分的特性。 |
Write Protect Enabled | GPT寄存器的写保护。选择使能/禁止写保护并应用于所有GPT通道。 若使能了这一项,则无法对GPT寄存器进行写操作,需要使用 r_gpt_write_protect_disable() 函数取消写保护,才能写入寄存器。 |
Clock Source | 时钟源选择。 RA6M5 的GPT只能选择 PCLKD 作为内部时钟源。 |
“General”部分:
属性 | 描述 |
---|---|
Name | 模块名字。 |
Channel | 通道选择。指定硬件通道,也就是指定使用哪一个GPT定时器。 |
Mode | 可以选择周期计数,单次计数,PWM模式,三角波对称PWM模式和三角波不对称PWM模式。 Periodic One-Shot PWM One-Shot Pulse Triangle-Wave Symmetric PWM Triangle-Wave Asymmetric PWM Triangle-Wave Asymmetric PWM (Mode 3) |
Period | 计数器的计数周期。 |
Period Unit | 计数器计数周期的单位。 |
“Interrupts”部分:
属性 | 描述 |
---|---|
Callback | 中断回调函数名。 |
Overflow/Crest Interrupts Priority | 选择上溢中断的优先级。如果选择 Disabled 则禁止该中断。 该中断亦是三角波的波峰中断。 |
Capture A Interrupts Priority | 选择捕获A中断的优先级。如果选择 Disabled 则禁止该中断。 |
Capture B Interrupts Priority | 选择捕获B中断的优先级。如果选择 Disabled 则禁止该中断。 |
Underflow/Trough Interrupts Priority | 选择下溢中断的优先级。如果选择 Disabled 则禁止该中断。 该中断亦是三角波的波谷中断。 |
“Extra Features”部分:
属性 | 描述 |
---|---|
Output Disable > Output Disable POEG Trigger | 选择一个信号触发禁用 POEG。 |
Output Disable > POEG Link | 选择哪一个 POEG 连接到该 GPT 通道。 |
Output Disable > GTIOCA Disable Setting | GTIOCA 的禁用设定。 |
Output Disable > GTIOCB Disable Setting | GTIOCB 的禁用设定。 |
ADC Trigger > Start Event Trigger (Channels with GTINTAD only) | 选择触发 ADC 转换的时机 |
Dead Time > Dead Time Count Up (Raw Counts) | 选择死区时间(应用到向上计数) |
Dead Time > Dead Time Count Down (Raw Counts) (Channels with GTDVD only) | 选择死区时间(应用到向下计数) |
ADC Trigger (Channels with GTADTRA only) > ADC A Compare Match (Raw Counts) | 设置生成 GPTn AD TRIG A 事件的比较匹配值。 |
ADC Trigger (Channels with GTADTRB only) > ADC B Compare Match (Raw Counts) | 设置生成 GPTn AD TRIG B 事件的比较匹配值。 |
Interrupt Skipping (Channels with GTITC only) > Interrupt to Count | 选择跳过中断的计数源。中断跳过计数器在每个源事件之后递增。 当中断跳过计数器非零时,将跳过所有顶部/溢出中断和槽/底部中断。 |
Interrupt Skipping (Channels with GTITC only) > Interrupt Skip Count | 选择要跳过的中断数。 |
Interrupt Skipping (Channels with GTITC only) > Skip ADC Events | 当中断跳过计数不为零时,选择要禁止的 ADC 事件。 |
Extra Features | 选择是否使能该通道的“Extra Features”(额外特性) |
工程正确设置:
实操代码:
/* GPT 初始化函数 */
void GPT_Timing_Init(void)
{
/* 初始化 GPT0 模块 */
R_GPT_Open(&g_timer_gpt0_ctrl, &g_timer_gpt0_cfg);
/* 启动 GPT0 定时器 */
R_GPT_Start(&g_timer_gpt0_ctrl);
}
/* GPT 中断回调函数 */
void gpt0_timing_callback(timer_callback_args_t * p_args)
{
/* 定时器溢出事件 */
if (TIMER_EVENT_CYCLE_END == p_args->event)
{
/* 翻转 LED1 */
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_HIGH); //LED1
}
else
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_LOW); //LED1亮
}
/*******************************************************************************************************************//**
* 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) //相当于主函数 函数最终执行的地方
{
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_LOW); //LED1亮
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_LOW); //LED1亮
R_BSP_PinAccessEnable (); //启用对PFS寄存器的访问,因为后面写IO口都用BSP内联函数
SysTick_Init(1000);//初始化系统时钟
GPT_Timing_Init(); // GPT 初始化
while(1){
}
/* TODO: add your own code here */
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
视频效果:
如上一篇文章 SysTick系统定时器 是同等效果。大家可以自行翻阅一下效果。
中断回调函数非常地简单,直接在回调函数里面使用 if 语句判断触发中断的事件是否是定时器溢出事件, 若是定时器溢出事件则翻转一次 LED1 引脚的电平。 由于定时器被我们配置为1秒的计时周期,因此每2秒会溢出一次,控制 LED1 的引脚的电平会每秒钟翻转一次。
总结
通用PWM定时器(GPT)是一个具有GPT32×1通道的32位定时器和一个具有GPT16×6通道的16位定时器。PWM波形可以通过控制加计数器、减计数器或加减计数器来产生。
此外, 通用定时器(GPT)是一个具有GPT 32×1通道的32位定时器和一个具有GPT 16×6通道的16位定时器。脉宽调制波形可以通过控制加计数器、减计数器或加减计数器来产生此外,可以生成PWM波形来控制无刷直流电机。