基於STM32F103ZET6 HC_SR04超聲波測距模塊


這是最后的實驗現象,改變不同的角度即可測得距離

板子 PZ6806L 超聲波模塊 HC_SR04

HC_SR04模塊講解

通過該超聲波模塊說明書,可明白供電需VCC 5V  還需GND  ECHO(回響信號)  TRIG(觸發信號)

也就是說總共需要4根線,其中VCC和GND只需要接到開發板上的5V電源和GND即可

這是我的接線圖

 

 ECHO 使用的是PC3引腳,TRIG 使用的是PC2引腳

PC3和PC2只是普通的引腳,沒任何特殊性,可憑自己想法配置不同的引腳

 

從超聲波時序圖看出,若想能夠使用該模塊,

1 使用你要觸發信號拉高10us以上

 

2 接着模塊內部自己發出8個40khz脈沖,不需要管,接着模塊會輸出回響信號,而回響信號高電平的

脈沖寬度,與距離成正比

 

以上知道這些就可以正常使用,至於距離公式后面會再解釋

注意

 

接着就是代碼部分,主函數最后再介紹

HC_SR04配置函數及ECHO高電平時間

首先是頭文件

配置一個變量 time,用於存儲回響信號高電平的時間

void hc_sr04_init(void); 該函數是引腳的配置函數

float  Get_hcsr04length(void);該函數是用來發送觸發信號,並得到回響信號的高電平時間

 

 

void hc_sr04_init(void)
{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE);//打開GPIOC的時鍾

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//配置引腳2,trig觸發信號
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置為推挽輸出
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_2);//觸發信號,首先把它拉低,避免額外影響

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//配置引腳3,echo回響信號
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//配置為模擬輸入
GPIO_Init(GPIOC, &GPIO_InitStructure);//echo信號
GPIO_ResetBits(GPIOC,GPIO_Pin_3);//也同樣拉低
}

 

 

 

float Get_hcsr04length(void)
{
GPIO_SetBits(GPIOC,GPIO_Pin_2);
delay_us(20);
GPIO_ResetBits(GPIOC,GPIO_Pin_2); //TRIG發送觸發信號,延時10us以上就可以了

while(PCI(3)==0) //當echo一直是低電平的時候,就清空,並且關閉計時器
{
TIM_SetCounter(TIM2, 0);
TIM_Cmd(TIM2,DISABLE);
}
while(PCI(3)==1)//一旦echo被拉高了,就說明模塊傳需要的數據回來了,打開計時器
{
TIM_Cmd(TIM2,ENABLE);
}
time=TIM_GetCounter(TIM2);//當被拉高的echo再次變回低電平時,將計時器的值賦給time
return time;//返回time
}

 

計時器函數的配置

 

void TIM_Counter(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能TIM2的時鍾

TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 71;//72MHx/72=1us,
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上計數模式
TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);
TIM_Cmd(TIM2,DISABLE);//關閉,需要的時候再打開
}

 

部分主函數

 

int main(void)
{

float Distance=0;//存儲距離
delay_init(72); //配置滴答計時器
RCC_Configuration();//時鍾配置
GPIO_Configuration();//GPIO配置,只是PC0(LED0),用來提示系統正常運行
TIM_Counter();//計時器的配置
USART1_Configuration();//串口配置,
hc_sr04_init();//HC_SR04初始化配置好(即PC2,PC3的配置)


  while(1)
  {
GPIO_ResetBits(GPIOC,GPIO_Pin_0);//提示系統正常運行進該循環

 


Distance =(Get_hcsr04length()*340/2/1000);//從函數得到距離值,340是聲音的速度,除於2,是因為聲波發出到接收,是一次來回,除於1000,是將距離定為mm(毫米),該函數返回的就是之前time的值
printf("距離是%.2f\r\n",Distance);
delay_ms(1000);//延時1秒鍾,這樣不會輸出太過頻繁
  }
}

 

這是我的工程文件

 

百度網盤  密碼 v3y7

https://pan.baidu.com/s/1MNVf70_gnZ5aqSm6XInrMA

 

如有需要,可結合自己板子修改下代碼即可使用,歡迎交流,咱們共同進步

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM