27.8
實(shí)驗(yàn)3:輸入捕獲——脈寬和周期測(cè)量
上一個(gè)實(shí)驗(yàn)使用了GPT的輸出功能,本次實(shí)驗(yàn)要使用GPT的輸入功能,通過(guò)GPT的輸入捕獲進(jìn)行脈寬和周期測(cè)量。其測(cè)量的原理如下圖所示。

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

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

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

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

點(diǎn)擊可查看大圖
GPT的“Input”選項(xiàng)卡的屬性描述:
表7:GPT屬性描述:“Input”

點(diǎn)擊可查看大圖
27.8.2.3
GPT初始化
初始化GPT模塊用于輸入捕獲的函數(shù)如下。在這個(gè)函數(shù)中,我們先初始化GPT模塊,然后調(diào)用R_GPT_Info Get函數(shù)獲取GPT的配置信息,主要是為了獲取計(jì)數(shù)器的計(jì)數(shù)周期,即GPT一個(gè)周期的計(jì)數(shù)次數(shù),并保存到全局變量period中。
最后使能輸入捕獲,并啟動(dòng)GPT定時(shí)器。
列表10:GPT初始化
左右滑動(dòng)查看完整內(nèi)容
timer_info_t info;//用于獲取定時(shí)器參數(shù)信息
uint32_t period;//輸入捕獲計(jì)數(shù)器的計(jì)數(shù)周期
/* GPT 初始化函數(shù)*/
voidGPT_InputCapture_Init(void)
{
/* 初始化GPT 模塊*/
R_GPT_Open(&g_timer_gpt7_ctrl, &g_timer_gpt7_cfg);
/* 獲取當(dāng)前參數(shù)*/
(void)R_GPT_InfoGet(&g_timer_gpt7_ctrl, &info);
/* 獲取計(jì)數(shù)周期:GPT 的一個(gè)周期的計(jì)數(shù)次數(shù)*/
period = info.period_counts;
/* 使能輸入捕獲*/
R_GPT_Enable(&g_timer_gpt7_ctrl);
/* 啟動(dòng)GPT 定時(shí)器*/
R_GPT_Start(&g_timer_gpt7_ctrl);
}
27.8.2.4
GPT中斷回調(diào)函數(shù)
GPT輸入捕獲中斷回調(diào)函數(shù)如下。
列表11:GPT中斷回調(diào)函數(shù)
滑動(dòng)查看完整內(nèi)容
/* 保存所測(cè)量的PWM 信號(hào)的信息*/
uint32_tpwm_period;//PWM 周期
uint32_tpwm_high_level_time;//PWM 高電平的時(shí)間
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 上升沿捕獲的時(shí)間
staticuint32_tb_time;// B 下降沿捕獲的時(shí)間
staticuint32_tc_time;// C 上升沿捕獲的時(shí)間(其實(shí)也就是A 可以用A'表示)
staticuint32_toverflow_times;//計(jì)數(shù)器溢出次數(shù)
staticuint8_tone_period_flag=0;//用于表示是否完成對(duì)一個(gè)完整周期的測(cè)量
switch(p_args->event)
{
/* 捕獲到上升沿-- 有可能是A 或者C (A') 位置*/
caseTIMER_EVENT_CAPTURE_A:
/* A 開(kāi)始對(duì)某個(gè)周期進(jìn)行測(cè)量*/
if(0== one_period_flag)
{
a_time = p_args->capture;//記錄捕獲的時(shí)間A
overflow_times =0;//初始化計(jì)數(shù)器溢出次數(shù)
one_period_flag ++;//表示即將完成對(duì)某個(gè)周期的測(cè)量
}
/* C (A') 如果測(cè)量完了一個(gè)周期,則計(jì)算PWM 信號(hào)周期和高電平的時(shí)間*/
elseif(1== one_period_flag)
{
c_time = p_args->capture + overflow_times * period;//記錄捕
獲的時(shí)間C
//計(jì)算PWM 周期
pwm_period = c_time - a_time;
//清零所有標(biāo)志位
overflow_times =0;
one_period_flag =0;//標(biāo)志位清0, 重新進(jìn)入下一輪的測(cè)量
}
break;
/* 捕獲到下降沿-- 是B 位置*/
caseTIMER_EVENT_CAPTURE_B:
//如果是在測(cè)量周期內(nèi)檢測(cè)到下降沿
if(1== one_period_flag)
{
b_time = p_args->capture + overflow_times * period;//記錄捕
獲的時(shí)間B
pwm_high_level_time = b_time - a_time;//計(jì)算高電平時(shí)間
}
break;
/* 定時(shí)器計(jì)數(shù)溢出事件*/
caseTIMER_EVENT_CYCLE_END:案件 TIMER_EVENT_CYCLE_END:
/* 輸入捕獲期間計(jì)數(shù)器溢出,則記錄溢出次數(shù)+1 */
overflow_times++;
break;
default:
break;
}
}
在GPT中斷回調(diào)函數(shù)中,我們使用switch語(yǔ)句判斷觸發(fā)中斷的事件類(lèi)型。GPT在引腳輸入PWM信號(hào)的上升沿觸發(fā)捕獲A事件,在PWM信號(hào)的下降沿觸發(fā)捕獲B事件,并在計(jì)數(shù)器溢出時(shí)觸發(fā)定時(shí)器計(jì)數(shù)溢出事件。
警告
建議不要在中斷回調(diào)函數(shù)中打印數(shù)據(jù),因?yàn)镻WM頻率一般很高,而printf函數(shù)執(zhí)行所消耗的時(shí)間比較長(zhǎng),可能會(huì)阻塞中斷服務(wù)函數(shù)的運(yùn)行。同時(shí)也應(yīng)該時(shí)刻注意中斷優(yōu)先級(jí)的問(wèn)題。
27.8.2.5
hal_entry入口函數(shù)
列表12:hal_entry入口函數(shù)
滑動(dòng)查看完整內(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í)器參數(shù)信息 externuint32_t pwm_period;//PWM 周期 externuint32_t pwm_high_level_time;//PWM 高電平的時(shí)間 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("這是一個(gè)GPT 的PWM 輸出+ 輸入捕獲功能實(shí)驗(yàn) "); printf("使用杜邦線連接P600 和P603 引腳,然后打開(kāi)串口助手查看串口的打印信息 ,→"); while(1) { /* 計(jì)算PWM 的頻率*/ pwm_freq=info.clock_frequency/pwm_period; /* 計(jì)算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 閃爍指示程序正在運(yùn)行... 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
下載驗(yàn)證
以野火啟明6M5開(kāi)發(fā)板為例,編譯并下載程序后,復(fù)位開(kāi)發(fā)板使程序重新運(yùn)行,然后使用杜邦線連接P600和P603引腳,然后打開(kāi)串口助手查看串口的打印信息。串口會(huì)打印出PWM信號(hào)的頻率和占空比等信息,實(shí)驗(yàn)現(xiàn)象如下圖所示。

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