這是最后的實驗現象,改變不同的角度即可測得距離
板子 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
如有需要,可結合自己板子修改下代碼即可使用,歡迎交流,咱們共同進步