5.1 原理圖分析
查看EK-RA6M4的原理圖,如下圖所示,該開發(fā)板上有3個Led指示燈。

另外,這三個Led燈所使用的GPIO引腳可以作為定時器的PWM輸出使用,其定義如下:
| Led燈 | LED3 | LED2 | LED1 |
|---|---|---|---|
| 顏色 | 紅色 | 綠色 | 藍色 |
| 引腳 | P400 | P404 | P415 |
| 定時器 | GPT6(GTIOC6A) | GPT3(GTIOC3B) | GPT0(GTIOC0A) |
在該例程中,我們將通過定時器PWM控制:
- 藍色Led將作為心跳燈使用(每隔3.4s,快閃2次200ms);
- 綠色Led將作為呼吸燈使用(100%~0%占空比);
5.2 PWM配置
首先,在FSP配置中將 BlueLed 和 GreenLed 所用的兩個GPIO口配置成PWM輸出模式。


接著選擇 Stacks ,點擊 "New Stack" -> "Timers" -> "Timer, General PWM(r_gpt)" 添加兩個Timer PWM協議棧。

接下來設置 PWM 的相關配置,并重新生成代碼。


- 在綠色的Led配置中,我們設置定時器的頻率為10ms,并設置占空比為100%。接下來將會在主函數的循環(huán)里修改它的占空比,這樣燈的亮度將由強到弱,再由弱到強;
- 在藍色的Led配置中,我們設置定時器端的頻率為400ms,并設置占空比為50%(高電平200ms)。接下來我們將會在其中斷回調函數中來調整它的頻率,讓它快閃2下之后再滅掉。
5.3 源碼修改
創(chuàng)建PWM定時器操作相關的頭文件 src/bsp_pwm.h 如下。
#ifndef BSP_PWM_H_
#define BSP_PWM_H_
fsp_err_t pwm_init(void);
#endif /* BSP_PWM_H_ */
創(chuàng)建PWM定時器操作相關的c文件 src/bsp_pwm.c 如下。
#include
#include "bsp_api.h"
#include "hal_data.h"
#include "bsp_pwm.h"
#include "bsp_led.h"
fsp_err_t pwm_init(void)
{
fsp_err_t fsp_err = FSP_SUCCESS;
fsp_err = R_GPT_Open(&g_pwm_ledgreen_ctrl, &g_pwm_ledgreen_cfg);
if(FSP_SUCCESS != fsp_err)
return fsp_err;
fsp_err = R_GPT_Start(&g_pwm_ledgreen_ctrl);
if(FSP_SUCCESS != fsp_err)
{
R_GPT_Close(&g_pwm_ledgreen_ctrl);
return fsp_err;
}
fsp_err = R_GPT_Open(&g_pwm_ledblue_ctrl, &g_pwm_ledblue_cfg);
if(FSP_SUCCESS != fsp_err)
return fsp_err;
fsp_err = R_GPT_Start(&g_pwm_ledblue_ctrl);
if(FSP_SUCCESS != fsp_err)
{
R_GPT_Close(&g_pwm_ledblue_ctrl);
return fsp_err;
}
return fsp_err;
}
/* Blue Led work as heart beat mode */
void pwm_ledblue_callback(timer_callback_args_t *p_args)
{
static uint8_t mode = 0;
static uint32_t period_400ms = 0x2625a00;
static uint32_t period_3s = 0x11e1a300;
FSP_PARAMETER_NOT_USED(p_args);
if( 0 == mode%2 )
{
R_GPT_PeriodSet(&g_pwm_ledblue_ctrl, period_400ms);
}
else
{
R_GPT_PeriodSet(&g_pwm_ledblue_ctrl, period_3s);
}
mode ++;
}
修改 src/hal_entry.c 源文件,在里面修改綠色燈作為呼吸燈工作的的代碼如下。
... ...
#include "bsp_pwm.h"
... ...
void hal_entry(void)
{
timer_info_t info;
uint32_t period_counts;
uint32_t duty = 0;
... ...
pwm_init();
R_GPT_InfoGet(&g_pwm_ledgreen_ctrl, &info);
period_counts = info.period_counts;
/* Green Led work as breathe mode */
while (1)
{
duty ++;
if( duty <= 100 )
{
R_GPT_DutyCycleSet(&g_pwm_ledgreen_ctrl, (duty*period_counts)/100, GPT_IO_PIN_GTIOCB);
}
else if( duty>100 && duty<= 200 )
{
R_GPT_DutyCycleSet(&g_pwm_ledgreen_ctrl, ((200-duty)*period_counts)/100, GPT_IO_PIN_GTIOCB);
}
else
{
duty = 0;
R_GPT_DutyCycleSet(&g_pwm_ledgreen_ctrl, 0, GPT_IO_PIN_GTIOCB);
}
R_BSP_SoftwareDelay(20, BSP_DELAY_UNITS_MILLISECONDS);
}
... ...
}
5.4 編譯運行
代碼修改完成后,在開發(fā)板上編譯運行。這時可以看到藍色Led每隔3.4秒將快閃兩次,而綠色Led燈則亮度由弱到強,再由強到弱。

下面是測量藍色Led的波形圖:

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。
舉報投訴
-
led
+關注
關注
243文章
24573瀏覽量
690445 -
單片機
+關注
關注
6076文章
45476瀏覽量
669505 -
PWM
+關注
關注
116文章
5865瀏覽量
225386 -
定時器
+關注
關注
23文章
3367瀏覽量
123306 -
呼吸燈
+關注
關注
10文章
117瀏覽量
44063
發(fā)布評論請先 登錄
相關推薦
熱點推薦
如何利用定時器實現呼吸燈?
沒有硬件PWM,只能軟件模擬,但是發(fā)現都是在閃爍,沒有做出呼吸的效果。
使用軟件延時的方法可以做出來,但是運行效率太慢了。
我想用定時器中斷實現呼吸
發(fā)表于 10-25 06:14
基于51單片機的LED呼吸燈設計(定時器)
定時器實現led呼吸燈實驗原理: 燈在高速閃爍時,光信號傳入大 腦神經,需經過一段短暫的時間,光的作用結束后,視覺形象并不立即消失。每次循
發(fā)表于 11-04 20:36
?51次下載
51單片機利用PWM、定時器實現呼吸燈
PWM周期:20ms;占空比:0~100;定時器定時時間:200us(即占空比每一份時間:20ms/100);一次呼吸燈效果(暗->亮->暗
發(fā)表于 11-10 18:50
?1次下載
51單片機呼吸燈頻率怎么調節(jié)
51單片機呼吸燈頻率的調節(jié)方法可以通過改變PWM(脈沖寬度調制)的工作周期和占空比來實現。在下面的文章中,我將詳細介紹如何使用51
基于單片機的定時器PWM呼吸燈和心跳燈實現
評論