作者 | strongerHuang
微信公众号 | strongerHuang
PWM:Pulse Width Modulation,脉冲宽度调制。单片机实现PWM输出的方式有很多种,有通过IO延时翻转实现的,比如:while(1)
{
IO口高电平
Delay延时
IO口低电平
Delay延时
}
这种方法和前面给大家分享的文章【通过RA8单片机 SysTick 实现延时】有点类似,但这种方法缺陷也明显,占用CPU资源,也存在误差,特别是us级别误差更明显。定时器中断配置 ——> 启动定时器 ——> 响应中断,控制IO高低电平···
当然,本文通过,瑞萨RA8D1单片机通用 PWM 定时器(GPT,General PWM Timer)输出PWM波形,这样既避免了占用CPU资源,又避免了误差(精度相对很高)。下面手把手教大家基于e2 studio环境下,实现RA8单片机输出PWM的方法。https://github.com/renesas/fsp/releases我们这里基于Windows环境,安装exe文件,基本根据提示信息一路next即可。这里不再详述,推荐参看文章:瑞萨RA8系列教程 | 瑞萨 RA8 开发环境搭建我们这里以瑞萨RA8D1单片机为例(当然,其实RA系列单片机也类似):本文就瑞萨官方集成开发工具e2 studio,它是瑞萨单片机一站式编程工具,只需要动动鼠标点一点就能创建一个单片机工程。只需要动动鼠标“点一点”,一个完整的工程就创建好了。我们使用RA8D1单片机通用PWM定时器(General PWM Timer)GPT4,引脚P301输出PWM。配置时钟:GPT4使用 PCLKD 分频作为时钟源配置引脚:我们使用GPT4的P301作为PWM输出引脚。新建定时器模块:我们添加定时器模块并配置相关属性(配置常用参数,其实默认即可)。我们这里简单添加一个gpt4模块(源代码文件),如图:#include "bsp_gpt_pwm_output.h"
void GPT_PWM_Init(void)
{
R_GPT_Open(&g_timer_gpt4_ctrl, &g_timer_gpt4_cfg);
R_GPT_Start(&g_timer_gpt4_ctrl);
}
void GPT_PWM_SetDuty(uint8_t duty)
{
timer_info_t info;
uint32_t current_period_counts;
uint32_t duty_cycle_counts;
if (duty > 100)
duty = 100;
R_GPT_InfoGet(&g_timer_gpt4_ctrl, &info);
current_period_counts = info.period_counts;
duty_cycle_counts = (uint32_t)(((uint64_t) current_period_counts * duty) / 100);
R_GPT_DutyCycleSet(&g_timer_gpt4_ctrl, duty_cycle_counts, GPT_IO_PIN_GTIOCB);
}
#ifndef __BSP_GPT_PWM_OUTPUT_H
#define __BSP_GPT_PWM_OUTPUT_H
#include "hal_data.h"
void GPT_PWM_Init(void);
void GPT_PWM_SetDuty(uint8_t duty);
#endif
我们这里只有两个简单函数,在我们代码中添加 GPT_PWM_Init 即可实现(配置中的)200KHz,占空比80%的PWM波形输出。下图是我们配置200KHz,占空比80%的PWM波形:根据源码,你能发现,我们只需要初始化(配置好)PWM输出,后面就不会占用CPU资源。我们提供了一个简单的接口,修改占空比,如果需要根据需求修改占空比,我们调用一下接口即可。比如我们修改占空比为60%:当然,更多参数,我们可以根据自己情况封装函数接口。------------ END ------------●瑞萨RA8系列教程 | 初识瑞萨 RA8 系列单片机●瑞萨RA8系列教程 | 瑞萨 RA8 开发环境搭建●瑞萨RA8系列教程 | 基于 Keil 开发 RA8单片机●瑞萨RA8系列教程 | 基于e2s实现RA8串口输出配置关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。