27.8
實驗3:輸入捕獲——脈寬和周期測量
上一個實驗使用了GPT的輸出功能,本次實驗要使用GPT的輸入功能,通過GPT的輸入捕獲進行脈寬和周期測量。其測量的原理如下圖所示。

首先啟動GPT定時器,在上升沿A處進行捕獲,記此時時間為A;緊接著在下降沿B處進行捕獲,記此時時間為B;最后再次在上升沿C處進行捕獲,記此時時間為C或者A’。設(shè)PWM的周期為T,占空比為D,頻率為f,則:

27.8.1
硬件設(shè)計
以野火啟明6M5開發(fā)板為例,本實驗使用P600和P603這兩個引腳,P600用于輸出PWM信號,P603用于輸入捕獲。將P600與P603使用杜邦線連接,引腳在引出排針處,如下圖所示。

注
野火啟明6M5開發(fā)板例程選用的PWM輸出引腳為:P600(GTIOC6B);選用的輸入捕獲引腳為:P603(GTIOC7A)。
野火啟明4M2開發(fā)板例程選用的PWM輸出引腳為:P405(GTIOC1A);選用的輸入捕獲引腳為:P414(GTIOC0B)。
野火啟明2L1開發(fā)板例程選用的PWM輸出引腳為:P115(GTIOC4A);選用的輸入捕獲引腳為:P113(GTIOC2A)。
本次實驗需要將PWM輸出引腳與輸入捕獲引腳使用杜邦線連接起來。
27.8.2
軟件設(shè)計
27.8.2.1
新建工程
由于本實驗的目標是測量PWM的周期、占空比,因此我們在上一個實驗的基礎(chǔ)上修改程序。
對于e2studio開發(fā)環(huán)境:拷貝一份我們之前的e2s工程“27_GPT_PWM_Output”,然后將工程文件夾重命名為“27_GPT_Input_Capture”,最后再將它導(dǎo)入到我們的e2studio工作空間中。
對于Keil開發(fā)環(huán)境:拷貝一份我們之前的Keil工程“27_GPT_PWM_Output”,然后將工程文件夾重命名為“27_GPT_Input_Capture”,并進入該文件夾里面雙擊Keil工程文件,打開該工程。
工程新建好之后,在工程根目錄的“src/gpt”路徑下面,新建源文件和頭文件:
bsp_gpt_input_capture.c
bsp_gpt_input_capture.h
工程文件結(jié)構(gòu)如下:
列表9:文件結(jié)構(gòu)
左右滑動查看完整內(nèi)容
27_GPT_Input_Capture ├─ ...... └─ 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 │ ├─ bsp_gpt_input_capture.c//新增文件 │ └─ bsp_gpt_input_capture.h//新增文件 └─ hal_entry.c
27.8.2.2
FSP配置
下面以野火啟明6M5開發(fā)板為例來講解相關(guān)的FSP配置。
由于在上一個實驗中我們已經(jīng)配置好了P600用于輸出PWM信號,因此本實驗中只需要添加輸入捕獲需要使用到IO引腳P603,需要在“Pins”配置頁面中配置GPT7所使用的引腳。

