跳到主要内容

15 AGT PWM输出实验

在这里插入图片描述

开发板官网https://www.edevkit.com/)

本系列教程目录:


AGT PWM输出实验

本章目标:

  • 了解 RA6M5 处理器的 AGT 外设;
  • 学会使用 RASC 配置 AGT 实现 PWM 输出;

硬件设计

(略,参见配套硬件原理图)

软件设计

新建工程

复制一份“07 SCI-UART_Recv_send”修改文件夹名“15 AGT_PWM_Output”,双击打开 EBF_RA6M5.uvprojx 工程,通过 Keil 的新建文件新建 agt_timer.cagt_timer.h,保存到目录下的 \src 文件夹下。

FSP 配置

Keil 界面选择“Tools”→“RA Smart Configurator”打开 RASC 界面。

PWM 输出需要使用 IO 引脚进行输出,需要先在“Pins”配置页中为 AGT 配置引脚,将 AGT6 的 AGTOA0 信号输出设置为 P500 引脚。

插图01

添加 AGT Stack 模块。

插图02

属性配置:

插图03

配置完成之后可以按下快捷键“Ctrl + S”保存,最后点击 “Generate Project Content” 按钮,让软件自动生成配置代码即可。

程序设计

实现 AGT 的 PWM 输出功能,开启 P500 通道的 PWM,设置输出的占空比,接入示波器查看波形占空比,改变占空比,观察波形变化。

  1. 打开 AGT 设备
R_AGT_Open(timer_ctrl_t * const p_ctrl, timer_cfg_t const * const p_cfg);

p_ctrltimer_ctrl_t 结构体指针参数,本质是一个 void 类型的参数,指向 st_gpt_instance_ctrl 类型变量;

p_cfgtimer_cfg_t 结构体指针参数,在程序中会指向在 hal_data.c 中定义的 g_timer_cfg 静态全局变量;

  1. 开启/停止 AGT 计数
R_AGT_Start(timer_ctrl_t * const p_ctrl);
R_AGT_Stop(timer_ctrl_t * const p_ctrl);

必须要在 AGT 打开状态下使用这两个函数。

  1. 设置 AGT 输出 PWM 的占空比
R_AGT_DutyCycleSet(timer_ctrl_t * const p_ctrl, uint32_t const duty_cycle_counts, uint32_t const pin);

在 PWM 驱动应用中,使用此函数来修改占空比,最后一个参数是指 AGT 的输出通道,而不是指 IO 引脚。

程序编写

agt_pwm.h 头文件里定义初始化函数,设置占空比函数。

#ifndef __BSP_AGT_PWM_OUTPUT_H
#define __BSP_AGT_PWM_OUTPUT_H
#include "hal_data.h"

void agt_PWM_Init(void);

void agt_PWM_SetDuty(uint8_t duty);

#endif

agt_pwm.c 里实现初始化函数、设置占空比函数。

初始化函数里打开 AGT 设备并启动定时器。

设置占空比输入 0~100 数值,先获取 AGT 的周期计时数,换算占空比的计数值,再设置输出占空比值。

#include "agt_pwm.h"

//PWM输出引脚 P500

// AGT初始化函数
void agt_PWM_Init(void)
{
// 初始化AGT模块
R_AGT_Open(&g_timer_agt0_ctrl, &g_timer_agt0_cfg);

// 启动定时器
R_AGT_Start(&g_timer_agt0_ctrl);

//设置占空比为 80%
agt_PWM_SetDuty(45);
}


//设置PWM占空比 0~100
void agt_PWM_SetDuty(uint8_t duty)
{
timer_info_t info;
uint32_t current_period_counts;
uint32_t duty_cycle_counts;

//限制占空比范围:0~100
if (duty > 100)
duty = 100;

//获得AGT的信息
R_AGT_InfoGet(&g_timer_agt0_ctrl, &info);

//获得计时器一个周期的计数值
current_period_counts = info.period_counts;

//根据占空比和一个周期的计数次数计算GTCCR寄存器的值
duty_cycle_counts = (uint32_t)(((uint64_t) current_period_counts * duty) / 100);

//设置占空比
R_AGT_DutyCycleSet(&g_timer_agt0_ctrl, duty_cycle_counts, AGT_OUTPUT_PIN_AGTOA);
}

hal_entry.c 文件中添加头文件 agt_pwm.h,在 hal_entry 入口函数初始化 AGT。

void hal_entry(void)
{
/* TODO: add your own code here */

led_Init();
uart0_Init();
agt_PWM_Init();

printf("start AGT PWM test\r\n");

while(1)
{
LED1_TOGGLE();
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒
}


#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}

下载验证

连接下载器,将程序编译并下载到开发板之后,按下复位按键来复位开发板,程序启动初始化完成后,观察实验结果。

通过示波器探头连接 P500 和 GND,观察示波器检测到方波,占空比 80%,频率 20 kHz。

插图04

修改占空比,设置为 45%,观察波形。

插图05