首頁 > 評測 > 基于CH32V103實現(xiàn)HC-SR04 超聲波測距模塊輪詢讀取距離數(shù)據(jù)
基于CH32V103實現(xiàn)HC-SR04 超聲波測距模塊輪詢讀取距離數(shù)據(jù)
- [導讀]
- 本帖最后由 lilijin1995 于 2023-3-17 23:13 編輯 一般的我自己學習單片機,為了更加了解硬件,我都會畫了一塊CH32V103最小系統(tǒng)板,然后外接其他功能模塊實現(xiàn)一些應(yīng)用,現(xiàn)在秀一秀自己畫的板子,雖然設(shè)計得不
本帖最后由 lilijin1995 于 2023-3-17 23:13 編輯
一般的我自己學習單片機,為了更加了解硬件,我都會畫了一塊CH32V103最小系統(tǒng)板,然后外接其他功能模塊實現(xiàn)一些應(yīng)用,現(xiàn)在秀一秀自己畫的板子,雖然設(shè)計得不怎樣,哈哈哈。!
最近翻箱底有一款超聲波測距,HC-SR04,
那么現(xiàn)在就開始實現(xiàn)HC-SR04 超聲波測距模塊輪詢讀取距離數(shù)據(jù)
硬件接口:根據(jù)規(guī)格書可以看到接口定義如下圖:
我們定義PA0映射TRIG,PA1-TIM2CH2映射ECHO,供電為5V。
軟件說明:
超聲波時序圖如下:
以上時序圖表明你只需要提供一個 10uS 以上脈沖觸發(fā)信號,該模塊內(nèi)部將
發(fā)出 8 個 40kHz 周期電平并檢測回波。一旦檢測到有回波信號則輸出回響信號 。
回響信號的脈沖寬度與所測的距離成正比。由此通過發(fā)射信號到收到的回響信號
時間間隔可以計算得到距離。公式:uS/58=厘米或者 uS/148=英寸;或是:距離=
高電平時間*聲速(340M/S)/2;建議測量周期為 60ms 以上,以防止發(fā)射信號對
回響信號的影響。
這里主要是ECHO配置TIMCH2輸入捕獲配置,如下代碼:
- /*********************************************************************
- * @fn TIM2_ICapture_Init
- *
- * [url=home.php?mod=space&uid=247401]@brief[/url] Initializes TIM1 input capture.
- *
- * @param arr - the period value.
- * psc - the prescaler value.
- * ccp - the pulse value.
- *
- * [url=home.php?mod=space&uid=266161]@return[/url] none
- */
- void TIM2_ICapture_Init(u16 arr, u16 psc)
- {
- GPIO_InitTypeDef GPIO_InitStructure = {0};
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure = {0};
- NVIC_InitTypeDef NVIC_InitStructure = {0};
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2時鐘
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_ResetBits(GPIOA, GPIO_Pin_1);
- TIM_TimeBaseInitStructure.TIM_Period = arr;
- TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
- TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
- TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
- TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
- TIM_ICInitStructure.TIM_ICFilter = 0x00;
- TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
- TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
- TIM_ICInit(TIM2,&TIM_ICInitStructure);
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- TIM_ITConfig(TIM2, TIM_IT_Update | TIM_IT_CC2, ENABLE);
- TIM_Cmd(TIM2, ENABLE);
- }
我們直接在中斷里面計算高電平時間,這里面參考了正點原子的輸入捕獲實驗
- //TIM2CH2_CAPTURE_STA
- //bit7:捕獲完成標志
- //bit6:捕獲到高電平標志
- //bit5~0:捕獲到高電平后定時器溢出的次數(shù)
- u8 TIM2CH2_CAPTURE_STA=0; //輸入捕獲狀態(tài)
- u16 TIM2CH2_CAPTURE_VAL; //輸入捕獲值,用來記錄捕獲到下降沿的時候,TIM2_CNT的值
- //定時器2中斷服務(wù)程序
- void TIM2_IRQHandler(void)
- {
- if((TIM2CH2_CAPTURE_STA&0X80)==0)//還未成功捕獲
- {
- if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
- {
- if(TIM2CH2_CAPTURE_STA&0X40)//已經(jīng)捕獲到高電平了
- {
- if((TIM2CH2_CAPTURE_STA&0X3F)==0X3F)//高電平太長了
- {
- TIM2CH2_CAPTURE_STA|=0X80;//標記成功捕獲了一次
- TIM2CH2_CAPTURE_VAL=0XFFFF;
- }else TIM2CH2_CAPTURE_STA++;
- }
- }
- if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)//捕獲2發(fā)生捕獲事件
- {
- if(TIM2CH2_CAPTURE_STA&0X40) //捕獲到一個下降沿
- {
- TIM2CH2_CAPTURE_STA|=0X80; //標記成功捕獲到一次高電平脈寬
- TIM2CH2_CAPTURE_VAL=TIM_GetCapture2(TIM2);
- TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC2P=0 設(shè)置為上升沿捕獲
- }else //還未開始,第一次捕獲上升沿
- {
- TIM2CH2_CAPTURE_STA=0; //清空
- TIM2CH2_CAPTURE_VAL=0;
- TIM_SetCounter(TIM2,0);
- TIM2CH2_CAPTURE_STA|=0X40; //標記捕獲到了上升沿
- TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling); //CC1P=1 設(shè)置為下降沿捕獲
- }
- }
- }
- TIM_ClearITPendingBit(TIM2, TIM_IT_CC2|TIM_IT_Update); //清除中斷標志位
- }
捕獲了高電平時間,直接除以58就是距離值:我們直接看我們的SR04驅(qū)動:
- void SR04_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PB,PE端口時鐘
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //LED0-->PB.5 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIOB.5
- GPIO_SetBits(GPIOA,GPIO_Pin_0); //PB.5 輸出高
- TIM2_ICapture_Init(0xFFFF,71);
- TRIG(0);
- }
- u32 SR04_Handler(void)
- {
- u32 temp=0,Distance=0;
- //TRig
- Delay_Ms(1);
- TRIG(1);
- Delay_Ms(15);
- TRIG(0);
- //計算距離
- if(TIM2CH2_CAPTURE_STA&0X80) //成功捕獲到了一次高電平
- {
- temp=TIM2CH2_CAPTURE_STA&0X3F;
- temp*=65536; //溢出時間總和
- temp+=TIM2CH2_CAPTURE_VAL; //得到總的高電平時間
- Distance=(temp/58);
- printf("Distance:%d cm\r\n",Distance); //打印總的高點平時間
- TIM2CH2_CAPTURE_STA=0; //開啟下一次捕獲
- return Distance;
- }
- return 0;
- }
下載驗證:
-
- 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!
網(wǎng)友評論
- 聯(lián)系人:巧克力娃娃
- 郵箱:board@21ic.com
- 我要投稿
-
歡迎入駐,開放投稿
-
人均百萬?英偉達中國員工收入曝光! 2024-08-29
-
《黑神話:悟空》玩家硬盤升級攻略:提升游戲體驗,暢享3A大作 2024-08-29
-
數(shù)睿數(shù)據(jù)參加《系統(tǒng)與軟件工程 低代碼開發(fā)平臺通用技術(shù)要求》國家標準編制 2024-08-29
- NRF52810藍牙數(shù)字耳機找人定制
預算:¥30005天前
- 125KW模塊式PCS軟硬件外包開發(fā)
預算:¥1100000015小時前
- 12V汽車啟動電源項目BMS設(shè)計
預算:¥50000023小時前
- 數(shù)據(jù)可視化軟件 開發(fā)
預算:¥5000023小時前
- PLC項目調(diào)試修改
預算:¥100001天前
- 起動電機控制器開發(fā)
預算:¥1100001天前