在“Stacks”配置頁面中加入GPT,按如下圖所示的配置進行設(shè)置。需要注意的是,因為“Input”里面的各類配置項目若是展開來的話篇幅比較長,因此在圖中并未展開出來,我們要注意勾上以下幾個選項:
展開Input->Capture ASource并勾上(在GTIOCA的上升沿啟用輸入捕獲A,無論GTIOCB引腳是:
–GTIOCA Rising Edge While GTIOCB Low
–GTIOCA Rising Edge While GTIOCB High
展開Input->Capture BSource并勾上(在GTIOCA的下降沿啟用輸入捕獲B,無論GTIOCB引腳是:
–GTIOCA Falling Edge While GTIOCB Low
–GTIOCA Falling Edge While GTIOCB High

點擊可查看大圖
GPT的“Input”選項卡的屬性描述:
表7:GPT屬性描述:“Input”

點擊可查看大圖
27.8.2.3
GPT初始化
初始化GPT模塊用于輸入捕獲的函數(shù)如下。在這個函數(shù)中,我們先初始化GPT模塊,然后調(diào)用R_GPT_Info Get函數(shù)獲取GPT的配置信息,主要是為了獲取計數(shù)器的計數(shù)周期,即GPT一個周期的計數(shù)次數(shù),并保存到全局變量period中。
最后使能輸入捕獲,并啟動GPT定時器。
列表10:GPT初始化
左右滑動查看完整內(nèi)容
timer_info_t info;//用于獲取定時器參數(shù)信息
uint32_t period;//輸入捕獲計數(shù)器的計數(shù)周期
/* GPT 初始化函數(shù)*/
voidGPT_InputCapture_Init(void)
{
/* 初始化GPT 模塊*/
R_GPT_Open(&g_timer_gpt7_ctrl, &g_timer_gpt7_cfg);
/* 獲取當前參數(shù)*/
(void)R_GPT_InfoGet(&g_timer_gpt7_ctrl, &info);
/* 獲取計數(shù)周期:GPT 的一個周期的計數(shù)次數(shù)*/
period = info.period_counts;
/* 使能輸入捕獲*/
R_GPT_Enable(&g_timer_gpt7_ctrl);
/* 啟動GPT 定時器*/
R_GPT_Start(&g_timer_gpt7_ctrl);
}
27.8.2.4
GPT中斷回調(diào)函數(shù)
GPT輸入捕獲中斷回調(diào)函數(shù)如下。
列表11:GPT中斷回調(diào)函數(shù)
滑動查看完整內(nèi)容
/* 保存所測量的PWM 信號的信息*/
uint32_tpwm_period;//PWM 周期
uint32_tpwm_high_level_time;//PWM 高電平的時間
uint32_tpwm_freq;//PWM 頻率
uint32_tpwm_duty;//PWM 占空比
/* GPT 輸入捕獲中斷回調(diào)函數(shù)*/
voidgpt7_input_capture_callback(timer_callback_args_t* p_args)
{
staticuint32_ta_time;// A 上升沿捕獲的時間
staticuint32_tb_time;// B 下降沿捕獲的時間
staticuint32_tc_time;// C 上升沿捕獲的時間(其實也就是A 可以用A'表示)
staticuint32_toverflow_times;//計數(shù)器溢出次數(shù)
staticuint8_tone_period_flag=0;//用于表示是否完成對一個完整周期的測量
switch(p_args->event)
{
/* 捕獲到上升沿-- 有可能是A 或者C (A') 位置*/
caseTIMER_EVENT_CAPTURE_A:
/* A 開始對某個周期進行測量*/
if(0== one_period_flag)
{
a_time = p_args->capture;//記錄捕獲的時間A
overflow_times =0;//初始化計數(shù)器溢出次數(shù)
one_period_flag ++;//表示即將完成對某個周期的測量
}
/* C (A') 如果測量完了一個周期,則計算PWM 信號周期和高電平的時間*/
elseif(1== one_period_flag)
{
c_time = p_args->capture + overflow_times * period;//記錄捕
獲的時間C
//計算PWM 周期
pwm_period = c_time - a_time;
//清零所有標志位
overflow_times =0;
one_period_flag =0;//標志位清0, 重新進入下一輪的測量
}
break;
/* 捕獲到下降沿-- 是B 位置*/
caseTIMER_EVENT_CAPTURE_B:
//如果是在測量周期內(nèi)檢測到下降沿
if(1== one_period_flag)
{
b_time = p_args->capture + overflow_times * period;//記錄捕
獲的時間B
pwm_high_level_time = b_time - a_time;//計算高電平時間
}
break;
/* 定時器計數(shù)溢出事件*/
caseTIMER_EVENT_CYCLE_END:案件 TIMER_EVENT_CYCLE_END:
/* 輸入捕獲期間計數(shù)器溢出,則記錄溢出次數(shù)+1 */
overflow_times++;
break;
default:
break;
}
}
在GPT中斷回調(diào)函數(shù)中,我們使用switch語句判斷觸發(fā)中斷的事件類型。GPT在引腳輸入PWM信號的上升沿觸發(fā)捕獲A事件,在PWM信號的下降沿觸發(fā)捕獲B事件,并在計數(shù)器溢出時觸發(fā)定時器計數(shù)溢出事件。
警告
建議不要在中斷回調(diào)函數(shù)中打印數(shù)據(jù),因為PWM頻率一般很高,而printf函數(shù)執(zhí)行所消耗的時間比較長,可能會阻塞中斷服務(wù)函數(shù)的運行。同時也應(yīng)該時刻注意中斷優(yōu)先級的問題。
27.8.2.5
hal_entry入口函數(shù)
列表12:hal_entry入口函數(shù)
滑動查看完整內(nèi)容
/* 用戶頭文件包含*/ #include"led/bsp_led.h" #include"debug_uart/bsp_debug_uart.h" #include"gpt/bsp_gpt_pwm_output.h" #include"gpt/bsp_gpt_input_capture.h" // 外部變量聲明 externtimer_info_t info;//用于獲取定時器參數(shù)信息 externuint32_t pwm_period;//PWM 周期 externuint32_t pwm_high_level_time;//PWM 高電平的時間 externuint32_t pwm_freq;//PWM 頻率 externuint32_t pwm_duty;//PWM 占空比 voidhal_entry(void) { /*TODO:add your own code here */ LED_Init();// LED 初始化 Debug_UART4_Init();// SCI4 UART 調(diào)試串口初始化 GPT_PWM_Init();// GPT PWM 輸出初始化 GPT_InputCapture_Init();// GPT 輸入捕獲初始化 printf("這是一個GPT 的PWM 輸出+ 輸入捕獲功能實驗 "); printf("使用杜邦線連接P600 和P603 引腳,然后打開串口助手查看串口的打印信息 ,→"); while(1) { /* 計算PWM 的頻率*/ pwm_freq=info.clock_frequency/pwm_period; /* 計算PWM 的占空比*/ pwm_duty=pwm_high_level_time*100/pwm_period; // 打印 printf("High=%d, Period=%d, ", pwm_high_level_time, pwm_period); printf("Friquency = %dHz, Duty_Cycle = %d%% ", pwm_freq, pwm_ ,→duty); pwm_period=pwm_high_level_time=pwm_freq=0;//打印完后舊數(shù)據(jù)清零 // LED1 閃爍指示程序正在運行... LED1_TOGGLE; // 間隔1s R_BSP_SoftwareDelay(1,BSP_DELAY_UNITS_SECONDS); } #ifBSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter(); #endif }
27.8.3
下載驗證
以野火啟明6M5開發(fā)板為例,編譯并下載程序后,復(fù)位開發(fā)板使程序重新運行,然后使用杜邦線連接P600和P603引腳,然后打開串口助手查看串口的打印信息。串口會打印出PWM信號的頻率和占空比等信息,實驗現(xiàn)象如下圖所示。

點擊可查看大圖
-
瑞薩
+關(guān)注
關(guān)注
38文章
22518瀏覽量
91174 -
定時器
+關(guān)注
關(guān)注
23文章
3373瀏覽量
124493 -
脈寬
+關(guān)注
關(guān)注
0文章
40瀏覽量
13177 -
GPT
+關(guān)注
關(guān)注
0文章
372瀏覽量
16959
原文標題:實驗3:輸入捕獲脈寬和周期測量——瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南(101)
文章出處:【微信號:瑞薩嵌入式小百科,微信公眾號:瑞薩嵌入式小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南之GPT比較匹配功能及輸入捕獲功能詳解
瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南之使用GPT基本定時功能實驗
瑞薩e2studio(1)----瑞薩芯片之搭建FSP環(huán)境
【瑞薩RA2L1入門學(xué)習(xí)】1. 點亮LED
【RA-Eco-RA4M2開發(fā)板評測】+VS Code 下瑞薩 RA4M2 開發(fā)環(huán)境搭建與 GPIO 點燈實驗教程
【瑞薩RA4系列開發(fā)板體驗】開發(fā)環(huán)境搭建和新手點燈指南
【瑞薩RA4系列開發(fā)板體驗】體驗過程
【有獎直播預(yù)報名】瑞薩電子RA系列產(chǎn)品開發(fā)工具之FSP4.0.0新特性介紹
【視頻教程】瑞薩RA單片機FSP開發(fā)(3)FSP架構(gòu)-解釋Blinky架構(gòu)[上]
瑞薩電子RA系列微控制器的可擴展性強的配置軟件包 (FSP)安裝下載與使用指南
瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南之使用GPT進行PWM輸出實驗
瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南之使用GPT輸入捕獲進行脈寬和周期測量實驗
評論