27.7
实验2:PWM输出
27.7.1
硬件设计
本次实验需要使用到LED灯来展示定时的效果,LED灯具体的电路讲解请读者参考本教程:8.4.实验:使用寄存器点亮LED灯。
注
本实验仅用到LED1~3当中的其中一盏。
野火启明6M5开发板例程使用的PWM输出引脚为额外引出的IO引脚:P600,如下图所示。

注
野火启明6M5开发板例程使用的PWM输出引脚为额外引出的IO引脚:P600(GTIOC6B)。
野火启明4M2开发板例程使用的PWM输出引脚为额外引出的IO引脚:P405(GTIOC1A)。
野火启明2L1开发板例程使用的PWM输出引脚为额外引出的IO引脚:P115(GTIOC4A)。
27.7.2
软件设计
27.7.2.1
新建工程
由于本实验需要用到LED,也会用到串口打印提示信息,因此我们在前面串口通信章节的“实验1:UART收发回显”例程的基础上修改程序。
对于e2studio开发环境:拷贝一份我们之前的e2s工程“19_UART_Receive_Send”,然后将工程文件夹重命名为“27_GPT_PWM_Output”,最后再将它导入到我们的e2studio工作空间中。
对于Keil开发环境:拷贝一份我们之前的Keil工程“19_UART_Receive_Send”,然后将工程文件夹重命名为“27_GPT_PWM_Output”,并进入该文件夹里面双击Keil工程文件,打开该工程。
工程新建好之后,在工程根目录的“src”文件夹下面新建“gpt”文件夹,再进入“gpt”文件夹里面新建源文件和头文件:“bsp_gpt_pwm_output.c”和“bsp_gpt_pwm_output.h”。工程文件结构如下。
列表5:文件结构
左右滑动查看完整内容
27_GPT_PWM_Output ├─ ...... └─src ├─ led │ ├─ bsp_led.c │ └─ bsp_led.h ├─ debug_uart │ ├─ bsp_debug_uart.c │ └─ bsp_debug_uart.h ├─ gpt │ ├─ bsp_gpt_pwm_output.c │ └─ bsp_gpt_pwm_output.h └─ hal_entry.c
27.7.2.2
FSP配置
下面以野火启明6M5开发板为例来讲解相关的FSP配置。
因为PWM输出需要使用IO引脚进行输出,因此需要先在“Pins”配置页中为GPT配置引脚,我们将GPT6的GTIOC6B信号输出连接到P600引脚,如下图所示。

然后在“Stacks”配置页中加入GPT模块,并对其作如下图所示的配置。

上图中框起来的部分是需要我们去修改的区域,其他的配置属性按照默认即可。图中需要更改的配置如下:
Pin Output Support:这一项配置允许输出PWM信号到引脚,我们改为使能引脚输出。
Name和Channel:这两项分别设置GPT模块名字为“g_timer_gpt6”和选择第6个GPT定时器(第6个通道)。
Mode:配置GPT的工作模式为PWM输出模式。
Period和Period Unit:我们将PWM频率设为20KHz,因此“Period”设置为20,单位“Period Unit”设置为Kilohertz,即千赫兹(KHz)。
GTIOCB Output Enabled:使能GTIOCB输出。
GTIOCB Stop Level:设置定时器停止时GTIOCB输出的电平为低电平。
GTIOC6B:选择连接到P600引脚,这个软件会自动设置的,我们只要确认了就好。
GPT的“Output”部分的属性描述如下表所示。
表6:GPT属性描述:“Output“部分

点击可查看大图
27.7.2.3
GPT初始化函数
列表6:GPT初始化函数
左右滑动查看完整内容
voidGPT_PWM_Init(void)
{
/* 初始化GPT 模块*/
R_GPT_Open(&g_timer_gpt6_ctrl, &g_timer_gpt6_cfg);
/* 启动GPT 定时器*/
R_GPT_Start(&g_timer_gpt6_ctrl);
/* 重新设置占空比为80% */
GPT_PWM_SetDuty(80);
}
27.7.2.4
设置PWM占空比函数
列表7:设置PWM占空比函数
左右滑动查看完整内容
/** 自定义函数:设置PWM 占空比 @param duty 占空比范围:0~100 % */ voidGPT_PWM_SetDuty(uint8_tduty) { timer_info_tinfo; uint32_tcurrent_period_counts; uint32_tduty_cycle_counts; if(duty >100) duty =100;//限制占空比范围:0~100 /* 获得GPT 的信息*/ R_GPT_InfoGet(&g_timer_gpt6_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_gpt6_ctrl, duty_cycle_counts, GPT_IO_PIN_ ,→GTIOCB); }
27.7.2.5
hal_entry入口函数
列表8:hal_entry入口函数
左右滑动查看完整内容
/* 用户头文件包含*/
#include"led/bsp_led.h"
#include"debug_uart/bsp_debug_uart.h"
#include"gpt/bsp_gpt_pwm_output.h"
voidhal_entry(void)
{
/*TODO:add your own code here *//* TODO: 在这里添加你自己的代码 */
LED_Init();// LED 初始化
Debug_UART4_Init();// SCI4 UART 调试串口初始化
GPT_PWM_Init();// GPT 初始化
printf("这是一个GPT 的PWM 输出功能实验
");
printf("使用示波器测量P600 输出的PWM 波形
");
// LED1 闪烁指示程序正在运行...
while(1)
{
LED1_ON;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
LED1_OFF;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
}
#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
27.7.3
下载验证
以野火启明6M5开发板为例,编译并下载程序后,复位开发板使程序重新运行,然后使用示波器测量P600引脚输出的PWM波形。实现现象如下。
频率20KHz,占空比为50%的PWM波形:

频率20KHz,占空比为80%的PWM波形:

小技巧
人眼对于每11毫秒闪烁一次(约83赫兹)基本感觉不到闪烁,每13毫秒闪烁一次(约66赫兹)感觉到轻微频闪。那么我们平时见到的LED灯,当它的频率大于50Hz的时候,人眼就会产生视觉暂留效果,基本就看不到闪烁了,而是一个常亮的LED灯。因此,我们可以通过PWM让LED高频闪烁,并控制PWM占空比实现LED的亮度变化,通过这个原理可以实现呼吸灯的效果,感兴趣的读者可自行尝试去实现它。
-
led
+关注
关注
244文章
24718浏览量
692439 -
PWM
+关注
关注
116文章
5894浏览量
226549 -
引脚
+关注
关注
16文章
2120浏览量
56009 -
开发板
+关注
关注
26文章
6418浏览量
120759
原文标题:实验2:PWM输出——瑞萨RA系列FSP库开发实战指南(100)
文章出处:【微信号:瑞萨嵌入式小百科,微信公众号:瑞萨嵌入式小百科】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
瑞萨RA系列FSP库开发实战指南之GPT比较匹配功能及输入捕获功能详解
瑞萨RA系列FSP库开发实战指南之使用GPT进行PWM输出实验
评论