⑴ 關於用單片機控制超聲波測距模塊的問題
這可能是你的超聲波模塊設計就如此.
模塊在發射超聲波時輸出高電平,在接收到反射信號後,將輸出復位成低電平。這個高電平時間就是超聲波在某塊與障礙物之間往返一次所需的時間。
當無障礙物時,高電平會無限期延續下去,這樣就無法啟動下一個超聲波發送,必須在經過一個特定的時間後,強制復位。這個時間也就決定了這個模塊的最大檢測距離。
超聲波脈沖有一定寬度,當超聲波在模塊與障礙物之間來回一次所需時間小於脈沖寬度,反射信號與發射信號重疊,某塊也無法識別。超聲波的脈沖寬度決定了最小探測距離。
⑵ 怎麼用單片機控制兩個超聲波模塊測距 可以測一個但是兩個要怎麼辦 求大神!!!感激
這個跟你的程序流程有關系,你要設計好,兩個測距模塊的話。
第一個時間,A發射,然後接收好,記下數據後。再延時一會兒(消除雜波影響)。再啟動B模塊,也是發射,接收,記下數據。再延時一會兒。再啟動A。
單片機裡面大部分的功能實體都有2套,所以上面這種方法足夠用了。
⑶ 求教,stm32怎麼用超聲波模塊測距,用的是HC-SR04
設置gpio口,還需使用定時器,根據超聲波測距模塊的使用說明進行開發,一般是操作一個觸發引腳,一個返回方波信號的引腳。承接單片機項目開發。
⑷ 超聲波模塊怎樣連接單片機
模塊有說明書的,一般的超聲波模塊vcc接5v,trig接單片機io口,echo接單片機io口,gnd接地。
⑸ stm32引腳接超聲波介面用什麼模式
stm32引腳接超聲波介面用什麼模式
超聲波模塊測得的距離一直是固定值的同仁看過來:
如果你是用3.3v給開發板供電,但用到了開發板的5v給HC-SR04供電,那麼你就和我掉進的同一個坑
出現這個問題的原因是STM32開發板一般沒有升壓晶元或其他升壓措施,因此低於5v給開發板供電是不可能輸出5v電壓的 ,根據測量它只有2.86v,這就導致了HC-SR04供電不足的問題
在我認為是代碼問題並修改了16個小時的最後一分鍾,我發現他是供電不足引起的,這一結論真讓我哭笑不得
開篇閑諞:
耀風(鄙人)是一個STM32才入門的小白所以文章寫的不是很嚴謹,如果有錯誤歡迎大家指正。我寫這篇文章的目的有兩個:
第一,記錄本次實驗方便自己以後查看(畢竟卡了我16個小時,錯誤原因竟然是哭笑不得的供電不足)。
第二,分享給其他在學或還不知道怎麼使用超聲波模塊的同仁,避免犯和我一樣的錯誤。
編程IDE工具: KEIL5
實驗所需材料:
1.STM32F1系列單片機任意一款
2. HC_SR04超聲波模塊
3.杜邦線若干
引腳連接:
Tring —>PA4
Echo —>PA5
GND —>GND
VCC —>5v~5.5v
網上資料說超聲波模塊的供電電壓在3~5.5v,但是還是建議用5v左右,因為穩定。如果STM32不是5v供電,那麼就不要用STM32開發板上的引腳給HC_SR04供電。
原因就是STM32開發板一般沒有升壓晶元或其他升壓措施,因此低於5v給開發板供電是不可能輸出5v電壓的 (再啰嗦一遍)
實驗原理:
通過STM32的GPIO給HC_SR04模塊的Tring引腳輸出一個至少10us的高電平開啟超聲波模塊,然後超聲波模塊就會自動發送一個連續的由8個40KHZ脈沖組成的脈沖串,發送完成後HC_SR04模塊的Echo引腳會變成低電平並且HC_SR04模塊的晶元也會開始時。如果HC_SR04發出的脈沖串遇到障礙物就會被反射回來,當超聲波模塊接收到返回的脈沖串時就會將Echo引腳變成高電平並且HC_SR04模塊的晶元也會停止計時,Echo引腳輸出高電平的時間就是脈沖串從發出到接收的時間。
由上面這巴拉巴拉的一段話我們可以知道驅動HC_SR04的步驟:
1. 通過STM32的GPIO給HC_SR04的Tring引腳輸出一個至少10us的高電平
2. 當HC_SR04的Echo引腳輸出高電平時開啟STM32的定時器或Systick定時器開始計時,當Echo引腳輸出低電平時停止計時,並記錄時間
3. 根據時間算距離
distance = T(所測時間)x 340m/s / 2 = T(所測時間) x 170m/s = T(所測時間) x 17000 cm / 1000 000 us = T(所測時間)/ 1000 000 us / 17000 cm = T(所測時間)/ 58.0(近似值)
不想看上面推導的朋友知道距離 distance = T(所測時間)/ 58.0 就可以了
代碼核心片段講解:
//**********引腳初始化*************
void init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/***********延時函數定義(使用Systick定時器實現)**************
1.用Systick定時器的原因就是它操作簡單一點,不用初始化,直接調用SysTick_Config()函數即可,然後在寫個相應中斷函數就可
2.因為在本項目中延時和定時不用同時運行,所以這兩個功能用一個定時器就好
*************************************************************/
void delay_ms(uint32_t time)
{
TIME = time;
State = 0; // 用於區分是Systick因延時的進入中斷還是因定時進入中斷
SysTick_Config(72000); //定時器每1ms計時一次
while(TIME!=0);
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk; //關閉定時器
}
void delay_us(uint32_t time)
{
TIME = time;
State = 0;// 用於區分是Systick因延時的進入中斷還是因定時進入中斷
SysTick_Config(72);//定時器每1us計時一次
while(TIME!=0);
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;//關閉定時器
}
//************測引腳電平持續時間函數定義******************
uint32_t pulseIn(GPIO_TypeDef* GPIOx,uint16_t Pin,STATE state)
{
uint32_t time = 0;
uint8_t i ;
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == (u8)!state){}
State = 1;
TIME = 0;
SysTick_Config(72); //一定要以1us為溢出時間,因為算距離的公式中的T是以us為單位的
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == (u8)state){}
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
time = TIME;
TIME = 0;
printf(" Time = %d\n",time);
return time;
}
extern int TIME;
extern uint8_t State;
void SysTick_Handler(void)
{
if(State == 0) //因延時函數中的SysTick定時器溢出進入
TIME--;
else if(State == 1) //因定時中的SysTick定時器溢出進入
TIME++;
}
int main(void)
{
init();
Usart_begin(USART1,9600); //這是我自己寫的STM32庫函數二次封裝中的USART1初始化函數
//啊吧啊吧,本來整個工程都是用我開發的二次封裝寫的,奈何我竟傻傻的16個小時都認為是代碼問題,所以就改掉了。
while(1){
float distance;
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
delay_us(10);
GPIO_SetBits(GPIOA,GPIO_Pin_4);
delay_us(20);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
distance = (float)pulseIn(GPIOA, GPIO_Pin_5,HIGH)/58.0; //算出距離(58.0的原因前面有講解)
printf("distance = %.2lf\n",distance);
delay_ms(200);
}
}
登錄後復制
後面我會專門寫一個這個二次封裝用法的文章的,大家先搞著用這個四不像的工程代碼吧。啊吧啊吧
輸出正常:
代碼分享:
耀風寫的代碼,需要請點擊下載
提取碼:YFJS
⑹ 超聲波模塊怎麼發出發射脈沖的
使用單片機或DSP產生脈沖,然後脈沖再加到換能器上面,換能器就可以打出超聲波了