實驗3:脈沖寬度測量模式
硬件設計
以野火啟明6M5開發板例程為例,本實驗需要使用兩個引腳,使用的PWM輸出引腳為額外引出的IO引腳為:P500;用于脈沖輸入的測量引腳使用的開發板引出的IO引腳為:P600。如下圖所示。

點擊可查看大圖
注
野火啟明6M5開發板例程選用的PWM輸出引腳為:P500(AGTOA0);選用的測量引腳為:P600(AGTIO3)。
野火啟明4M2開發板例程選用的PWM輸出引腳為:P211(AGTOA5);選用的測量引腳為:P415(AGTIO4)。
野火啟明2L1開發板例程選用的PWM輸出引腳為:P208(AGTOB0);選用的測量引腳為:P402(AGTIO1)。
本次實驗需要將PWM輸出引腳與測量引腳使用杜邦線連接起來。
軟件設計
28.6.2.1
新建工程
由于本實驗需要用到PWM波形信號,因此我們直接在前面的“實驗2:比較匹配功能(PWM輸出)”例程的基礎上修改程序。
對于e2studio開發環境:拷貝一份我們之前的e2s工程“28_AGT_PWM_Output”,然后將工程文件夾重命名為“28_AGT_Pulse_Width_Measurement”,最后再將它導入到我們的e2studio工作空間中。
對于Keil開發環境:拷貝一份我們之前的Keil工程“28_AGT_PWM_Output”,然后將工程文件夾重命名為“28_AGT_Pulse_Width_Measurement”,并進入該文件夾里面雙擊Keil工程文件,打開該工程。
工程新建好之后,在工程根目錄下,進入到“src/agt”文件夾里面新建源文件和頭文件:“bsp_agt_pulse_width_measurement.c”和“bsp_agt_pulse_width_measurement.h”。工程文件結構如下。
列表9:文件結構
28_AGT_Pulse_Width_Measurement├─ ......└─ src├─ led│ ├─ bsp_led.c│ └─ bsp_led.h├─ debug_uart│ ├─ bsp_debug_uart.c│ └─ bsp_debug_uart.h├─ agt│ ├─ bsp_agt_pwm_output.c│ ├─ bsp_agt_pwm_output.h│ ├─ bsp_agt_pulse_width_measurement.c│ └─ bsp_agt_pulse_width_measurement.h└─ hal_entry.c
28.6.2.2
FSP配置
接下來我們要以野火啟明6M5開發板為例來說明進行FSP配置的方法,另外兩塊板子的配置步驟是一樣的,讀者可根據實際使用的引腳參照下面的步驟來進行配置。
首先在“Pins”配置頁中配置AGT3的操作模式配置為“Count Measurement”,并且為該AGT配置相應的引腳,也就是將AGT的AGTIO3信號連接到P600引腳,如下圖所示。

點擊可查看大圖
接著在Stacks中加入第二個AGT模塊實例,并按如下圖所示配置該AGT模塊的屬性:

點擊可查看大圖
表7:AGT屬性描述:“Input”部分。

