国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

手把手教你,通過(guò)HAL庫(kù)實(shí)現(xiàn)STM32的超聲波測(cè)距--以SR-04為例

這篇具有很好參考價(jià)值的文章主要介紹了手把手教你,通過(guò)HAL庫(kù)實(shí)現(xiàn)STM32的超聲波測(cè)距--以SR-04為例。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

0、SR-04基本原理

1、準(zhǔn)備工作

2、連線

?3、STM32CUBEMX設(shè)置

3.1新建工程

3.2芯片通用設(shè)置

3.3定時(shí)器捕獲設(shè)置

?3.4其他設(shè)置

3.5生成工程

?4、程序完善

4.1完善打印輸出函數(shù)

?4.2完善tim.c

4.3完善gpio.c?

4.4完善main函數(shù)?

?5、總結(jié)


0、SR-04基本原理

聲波遇到障礙物會(huì)反射,而聲波的速度已知,所以只需要知道發(fā)射到接收的時(shí)間差,就能輕松計(jì)算出測(cè)量距離,再結(jié)合發(fā)射器和接收器的距離,就能算出障礙物的實(shí)際距離。

hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-619511.html

hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

?

以HC-SR04硬件為例,端口為VCC、Trig、Echo、GND。

VCC–接STM32板子+5V;
GND–接STM32板子GND;
Trig–為觸發(fā)控制信號(hào)輸入,觸發(fā)測(cè)距,給至少10us的高電平信號(hào),模塊自動(dòng)發(fā)射8個(gè)40KHz的方波,自動(dòng)檢測(cè)是否有信號(hào)返回;
Echo–回響信號(hào)輸出,有信號(hào)返回,通過(guò)IO口ECHO輸出一個(gè)高電平,高電平持續(xù)時(shí)間就是超聲波從發(fā)射到返回的時(shí)間。
那用STM32怎么給端口信號(hào)呢?又是怎么獲取信號(hào)呢?
Trig端口為超聲波模塊的輸入信號(hào),也就是通過(guò)STM23一個(gè)端口推挽輸出一個(gè)至少10us的高電平信號(hào)即可,利用delay_ms(20)實(shí)現(xiàn);
Echo端口為超聲波模塊的輸出信號(hào),也就是利用STM32端口捕獲高電平時(shí)間,那么這個(gè)端口肯定是可以用做定時(shí)器的端口。
通過(guò)以上分析,這里采用以下STM32端口

hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器?

1、準(zhǔn)備工作

開(kāi)發(fā)板:STM32F1精英版

軟件:STM32CubeMx軟件

IDE: MDK-Keil軟件

傳感器:HC-SR04

2、連線

選擇TIM5的CH1即PA0作為輸入捕獲引腳(Echo),選擇PA5作為觸發(fā)腳Trig。具體連接線如下:

紅線連接精英版的5V與SR04的VCC腳

白線連接精英板的GND與SR04的GND腳

橙色線連接精英板的PA5與Trig腳

黑色線連接精英板的PA0與Echo腳

hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

?3、STM32CUBEMX設(shè)置

3.1新建工程

1)新建工程

hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

2)選擇芯片

hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

3.2芯片通用設(shè)置

1)時(shí)鐘芯片設(shè)置

hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

2)時(shí)鐘設(shè)置

hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

3)系統(tǒng)調(diào)試設(shè)置

hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

3.3定時(shí)器捕獲設(shè)置

由于前文連線中,我們將TIMER5CH1作為輸入捕獲引腳,所以對(duì)TIMER5進(jìn)行設(shè)置:

Channel 1選擇:Input Capture direct mode

與分頻系數(shù)填寫(xiě):72-1(則每次計(jì)數(shù)為1us)

Polarity Selection選擇:Rising Edge(上升沿)

其他保持不變。

hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

NVIC settings選擇TIM5 global interrupt

3.4其他設(shè)置

1)USART1設(shè)置

為了方便調(diào)試,將測(cè)量所得數(shù)據(jù)通過(guò)串口傳遞到電腦上進(jìn)行顯示,此處使用串口1通過(guò)printf將輸出發(fā)送至電腦。

hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

?2)GPIO配置

?此處選擇PA5作為Trig腳,具體配置如下:

hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

3.5生成工程

hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

?4、程序完善

4.1完善打印輸出函數(shù)

在main函數(shù)中加入下面語(yǔ)句:

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "string.h"
/* USER CODE END Includes */


/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
#ifdef __GNUC__
	#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
	#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
	
PUTCHAR_PROTOTYPE
{
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
	return ch;
}
/* USER CODE END 0 */

加入此語(yǔ)句之后可以在main函數(shù)中加入printf語(yǔ)句測(cè)試是否成功。

