STM32CubeMX | STM32使用HAL库进行脉冲宽度和周期测量
生活随笔
收集整理的這篇文章主要介紹了
STM32CubeMX | STM32使用HAL库进行脉冲宽度和周期测量
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
STM32CubeMX | STM32使用HAL庫進行脈沖寬度和周期測量
掃描以下二維碼,關注公眾號雍正不禿頭獲取更多STM32資源及干貨!
使用芯片:STM32F103RCT6
思路:定時器設置為1MHZ的計數頻率,定時計數器增加一就是增加1us
① 首先設置為上升沿捕獲,捕獲上升沿記錄此刻的時間計數值;
② 然后切換為下降沿捕獲,捕獲下降沿記錄此刻的時間計數值;
③ 最后設置為上升沿捕獲,捕獲上升沿記錄此刻的時間計數值;
對于16bit定時器,最大可計數0xFFFF,也就是65535us,那么:高電平持續的時間 = 定時器溢出計數 * 0xFFFF + 當前計數值
對于32bit定時器,最大可計數0xFFFFFFFF,也就是4294.967295s,這個時間足夠測量脈沖寬度的了,那么:高電平持續的時間 = 當前計數值
高電平持續的時間 = ② - ①
周期 = ③ - ①
定時器配置
設置定時器2的計數頻率為1MHz,輸入捕獲使用通道一,也就是PA0引腳,將PA0引腳設置為下拉模式,目的是為了在空閑時間保持信號穩定:
中斷分組設置
代碼配置
tim.c中添加如下代碼:
__IO uint32_t TIM2_TIMEOUT_COUNT = 0; ///< 定時器2定時溢出計數 uint32_t TIM2_CAPTURE_BUF[3] = {0, 0, 0}; ///< 分別存儲上升沿計數、下降沿計數、下個上升沿計數 __IO uint8_t TIM2_CAPTURE_STA = 0xFF; ///< 狀態標記/*** 設置TIM2輸入捕獲極性* @param TIM_ICPolarity:* TIM_INPUTCHANNELPOLARITY_RISING :上升沿捕獲* TIM_INPUTCHANNELPOLARITY_FALLING :下降沿捕獲* TIM_INPUTCHANNELPOLARITY_BOTHEDGE:上升沿和下降沿都捕獲*/ inline void TIM2_SetCapturePolarity(uint32_t TIM_ICPolarity) {htim2.Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP);htim2.Instance->CCER |= (TIM_ICPolarity & (TIM_CCER_CC1P | TIM_CCER_CC1NP)); }/// 定時器2時間溢出回調函數 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {if (htim->Instance == htim2.Instance){TIM2_TIMEOUT_COUNT++; // 溢出次數計數} }///< 輸入捕獲回調函數 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {if (htim->Instance == htim2.Instance){switch (TIM2_CAPTURE_STA){case 1:{printf("準備捕獲下降沿...\r\n");TIM2_CAPTURE_BUF[0] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1) + TIM2_TIMEOUT_COUNT * 0xFFFF;TIM2_SetCapturePolarity(TIM_INPUTCHANNELPOLARITY_FALLING); // 設置為下降沿觸發TIM2_CAPTURE_STA++;break;}case 2:{printf("準備捕獲下個上升沿...\r\n");TIM2_CAPTURE_BUF[1] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1) + TIM2_TIMEOUT_COUNT * 0xFFFF;TIM2_SetCapturePolarity(TIM_INPUTCHANNELPOLARITY_RISING); // 設置為上升沿觸發TIM2_CAPTURE_STA++;break;}case 3:{printf("捕獲結束...\r\n");printf("# end ----------------------------------------------------\r\n");TIM2_CAPTURE_BUF[2] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1) + TIM2_TIMEOUT_COUNT * 0xFFFF;HAL_TIM_IC_Stop_IT(htim, TIM_CHANNEL_1); // 停止捕獲HAL_TIM_Base_Stop_IT(&htim2); // 停止定時器更新中斷TIM2_CAPTURE_STA++;break;}default:break;}} }///< TIM2輪訓狀態切換 inline void TIM2_Poll(void) {switch (TIM2_CAPTURE_STA){case 0:{printf("# start ----------------------------------------------------\r\n");printf("準備捕獲上升沿...\r\n");TIM2_TIMEOUT_COUNT = 0;__HAL_TIM_SET_COUNTER(&htim2, 0); // 清除定時器2現有計數memset(TIM2_CAPTURE_BUF, 0, sizeof(TIM2_CAPTURE_BUF)); // 清除捕獲計數TIM2_SetCapturePolarity(TIM_INPUTCHANNELPOLARITY_RISING); // 設置為上升沿觸發HAL_TIM_Base_Start_IT(&htim2); // 啟動定時器更新中斷HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); // 啟動捕獲中斷TIM2_CAPTURE_STA++;break;}case 4:{uint32_t high = TIM2_CAPTURE_BUF[1] - TIM2_CAPTURE_BUF[0];uint32_t cycle = TIM2_CAPTURE_BUF[2] - TIM2_CAPTURE_BUF[0];float frq = 1.0 / (((float)cycle) / 1000000.0);TIM2_CAPTURE_STA++;printf("\r\n\r\n");printf("################################# START #########################################\r\n");printf("高電平持續時間:%dms\r\n", high / 1000);printf("周期 :%dms\r\n", cycle / 1000);printf("頻率 :%fHz\r\n", frq);printf("################################## END ##########################################\r\n\r\n");break;}default:break;} }main.c:
int main() {HAL_Init();SystemClock_Config();MX_GPIO_Init();DEBUG_UART_Init();MX_TIM2_Init();printf("================================ 系統運行! ================================ \r\n");while(1){TIM2_Poll();DEBUG_UART_RecvHandler();} }說明:串口一接串口調試助手,勾選發送新行,向單片機發送任意字符以此來啟動輸入捕獲。
ends…
總結
以上是生活随笔為你收集整理的STM32CubeMX | STM32使用HAL库进行脉冲宽度和周期测量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 滑坡泥石流的防御措施_滑坡的主要防护措施
- 下一篇: 使用 auto-drawing 画一个户