1.軟件準(zhǔn)備
(1)編程平臺(tái):Keil5
(2)CubeMX
(3)XCOM(串口調(diào)試助手)
2.硬件準(zhǔn)備
(1)某寶買的超聲波模塊
?
(2)F1的板子,本例使用經(jīng)典F103C8T6
(3)ST-link?下載器
(4)USB-TTL模塊
(5)杜邦線若干
3.模塊資料
(1)模塊簡(jiǎn)介:
????????超聲波是振動(dòng)頻率高于20kHz的機(jī)械波。它具有頻率高、波長(zhǎng)短、繞射現(xiàn)象小、方向性好、能夠成為射線而定向傳播等特點(diǎn)。HC-SRO4是一款尺寸完全兼容老版本,增加UART和IIC功能的開(kāi)放式超聲波測(cè)距模塊,默認(rèn)條件下,軟件與硬件完全兼容老版本HC-SRO4;可以通過(guò)電阻設(shè)置成UART或IIC模式。2CM盲區(qū),4.5M典型最遠(yuǎn)測(cè)距,2.2mA作電流。采用升級(jí)解調(diào)芯片RCWL-9206,帶UART與IIC功能MCU:使其外圍更加簡(jiǎn)潔,工作電壓更寬(3-5.5V),接口功能更多。
(2)模塊參數(shù):
①專業(yè)解調(diào)測(cè)距芯片RCWL-9206
②支持GPIO,UART與IIC三種模式接口
③2.2mA工作電流
④2cm最小盲區(qū)
⑤2cm-450cm的超寬測(cè)量范圍
⑥工作溫度:-10°C-70°c
⑦3V-5.5V寬電壓供電
(3)工作原理
?(4)本例程實(shí)現(xiàn)思路:
? ? ? ? 程序采用狀態(tài)機(jī)編程,MCU給模塊Trig引腳輸出一個(gè)高電平脈沖-->模塊發(fā)送脈沖信號(hào)-->定時(shí)器啟動(dòng)高電平輸入捕獲-->模塊返回的高電平信號(hào)到達(dá)定時(shí)器開(kāi)始計(jì)數(shù)-->返回信號(hào)變?yōu)榈碗娖蕉〞r(shí)器停止計(jì)數(shù)-->得到定時(shí)器時(shí)間差-->根據(jù)公式計(jì)算距離
4.CubeMX配置
(1)芯片選擇
?(2)配置RCC、SYS、時(shí)鐘樹(shù)
配置RCC
配置SYS
配置時(shí)鐘樹(shù)
(3)配置GPIO
(4)配置串口1
?(5)配置定時(shí)器
?(6)開(kāi)啟定時(shí)器中斷
(7)設(shè)置路徑、生成代碼工程?
5、Keil5代碼
(1)勾選Use?MicroLIB
?
(2)創(chuàng)建SR04.c和SR04.h文件
(3)添加上述的SR04.c文件進(jìn)工程
——————上述兩步參考之前系列教學(xué)步驟,在此不再贅述(點(diǎn)擊跳轉(zhuǎn))
(4)SR04.c和SR04.h代碼
SR04.h
#ifndef __SR04_H
#define __SR04_H
#include "main.h"
#include "tim.h"
#include "stdio.h"
#define TRIG_H HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_SET)
#define TRIG_L HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET)
void delay_us(uint32_t us);
void SR04_GetData(void);
#endif
SR04.c
#include "SR04.h"
float distant; //測(cè)量距離
uint32_t measure_Buf[3] = {0}; //存放定時(shí)器計(jì)數(shù)值的數(shù)組
uint8_t measure_Cnt = 0; //狀態(tài)標(biāo)志位
uint32_t high_time; //超聲波模塊返回的高電平時(shí)間
//===============================================讀取距離
void SR04_GetData(void)
{
switch (measure_Cnt){
case 0:
TRIG_H;
delay_us(30);
TRIG_L;
measure_Cnt++;
__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); //啟動(dòng)輸入捕獲 或者: __HAL_TIM_ENABLE(&htim5);
break;
case 3:
high_time = measure_Buf[1]- measure_Buf[0]; //高電平時(shí)間
printf("\r\n----高電平時(shí)間-%d-us----\r\n",high_time);
distant=(high_time*0.034)/2; //單位cm
printf("\r\n-檢測(cè)距離為-%.2f-cm-\r\n",distant);
measure_Cnt = 0; //清空標(biāo)志位
TIM2->CNT=0; //清空計(jì)時(shí)器計(jì)數(shù)
break;
}
}
//===============================================us延時(shí)函數(shù)
void delay_us(uint32_t us)//主頻72M
{
uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
while (delay--)
{
;
}
}
//===============================================中斷回調(diào)函數(shù)
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//
{
if(TIM2 == htim->Instance)// 判斷觸發(fā)的中斷的定時(shí)器為TIM2
{
switch(measure_Cnt){
case 1:
measure_Buf[0] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//獲取當(dāng)前的捕獲值.
__HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING); //設(shè)置為下降沿捕獲
measure_Cnt++;
break;
case 2:
measure_Buf[1] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//獲取當(dāng)前的捕獲值.
HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_1); //停止捕獲 或者: __HAL_TIM_DISABLE(&htim5);
measure_Cnt++;
}
}
}
(5)usrat.c代碼添加
/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
/*********************************************************
*
*重定義 fputc 函數(shù)
*
*********************************************************/
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
return ch;
}
/* USER CODE END 1 */
(6)main函數(shù)
#include "SR04.h"
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM2_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
SR04_GetData( );
HAL_Delay(1500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
6.接線圖及效果
?
?10cm測(cè)距
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-785711.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-785711.html
本例程源碼下載:點(diǎn)擊跳轉(zhuǎn)?
到了這里,關(guān)于STM32系列(HAL庫(kù))——F103C8T6通過(guò)HC-SR04超聲波模塊實(shí)現(xiàn)測(cè)距的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!