點擊可查看大圖
28.6.2.3
AGT初始化函數
列表10:代碼清單28-7:
AGT初始化
timer_info_t info; //用于獲取定時器參數信息uint32_t period; //用于保存計數器的計數周期/* AGT 初始化函數*/voidAGT_Pulse_Width_Measurement_Init(void){/* 初始化AGT 模塊*/R_AGT_Open(&g_timer_agt3_ctrl, &g_timer_agt3_cfg);/* 獲取當前參數*/(void) R_AGT_InfoGet(&g_timer_agt3_ctrl, &info);/* 獲取計數周期:AGT 的一個周期的計數次數*/period = info.period_counts;/* 使能AGT 定時器*/R_AGT_Enable(&g_timer_agt3_ctrl); //注:對于脈沖寬度/周期測量模式下,使用?,→R_AGT_Enable 或R_AGT_Start 函數效果是一致的/* 啟動AGT 定時器*///R_AGT_Start(&g_timer_agt3_ctrl);
28.6.2.4
AGT脈沖寬度測量中斷回調函數
列表11:代碼清單28-8:
AGT脈沖寬度測量中斷回調函數
uint32_t pulse_width_time; //測量的脈沖高電平寬度時間volatileuint8_t print_enble_flag; //允許打印測量結果標志/* AGT 脈沖寬度測量中斷回調函數*/voidagt3_pulse_width_measurement_callback(timer_callback_args_t * p_args){staticuint32_t overflow_times = 0; //計數器溢出次數/* 測量完成事件*/if (TIMER_EVENT_CAPTURE_A == p_args->event){pulse_width_time = p_args->capture + overflow_times * period; //記錄時間Boverflow_times = 0;print_enble_flag = 1; //測量完成后允許打印測量結果}/* 定時器計數溢出事件*/elseif (TIMER_EVENT_CYCLE_END == p_args->event){/* 輸入捕獲期間計數器溢出,則記錄溢出次數+1 */overflow_times++;}}
28.6.2.5
hal_entry入口函數
列表12:代碼清單28-9:hal_entry入口函數
/* 用戶頭文件包含*/#include"led/bsp_led.h"#include"debug_uart/bsp_debug_uart.h"#include"agt/bsp_agt_pwm_output.h"#include"agt/bsp_agt_pulse_width_measurement.h"// 外部變量聲明externtimer_info_t info; //用于獲取定時器參數信息externuint32_t pulse_width_time; //PWM 高電平的時間externvolatileuint8_t print_enble_flag;voidhal_entry(void){/* TODO: add your own code here */LED_Init(); // LED 初始化Debug_UART4_Init(); // SCI4 UART 調試串口初始化AGT_PWM_Init(); // AGT PWM 輸出初始化AGT_Pulse_Width_Measurement_Init(); // AGT 脈沖寬度測量初始化printf("這是一個AGT 的PWM 輸出+ 脈沖寬度測量功能實驗\r\n");printf("使用杜邦線連接P500 和P600 引腳,然后打開串口助手查看串口的打印信息\r\n,→");while(1){float pulse_width_time_us;if (print_enble_flag){// 打印PWM 高電平的計數printf("High=%d, ", pulse_width_time);/* 計算PWM 高電平的時間*/pulse_width_time_us = (float)pulse_width_time / ((float)info.,→clock_frequency / (float)1000000);printf("Time=%f us\r\n", pulse_width_time_us);pulse_width_time = 0; //測量結果打印完后舊數據清零print_enble_flag = 0; //允許打印測量結果標志位清零}// LED1 閃爍指示程序正在運行...LED1_TOGGLE;// 間隔1sR_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);}#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();#endif}
下載驗證
編譯并下載程序后,復位開發板使程序重新運行,然后使用杜邦線連接P500和P600引腳,然后打開串口助手查看串口的打印信息。串口會打印出PWM信號的頻率和占空比等信息,實驗現象如下圖所示。

點擊可查看大圖
通過計算,我們設置PWM輸出波形的頻率為20KHz(周期為50us)、占空比為80%(正脈寬應為40us),這與我們測量得到正脈寬一致。
如您在使用瑞薩MCU/MPU產品中有任何問題,可識別下方二維碼或復制網址到瀏覽器中打開,進入瑞薩MCU/MPU官方技術論壇尋找答案或獲取在線技術支持。
https://bbs.21ic.com/renesas
未完待續
推薦閱讀

AGT低功耗定時器——瑞薩RA系列FSP庫開發實戰指南(102)

實驗1:基本定時功能——瑞薩RA系列FSP庫開發實戰指南(103)

實驗2:比較匹配功能(PWM輸出)——瑞薩RA系列FSP庫開發實戰指南(104)

