当前位置: 首页 > news >正文

RA4M2开发涂鸦模块CBU(3)----定时器GPT-PWM调光

RA4M2开发涂鸦模块CBU.3--定时器GPT-PWM调光

  • 概述
  • 视频教学
  • 样品申请
  • 硬件准备
  • 参考程序
  • 选择计时器
  • GPIO口配置
  • GPT定时器
  • GPT定时器属性配置
  • 初始化GPT
  • 启动GPT PWM模块
  • 时钟源
  • PWM(脉冲宽度调制)
  • R_GPT_PeriodSet()函数说明
  • R_GPT_DutyCycleSet()函数说明
  • 呼吸效果

概述

本实验基于 Renesas RA4M2 的 GPT(General PWM Timer) 外设,通过改变 PWM 占空比来调节 LED 亮度,实现软硬件结合的“无级调光”。

最近在瑞萨RA的课程,需要样片的可以加qun申请:925643491。

在这里插入图片描述

视频教学

https://www.bilibili.com/video/BV1mFMHz3EcM

RA4M2开发涂鸦模块CBU(3)----定时器GPT-PWM调光

样品申请

https://www.wjx.top/vm/rCrkUrz.aspx

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为R7FA4M2AD3CFL#AA0

在这里插入图片描述

参考程序

https://github.com/CoreMaker-lab/RA4M2_TUYA_CBU

https://gitee.com/CoreMaker/RA4M2_TUYA_CBU

选择计时器

RA MCU 有两个定时器外设:通用 PWM 定时器 (GPT) 和异步通用定时器 (AGT)。

在这里插入图片描述

GPIO口配置

由下图我们可以得知,板子上有3个LED灯,P103可以配置为PWM端口进行调光。

在这里插入图片描述
在这里插入图片描述

GPT定时器

操作 “New Stack > Timers >Timer, General PWM (r_gpt)” 在项目中添加GPT定时器的多通道操作功能,特别是用于生成PWM信号或单次脉冲信号。

在这里插入图片描述

GPT定时器属性配置

● Pin Output Support:设为 Enabled,允许 PWM 信号输出到外部引脚。
● Name:设置为 g_timer2,这是模块的唯一标识符,用于代码中引用此定时器实例。
● Channel:设定为 2,表示该定时器使用通道 2 进行计数和控制。
● Mode:设为 Periodic,表示该定时器工作在周期模式,将在设定周期内重复运行。
● Period:周期值设置为 1,即每个完整计数周期的时间间隔。
● Period Unit:单位选择为 Kilohertz(千赫兹),表示输出信号的频率为 1 kHz。

● Duty Cycle Percent:设置为 50%,表示 PWM 输出信号的高电平时间占周期的 50%。
● GTIOCA Output Enabled:设置为 True,启用 GTIOCA(P103)引脚的输出功能。
● GTIOCA Stop Level:设为 Pin Level Low,表示定时器停止时 GTIOCA 输出低电平。

GTIOCA & GTIOCB 输出: 同时启用了 GTIOCA(P103) 两个引脚进行 PWM 输出。

在这里插入图片描述

初始化GPT

R_GPT_Open() 函数用于初始化通用PWM定时器(GPT)模块,并应用相应的配置。它的主要作用是启动定时器,使其按照设定的模式工作,例如周期模式(Periodic Mode)或PWM模式(Pulse Width Modulation Mode)。

在这里插入图片描述

    /* Initializes the module. */err = R_GPT_Open(&g_timer2_ctrl, &g_timer2_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);

启动GPT PWM模块

R_GPT_Start() 用于启动GPT(General PWM Timer)定时器,使其开始按照之前的配置运行。
必须先调用 R_GPT_Open(),否则 R_GPT_Start() 会返回 FSP_ERR_NOT_OPEN 错误。
在PWM模式下,启动定时器后会按照设定的周期和占空比输出PWM波形。

在这里插入图片描述

    /* Start the timer. */(void) R_GPT_Start(&g_timer2_ctrl);   

时钟源

GPT 使用 PCLKD(外设时钟D) 作为主时钟源。该时钟可以通过 可配置的分频器 进行调整,最大分频因子为 1024。

在这里插入图片描述

● 主 PLL
● XTAL 12 MHz → ÷2 → ×30 = 180 MHz
● PCLKD 分频
● 在 Clocks 视图中将 PCLKD 选为 Div/2,于是
● PCLKD = 180 MHz ÷ 2 = 90 MHz

在这里插入图片描述

PWM(脉冲宽度调制)

脉冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
在瑞萨RA系列MCU中有两种定时器,一种是通用PWM定时器GPT,另外一种是异步通用定时器AGT。
频率=主频/period
+占空比=cycle/period

下图中展示的 PWM 输出信号,在周期开始时为高电平,周期结束时为低电平。通过调整占空比(duty cycle)和周期(timer period),可以调节 PWM 信号的行为。
● duty_cycle_counts:表示占空比部分的持续时间。占空比决定了信号高电平的时间比例。
● timer_period_counts:这是一个周期的时间,单位是 PCLKD 计数(即时钟频率的周期数)。

在这里插入图片描述

更新周期和占空比:周期和占空比在下次定时器溢出后会更新,更新由 R_GPT_PeriodSet() 或 R_GPT_DutyCycleSet() 函数触发。如果需要在下次溢出之前强制更新这些值,可以调用 R_GPT_Reset(),这样定时器会被重置并开始计数。
在这里插入图片描述