將精英板USB232口通過(guò)USB數(shù)據(jù)線與電腦連接,并在電腦上打開(kāi)串口調(diào)試軟件:?hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

?hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

?4.2完善tim.c

在tim.c中加入以下程序:

定義變量:

/* USER CODE BEGIN 0 */
//捕獲狀態(tài)
//[7]:0,沒(méi)有成功的捕獲;1,成功捕獲到一次.
//[6]:0,還沒(méi)捕獲到低電平;1,已經(jīng)捕獲到低電平了.
//[5:0]:捕獲低電平后溢出的次數(shù)
uint8_t  TIM5CH2_CAPTURE_STA=0;							//輸入捕獲狀態(tài)		    				
uint16_t TIM5CH2_CAPTURE_VAL;							//輸入捕獲值(TIM2是16位)
/* USER CODE END 0 */

?在底部加入溢出回調(diào)函數(shù)和輸入捕獲回調(diào)函數(shù)。其中參考了正點(diǎn)原子官方的的輸入 捕獲回調(diào)函數(shù)。

/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//更新中斷(溢出)發(fā)生時(shí)執(zhí)行
{
	if((TIM5CH2_CAPTURE_STA&0X80) ==0)		//還未捕獲成功
	{
		if(TIM5CH2_CAPTURE_STA&0X40)		//捕獲到一個(gè)下降沿
		{
			if((TIM5CH2_CAPTURE_STA&0X3F)==0X3F)	//高電平時(shí)間太長(zhǎng)了
			{
				TIM5CH2_CAPTURE_STA |= 0X80;	//標(biāo)記成功捕獲一次
				TIM5CH2_CAPTURE_VAL = 0XFFFF;	//
			}
			
			else
				TIM5CH2_CAPTURE_STA++;			//否則標(biāo)記溢出數(shù)加一
		}
	}

}

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕獲中斷發(fā)生時(shí)執(zhí)行
{
	if((TIM5CH2_CAPTURE_STA&0x80)==0)	//還未捕獲成功
	{
		if(TIM5CH2_CAPTURE_STA&0x40)	//成功捕獲到一個(gè)下降沿
		{
			TIM5CH2_CAPTURE_STA |= 0X80;	//標(biāo)記成功,捕獲到一次高電平完成
			TIM5CH2_CAPTURE_VAL  = HAL_TIM_ReadCapturedValue(&htim5, TIM_CHANNEL_1);	//獲取當(dāng)前捕獲值
			TIM_RESET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1);			//清除原來(lái)設(shè)置
			TIM_SET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1, TIM_ICPOLARITY_RISING);	//捕獲到下降沿后,將捕獲復(fù)位到捕獲上升沿
		}
		
		else							//捕獲到一個(gè)上升沿
		{
			TIM5CH2_CAPTURE_STA = 0;
			TIM5CH2_CAPTURE_VAL = 0;
			TIM5CH2_CAPTURE_STA |= 0x40;	//第六位標(biāo)記為捕獲到上升沿
			__HAL_TIM_DISABLE(&htim5);		//關(guān)閉定時(shí)器
			__HAL_TIM_SET_COUNTER(&htim5, 0);	//定時(shí)器初始值設(shè)置為0
			TIM_RESET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1);
			TIM_SET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1, TIM_ICPOLARITY_FALLING);	//捕獲到上升沿之后,將捕獲設(shè)置為下降沿
			__HAL_TIM_ENABLE(&htim5);
			
		}
	
	}
}
/* USER CODE END 1 */

4.3完善gpio.c?

模擬Trig腳,先置位,過(guò)40us后,復(fù)位。

/* USER CODE BEGIN 2 */
void CHL_capture(void)
{
	uint32_t i;
	
	HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_SET);
	for(i=0;i<72*40;i++)
		__NOP();
	HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_RESET);

}
/* USER CODE END 2 */

4.4完善main函數(shù)?

int main(void)
{
  /* USER CODE BEGIN 1 */
	float len = 0;
	uint32_t time= 0;
	uint8_t count = 0;
  /* 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_TIM5_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	printf("Hello World!\r\n");
	HAL_TIM_IC_Start_IT(&htim5,TIM_CHANNEL_1);   //開(kāi)啟TIM2的捕獲通道2,并且開(kāi)啟捕獲中斷
    __HAL_TIM_ENABLE_IT(&htim5,TIM_IT_UPDATE);   //使能更新中斷

	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  HAL_Delay(100);
	  CHL_capture();
	  if(TIM5CH2_CAPTURE_STA & 0x80)	//成功捕獲一個(gè)脈寬
	  {
			time = TIM5CH2_CAPTURE_STA & 0x3F;	//獲取溢出次數(shù)
			time *= 65536;		//獲得溢出的時(shí)間值
			time += TIM5CH2_CAPTURE_VAL;	//加上最后一次取得的值
			len = time * 342.62*100/2000000;
		  
			TIM5CH2_CAPTURE_STA = 0;
	  }
	  
	  printf("LENGTH: %f CM\r\n", len);
  }
  /* USER CODE END 3 */
}

