PWM:Pulse Width Modulation,脉冲宽度调制。
单片机实现PWM输出的方式有很多种,有通过IO延时翻转实现的,比如:
左右滑动查看完整内容
while(1) { IO口高电平 Delay延时 IO口低电平 Delay延时 }
也有通过定时器中断控制IO高低电平输出实现的。
定时器中断配置——>启动定时器——>响应中断,控制IO高低电平
当然,本文通过,瑞萨RA8D1单片机通用PWM定时器(GPT,General PWM Timer)输出PWM波形,这样既避免了占用CPU资源,又避免了误差(精度相对很高)。
下面手把手教大家基于e2 studio环境下,实现RA8单片机输出PWM的方法。
准备工作
01下载并安装e2 studio工具
下载地址,推荐瑞萨官方的GitHub:
e2 studio工具
https://github.com/renesas/fsp/releases
我们这里基于Windows环境,安装exe文件,基本根据提示信息一路next即可。这里不再详述。
02准备RA8D1开发板
我们这里以瑞萨RA8D1单片机为例:
(当然,其实RA系列单片机也类似)
RA8单片机PWM输出方法
本文就瑞萨官方集成开发工具e2 studio,它是瑞萨单片机一站式编程工具,只需要动动鼠标点一点就能创建一个单片机工程。
01打开e2 studio创建PWM项目
我们命名项目名称为:RA8D1_PWM
选择对应芯片型号:R7FA8D1BEC
只需要动动鼠标“点一点”,一个完整的工程就创建好了。
02配置工程
我们使用RA8D1单片机通用PWM定时器(General PWM Timer)GPT4,引脚P301输出PWM。
这里配置时钟、添加GPT模块以相关配置。
配置时钟:
GPT4使用PCLKD分频作为时钟源
配置引脚:
我们使用GPT4的P301作为PWM输出引脚。
新建定时器模块:
我们添加定时器模块并配置相关属性(配置常用参数,其实默认即可)。
03添加源代码
我们这里简单添加一个gpt4模块(源代码文件),如图:
bsp_gpt_pwm_output.c源代码:
左右滑动查看完整内容
#include "bsp_gpt_pwm_output.h" /* GPT初始化函数 */ void GPT_PWM_Init(void) { /* 初始化 GPT 模块 */ R_GPT_Open(&g_timer_gpt4_ctrl, &g_timer_gpt4_cfg); /* 启动 GPT 定时器 */ R_GPT_Start(&g_timer_gpt4_ctrl); } /** 设置PWM占空比 @param duty 占空比范围:0~100 % */ 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; //限制占空比范围:0~100 /* 获得GPT的信息 */ R_GPT_InfoGet(&g_timer_gpt4_ctrl, &info); /* 获得计时器一个周期需要的计数次数 */ current_period_counts = info.period_counts; /* 根据占空比和一个周期的计数次数计算GTCCR寄存器的值 */ duty_cycle_counts = (uint32_t)(((uint64_t) current_period_counts * duty) / 100); /* 最后调用FSP库函数设置占空比 */ R_GPT_DutyCycleSet(&g_timer_gpt4_ctrl, duty_cycle_counts, GPT_IO_PIN_GTIOCB); }
bsp_gpt_pwm_output.h头代码:
左右滑动查看完整内容
#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波形输出。
04演示效果
下图是我们配置200KHz,占空比80%的PWM波形:
根据源码,你能发现,我们只需要初始化(配置好)PWM输出,后面就不会占用CPU资源。
我们提供了一个简单的接口,修改占空比,如果需要根据需求修改占空比,我们调用一下接口即可。比如我们修改占空比为60%:
当然,更多参数,我们可以根据自己情况封装函数接口。
全部0条评论
快来发表一下你的评论吧 !