R_GPT_PeriodSet()函数说明

R_GPT_PeriodSet 该函数用于设置定时器的周期值。若定时器正在运行,则在下次溢出时更新周期;如果定时器已停止,该函数将重置计数器并更新周期。

在这里插入图片描述

频率=时钟源/period,若设置频率为10K,则period=90M/10K=9000

    err = R_GPT_PeriodSet(&g_timer2_ctrl, 9000);//频率assert(FSP_SUCCESS == err);

完整的函数定义如下所示。

/** @brief PWM 呼吸灯当前占空比计数(0-1000) */
static uint32_t s_pwm_count = 0;
/** @brief PWM 呼吸灯占空比变化方向:true=递增,false=递减 */
static bool s_pwm_increasing = true;/*** @brief 初始化 GPT2 作为 PWM 呼吸灯** 配置定时器周期、启动并默认占空比 0。* @return FSP_SUCCESS 成功,否则返回错误码*/
static fsp_err_t pwm_breathe_init(void)
{fsp_err_t err = R_GPT_Open(&g_timer2_ctrl, &g_timer2_cfg);if (FSP_SUCCESS != err) return err;err = R_GPT_PeriodSet(&g_timer2_ctrl, 9000);if (FSP_SUCCESS != err) return err;/* 启动定时器产生 PWM */err = R_GPT_Start(&g_timer2_ctrl);if (FSP_SUCCESS != err) return err;/* 初始占空比设置为 0(熄灭) */return R_GPT_DutyCycleSet(&g_timer2_ctrl, 0, GPT_IO_PIN_GTIOCA);
}

在这里插入图片描述

在主程序中添加初始化。

    /* 初始化 PWM 呼吸灯 */err = pwm_breathe_init();assert(FSP_SUCCESS == err);

在这里插入图片描述

R_GPT_DutyCycleSet()函数说明

R_GPT_DutyCycleSet 此函数用于设置请求引脚的占空比。占空比在缓冲寄存器中更新,更新后的占空比将在下一个计数溢出时反映出来。

在这里插入图片描述

+占空比=cycle/period,若设置GTIOCA-占空比为25%,所以+占空比为75%,则cycle= -占空比* period=25%*9000=2250

   err = R_GPT_DutyCycleSet(&g_timer2_ctrl, 2250, GPT_IO_PIN_GTIOCA);//占空比assert(FSP_SUCCESS == err);

更新 PWM 占空比实现呼吸效果代码如下。
利用 RA4M2 的 GPT2 定时器产生 PWM,按 1 ms 步进在 0 ~ 100 % 占空比之间往返,实现 LED 的“呼吸”渐亮渐灭。

/*** @brief 更新 PWM 占空比实现呼吸效果** 根据当前计数和方向计算新占空比并写入 GPT。*/
static void pwm_breathe_update(void)
{/* 调整占空比计数 */if (s_pwm_increasing){s_pwm_count++;if (s_pwm_count >= 1000){s_pwm_count = 1000;s_pwm_increasing = false;}}else{s_pwm_count--;if (s_pwm_count == 0){s_pwm_increasing = true;}}/* 设置新的比较值:周期 9000 -> 1% = 90 */(void)R_GPT_DutyCycleSet(&g_timer2_ctrl,s_pwm_count * 9,GPT_IO_PIN_GTIOCA);
}

在这里插入图片描述

呼吸效果

利用 RA4M2 的 GPT2 定时器产生 PWM,按 1 ms 步进在 0 ~ 100 % 占空比之间往返,实现 LED 的“呼吸”渐亮渐灭。

    /* 主循环:更新 LED 状态与呼吸效果 */while (true){led_update();             /* 切换普通 LED */pwm_breathe_update();     /* 呼吸灯效果 */R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);}

在这里插入图片描述

相关文章:

  • 【软考高级系统架构论文】论企业集成平台的理解与应用
  • Springfox使用详解
  • CPU Cache 的映射与寻址
  • Vue+spring boot前后端分离项目搭建---小白入门
  • Qt + C++ 入门2(界面的知识点)
  • UML:状态图介绍与绘制
  • 【FineDance】舞蹈多样性的得来
  • 通过 Lambda + API Gateway + 外部 API 实现。
  • 在 MyBatis 的xml中,什么时候大于号和小于号可以不用转义
  • 使用Node.js开发服务端接口
  • quartz 表达式最近10次执行时间接口编写
  • 【设计模式】3.装饰模式
  • leetcode332.重新安排行程:优先队列与DFS实现欧拉路径的行程规划
  • AIGC工具平台-SadTalker音频对口型数字人
  • Linux 内核中 TCP 协议栈的输出实现:tcp_output.c 文件解析
  • 2D曲线点云平滑去噪
  • (LeetCode 面试经典 150 题) 169. 多数元素(哈希表 || 二分查找)
  • python基础(while...else)
  • 手撕lru
  • MinIO入门教程:从零开始搭建方便快捷的分布式对象存储服务
  • 动画制作大师/排名seo怎么样
  • 网上推广平台怎么收费/班级优化大师手机版下载
  • asp网站免费完整源码/网络营销五个主要手段
  • 企业门户网站管理办法/今天特大新闻最新消息
  • 宣传片拍摄清单/seo从入门到精通
  • 河北外贸网站建设/湖南seo快速排名