?5、總結(jié)

本文介紹了通過(guò)HAL庫(kù)完成SR-04超聲波傳感器距離的測(cè)量。包括了,超聲波傳感器的原理、STM32CUBEMX的配置,以及程序的完善。最終的結(jié)果如下:

hal庫(kù)超聲波測(cè)距,嵌入式,單片機(jī),stm32,HAL庫(kù),超聲波傳感器

?

到了這里,關(guān)于手把手教你,通過(guò)HAL庫(kù)實(shí)現(xiàn)STM32的超聲波測(cè)距--以SR-04為例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32系列——手把手教你將SYN6288語(yǔ)音播報(bào)模塊的標(biāo)準(zhǔn)庫(kù)程序轉(zhuǎn)為hal庫(kù)使用

    STM32系列——手把手教你將SYN6288語(yǔ)音播報(bào)模塊的標(biāo)準(zhǔn)庫(kù)程序轉(zhuǎn)為hal庫(kù)使用

    目錄 前言 1. 原理 2. Cubmx配置 3. keil5編寫(xiě)代碼 3.1 main.c 3.2 syn6288.c 3.3 syn6288.h 本教程基于 stm32f103c8t6 最小系統(tǒng)板, hal庫(kù) 開(kāi)發(fā)。 操作簡(jiǎn)單,講解直接清楚,旨在讓大家少走彎路。 SYN6288就是用到一個(gè)串口資源即可,用STM32開(kāi)發(fā)起來(lái)不難。 配置串口3為異步通信模式?,注意波特率

    2024年02月07日
    瀏覽(139)
  • STM32系列——手把手教你藍(lán)牙模塊HC05、HC06的使用,重在“用起來(lái)”(HAL庫(kù))

    STM32系列——手把手教你藍(lán)牙模塊HC05、HC06的使用,重在“用起來(lái)”(HAL庫(kù))

    不論是HC05還是HC06,我們用到的都是藍(lán)牙模塊的透?jìng)鞴δ?,只需要用?個(gè)引腳:RXD、TXD、VCC(5V)、GND。 1、HC-05有6個(gè)引腳,但是我們只用到4個(gè)。 2、HC-05正面有一個(gè)按鍵。與HC-06的區(qū)別是, 它上電之前必須要按住此按鍵再插入電腦中,才能夠進(jìn)入AT模式 。HC-06沒(méi)有按鍵,直接

    2024年02月05日
    瀏覽(100)
  • 手把手教你STM32入門教程(標(biāo)準(zhǔn)庫(kù))

    手把手教你STM32入門教程(標(biāo)準(zhǔn)庫(kù))

    目錄 前言 步驟一:準(zhǔn)備工作 步驟二:安裝Keil?MDK-ARM開(kāi)發(fā)工具 步驟三:創(chuàng)建工程 步驟四:配置工程 步驟六:編寫(xiě)代碼 步驟七:下載程序? ?總結(jié) 在物聯(lián)網(wǎng)時(shí)代,嵌入式系統(tǒng)的應(yīng)用越來(lái)越廣泛,而STM32作為業(yè)內(nèi)領(lǐng)先的嵌入式芯片之一,受到了越來(lái)越多開(kāi)發(fā)者的關(guān)注和喜愛(ài)。然

    2024年02月12日
    瀏覽(23)
  • 手把手教你編寫(xiě)跑馬燈——STM32

    手把手教你編寫(xiě)跑馬燈——STM32

    新建一個(gè)文件夾 ,打開(kāi)KeiL,projiece-----new vision projection ?給文件命名(隨便?。??根據(jù)自己開(kāi)發(fā)板的信號(hào)選擇對(duì)應(yīng)的型號(hào) ?在剛才創(chuàng)建的文件夾里面 新建一個(gè)main.c文件 ?雙擊source group 1,點(diǎn)擊main.c,點(diǎn)擊add ?添加頭文件 led.c main.c led就可以全亮然后全滅一直循環(huán)

    2024年02月08日
    瀏覽(102)
  • 手把手教你寫(xiě)stm32f103智能風(fēng)扇

    手把手教你寫(xiě)stm32f103智能風(fēng)扇

    本系統(tǒng)可以分為兩個(gè)模式來(lái)進(jìn)行運(yùn)行,分別為手動(dòng)模式和自動(dòng)模式,同時(shí),在上電進(jìn)入系統(tǒng)后,還會(huì)有一個(gè)模式選擇的界面產(chǎn)生。 模式選擇:在此界面中,可以通過(guò)按鍵K1來(lái)控制模式選擇,兩個(gè)模式分別為手動(dòng)模式和自動(dòng)模式;通過(guò)按鍵K2可以進(jìn)入模式。 手動(dòng)模式:在手動(dòng)模

    2023年04月17日
    瀏覽(93)
  • 實(shí)現(xiàn)語(yǔ)音識(shí)別系統(tǒng):手把手教你使用STM32C8T6和LD3320(SPI通信版)實(shí)現(xiàn)語(yǔ)音識(shí)別

    實(shí)現(xiàn)語(yǔ)音識(shí)別系統(tǒng):手把手教你使用STM32C8T6和LD3320(SPI通信版)實(shí)現(xiàn)語(yǔ)音識(shí)別

    ????????本文實(shí)際是對(duì)LD3320(SPI通信版)的個(gè)人理解,如果單論代碼和開(kāi)發(fā)板的資料而言,其實(shí)當(dāng)你購(gòu)買LD3320的時(shí)候,賣家已然提供了很多資料。我在大學(xué)期間曾經(jīng)多次使用LD3320芯片的開(kāi)發(fā)板用于設(shè)計(jì)系統(tǒng),我在我的畢業(yè)設(shè)計(jì)作品中也有添加這個(gè)系統(tǒng)功能,用于添加整個(gè)系

    2024年02月06日
    瀏覽(37)
  • 動(dòng)手實(shí)踐丨手把手教你用STM32做一個(gè)智能魚(yú)缸

    動(dòng)手實(shí)踐丨手把手教你用STM32做一個(gè)智能魚(yú)缸

    摘要: 本文基于STM32單片機(jī)設(shè)計(jì)了一款基于物聯(lián)網(wǎng)的智能魚(yú)缸。 本文分享自華為云社區(qū)《基于STM32+華為云IOT設(shè)計(jì)的物聯(lián)網(wǎng)魚(yú)缸【玩轉(zhuǎn)華為云】》,作者: DS小龍哥 。 為了緩解學(xué)習(xí)、生活、工作帶來(lái)的壓力,提升生活品質(zhì),許多人喜歡在家中、辦公室等場(chǎng)所養(yǎng)魚(yú)。為節(jié)省魚(yú)友

    2024年01月16日
    瀏覽(29)
  • FPGA之手把手教你寫(xiě)串口協(xié)議解析(STM32與FPGA數(shù)據(jù)互傳)

    最近趁熱打鐵做了一個(gè)關(guān)于STM32與FPGA通信并且控制高速DA模塊產(chǎn)生不同頻率信號(hào)的正弦波、方波、三角波和鋸齒波的項(xiàng)目,從中收獲到了很多東西,也踩了一些雷和坑,將分為幾篇文章將整個(gè)過(guò)程分享出來(lái)。 這一次準(zhǔn)備分享的是對(duì)串口數(shù)據(jù)的解析和賦值。解析的數(shù)據(jù)由STM32發(fā)

    2024年02月06日
    瀏覽(28)
  • 手把手教你使用USB的CDC+MSC復(fù)合設(shè)備(基于stm32f407)

    手把手教你使用USB的CDC+MSC復(fù)合設(shè)備(基于stm32f407)

    ??最近對(duì)usb有點(diǎn)興趣,感覺(jué)挺好玩的,于是買了本圈圈大神的經(jīng)典著作-圈圈教你玩USB,里面使用51單片機(jī)+usb芯片對(duì)usb的基本知識(shí)潺潺道來(lái),做了十個(gè)左右的常用案例實(shí)驗(yàn),很有趣,建議大家看看。 ??趁熱打鐵,拿身邊的開(kāi)發(fā)板來(lái)練練手,探索一下復(fù)合設(shè)備的好玩方便的

    2024年02月13日
    瀏覽(99)
  • 基于STM32F103RCT6之手把手教你寫(xiě)智能家居項(xiàng)目(2)

    基于STM32F103RCT6之手把手教你寫(xiě)智能家居項(xiàng)目(2)

    ??????? 上一節(jié)我們簡(jiǎn)述了智能家居項(xiàng)目,實(shí)現(xiàn)了點(diǎn)燈的相關(guān)代碼編寫(xiě),還有WIFI模塊的固件燒錄。 連接什么平臺(tái): ??????? 我們想要遠(yuǎn)程控制家具的開(kāi)關(guān)和獲取家中的狀態(tài),少不了一個(gè)可以傳輸數(shù)據(jù)的云平臺(tái)。我認(rèn)為易監(jiān)控是一個(gè)簡(jiǎn)單好用的云平臺(tái)。 怎么連接平臺(tái):

    2024年02月20日
    瀏覽(909)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包