stm32F1使用us-100超聲波測距
依舊,使用CubeMX進(jìn)行外設(shè)配置。
使用電平方式,需要進(jìn)行兩次捕捉,而且發(fā)送10us觸發(fā)脈沖,需要延時(shí)。103VBT6的Timer不多,還是UART口方便。
硬件配置:
1)UART波特率設(shè)為9600
2)開啟NVIC中斷
軟件:
我使用US-100測量料斗里的顆粒料消耗,項(xiàng)目使用Freertos系統(tǒng)。
1)
在main函數(shù)里啟用UART2端口監(jiān)聽
HAL_UART_Receive_IT(&huart2,rx_data_sonic,2);
觸發(fā)模塊后,它會返回2個(gè)字節(jié)的數(shù)據(jù),這里直接讀2個(gè)。
2)
在Task里每10秒觸發(fā)一次,發(fā)送一個(gè)字節(jié)0x55。任務(wù)是20ms運(yùn)行一次,使用一個(gè)計(jì)數(shù)。
check_interval++;
if(check_interval>=499){
HAL_UART_Transmit(&huart2,&command_sonic,1,1);
check_interval=0;
}
3)
在中斷回調(diào)函數(shù)里做計(jì)算。
料斗高度是50厘米,因此限制返回的值。譬如把料斗蓋打開,測的幾米的數(shù)據(jù),扔掉不用??刹槐乜紤]料斗打開的情況。
//超聲波數(shù)據(jù)
if(huart->Instance==USART2){
uint16_tdistance=rx_data_sonic[0]*256+rx_data_sonic[1];
if(Q_SonicDataHandle!=NULL){
if(distance<500){
osMessagePut(Q_SonicDataHandle,(uint32_t)distance,0);
}
}
HAL_UART_Receive_IT(&huart2,rx_data_sonic,2);
}
語句末尾要再次啟動(dòng)串口中斷監(jiān)聽。