這個是全網(wǎng)最詳細的STM32項目教學視頻。
第一篇在這里:
視頻在這里
15.1-超聲波測距
完成超聲波測距功能、測量數(shù)據(jù)顯示在OLED屏幕上
硬件介紹
使用:HC-SR04 超聲波測距模塊
注意: 繪制PCB注意四個引腳順序 Vcc Trig Echo Gnd
供電3.3V-5V(最好5V)
通過超聲波的硬件介紹我們知道
MCU給Trig腳一個大于10us的高電平脈沖;然后讀取Echo腳的高電平信號時間,通過公式:距離 = T* 聲速/2 就可以算出來距離。
Trig(PB5)我們配置為GPIO輸出
Echo(PA6)我們配置GPIO輸入功能
注:這里大家可能會問,為什么不使用定時器捕獲功能?
原因:
- 留一個定時器 方便以后擴展FreeRTOS使用
- 或者擴展其他舵機、電機等
軟件初始化
設置PB5輸出模式然后起別名
設置PA6輸入模式、
然后生成代碼
自己新建HC_SR04.c和HC_SR04.h 然后加入工程,指定路徑
防止溢出 把之前使用的數(shù)組調整大一些
因為我們不適用定時器所以我們需要自己寫一個us級延時函數(shù)
/*******************
* @brief us級延時
* @param usdelay:要延時的us時間
* @return
*
*******************/
void HC_SR04_Delayus(uint32_t usdelay)
{
__IO uint32_t Delay = usdelay * (SystemCoreClock / 8U / 1000U/1000);//SystemCoreClock:系統(tǒng)頻率
do
{
__NOP();
}
while (Delay --);
}
/*******************
* @brief HC_SR04讀取超聲波距離
* @param 無
* @return 障礙物距離單位:cm (靜止表面平整精度更高)
*注意:兩個HC_SR04_Read()函數(shù)調用的時間間隔要2ms及以上,測量范圍更大 精度更高
*******************/
float HC_SR04_Read(void)
{
uint32_t i = 0;
float Distance;
HAL_GPIO_WritePin(HC_SR04_Trig_GPIO_Port,HC_SR04_Trig_Pin,GPIO_PIN_SET);//輸出15us高電平
HC_SR04_Delayus(15);
HAL_GPIO_WritePin(HC_SR04_Trig_GPIO_Port,HC_SR04_Trig_Pin,GPIO_PIN_RESET);//高電平輸出結束,設置為低電平
while(HAL_GPIO_ReadPin(HC_SR04_Echo_GPIO_Port,HC_SR04_Echo_Pin) == GPIO_PIN_RESET)//等待回響高電平
{
i++;
HC_SR04_Delayus(1);
if(i>100000) return -1;//超時退出循環(huán)、防止程序卡死這里
}
i = 0;
while(HAL_GPIO_ReadPin(HC_SR04_Echo_GPIO_Port,HC_SR04_Echo_Pin) == GPIO_PIN_SET)//下面的循環(huán)是2us
{
i = i+1;
HC_SR04_Delayus(1);//1us 延時,但是整個循環(huán)大概2us左右
if(i >100000) return -2;//超時退出循環(huán)
}
Distance = i*2*0.033/2;//這里乘2的原因是上面是2微妙
return Distance ;
}
然后就可以讀距離了、連上藍牙可以顯示數(shù)據(jù)
注意:兩個HC_SR04_Read()函數(shù)調用的時間間隔要2ms及以上,測量范圍更大 精度更高
sprintf((char *)Usart3String,"HC_SR04:%.2fcmrn",HC_SR04_Read());//顯示超聲波數(shù)據(jù)
HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const char *)Usart3String),0xFFFF);//通過串口三輸出字符 strlen:計算字符串大小
然后把我們的手機藍牙和小車藍牙連接
手機顯示
15.2-避障邏輯編寫
然后我們編寫循跡邏輯,我們的邏輯時
//**************避障功能********************//
//避障邏輯
if(HC_SR04_Read() > 25)//前方無障礙物
{
motorPidSetSpeed(1,1);//前運動
HAL_Delay(100);
}
else{ //前方有障礙物
motorPidSetSpeed(-1,1);//右邊運動 原地
HAL_Delay(500);
if(HC_SR04_Read() > 25)//右邊無障礙物
{
motorPidSetSpeed(1,1);//前運動
HAL_Delay(100);
}
else{//右邊有障礙物
motorPidSetSpeed(1,-1);//左邊運動 原地
HAL_Delay(1000);
if(HC_SR04_Read() >25)//左邊無障礙物
{
motorPidSetSpeed(1,1);//前運動
HAL_Delay(100);
}
else{
motorPidSetSpeed(-1,-1);//后運動
HAL_Delay(1000);
motorPidSetSpeed(-1,1);//右邊運動
HAL_Delay(50);
}
}
}
這樣我們就可以使用超聲波讀取距離值了。
下篇16章我們i講解如何利用超聲波做跟隨,我們后面會定距離跟隨的功能。
聯(lián)系:Q,1930299709