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

【CubeMX配置STM32驅(qū)動(dòng)超聲波模塊(HC-SR04)】

這篇具有很好參考價(jià)值的文章主要介紹了【CubeMX配置STM32驅(qū)動(dòng)超聲波模塊(HC-SR04)】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

CubeMX配置STM32以驅(qū)動(dòng)超聲波模塊(HC-SR04)

一、CubeMX配置STM32
1、選擇定時(shí)器

【CubeMX配置STM32驅(qū)動(dòng)超聲波模塊(HC-SR04)】
選擇輸入捕獲模式
預(yù)分頻設(shè)置為71,向上計(jì)數(shù),自動(dòng)重裝值65535
【CubeMX配置STM32驅(qū)動(dòng)超聲波模塊(HC-SR04)】
然后將名字改為ECHO
【CubeMX配置STM32驅(qū)動(dòng)超聲波模塊(HC-SR04)】

2、配置TRIG口

【CubeMX配置STM32驅(qū)動(dòng)超聲波模塊(HC-SR04)】
這里的端口使用其它空閑的IO口是可以的,設(shè)置為輸出模式,其它配置不需要改變,最主要的是User Label那兒,需要設(shè)置為TRIG,因?yàn)轵?qū)動(dòng)函數(shù)里面使用的是這個(gè)的宏定義,所以必須要改成這個(gè)名字才能直接使用驅(qū)動(dòng)函數(shù)。

3、配置串口

因?yàn)橐@示超聲波測(cè)出的距離,我這里就直接使用串口助手顯示了,有需要的話(huà)使用OLED、TFT之類(lèi)的模塊顯示也可以。
【CubeMX配置STM32驅(qū)動(dòng)超聲波模塊(HC-SR04)】
在這里如果需要使用printf函數(shù)的話(huà),還需要在生成的usart.c里面添加fputc函數(shù)

/*********************************************************
*
*重定義 fputc 函數(shù)
*
*********************************************************/
int fputc(int ch,FILE *f)
{
	HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
	return ch;
}

在這之前記得引入頭文件stdio.h、勾選Use MicroLIB

二、使用keil5進(jìn)行進(jìn)一步開(kāi)發(fā)
1、引入HC-SR04的驅(qū)動(dòng)文件

hc-sr04.c

/*
 * @Author       : yzy
 * @Date         : 2021-05-31 17:03:23
 * @LastEditors  : yzy
 * @LastEditTime : 2021-06-21 22:16:28
 * @Description  : 
 * @FilePath     : \CSDN_HC-SR04_GPIO\BSP_HARDWARE\HC-SR04\hc-sr04.c
 */
#include "hc-sr04.h"

Hcsr04InfoTypeDef Hcsr04Info;

/**
 * @description: 超聲波模塊的輸入捕獲定時(shí)器通道初始化
 * @param {TIM_HandleTypeDef} *htim
 * @param {uint32_t} Channel
 * @return {*}
 */
void Hcsr04Init(TIM_HandleTypeDef *htim, uint32_t Channel)
{
  /*--------[ Configure The HCSR04 IC Timer Channel ] */
  // MX_TIM2_Init();  // cubemx中配置
  Hcsr04Info.prescaler = htim->Init.Prescaler; //  72-1
  Hcsr04Info.period = htim->Init.Period;       //  65535

  Hcsr04Info.instance = htim->Instance;        
  if(Hcsr04Info.ic_tim_ch == TIM_CHANNEL_1)
  {
    Hcsr04Info.active_channel = HAL_TIM_ACTIVE_CHANNEL_1;             //  TIM_CHANNEL_1
  }
  else if(Hcsr04Info.ic_tim_ch == TIM_CHANNEL_2)
  {
    Hcsr04Info.active_channel = HAL_TIM_ACTIVE_CHANNEL_2;             //  TIM_CHANNEL_2
  }
  else if(Hcsr04Info.ic_tim_ch == TIM_CHANNEL_3)
  {
    Hcsr04Info.active_channel = HAL_TIM_ACTIVE_CHANNEL_3;             //  TIM_CHANNEL_3
  }
  else if(Hcsr04Info.ic_tim_ch == TIM_CHANNEL_4)
  {
    Hcsr04Info.active_channel = HAL_TIM_ACTIVE_CHANNEL_4;             //  TIM_CHANNEL_4
  }
  /*--------[ Start The ICU Channel ]-------*/
  HAL_TIM_Base_Start_IT(htim);
  HAL_TIM_IC_Start_IT(htim, Channel);//開(kāi)啟中斷
}

/**
 * @description: HC-SR04觸發(fā)
 * @param {*}
 * @return {*}
 */
void Hcsr04Start(void)
{
  HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_SET);
  HAL_Delay(1);  //  10us以上
  HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_RESET);
}

/**
 * @description: 定時(shí)器計(jì)數(shù)溢出中斷處理函數(shù)
 * @param {*}    main.c中重定義void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim)
 * @return {*}
 */
void Hcsr04TimOverflowIsr(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == Hcsr04Info.instance) //  
  {
    Hcsr04Info.tim_overflow_counter++;
  }
}

/**
 * @description: 輸入捕獲計(jì)算高電平時(shí)間->距離
 * @param {*}    main.c中重定義void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
 * @return {*}
 */
void Hcsr04TimIcIsr(TIM_HandleTypeDef* htim)
{
  if((htim->Instance == Hcsr04Info.instance) && (htim->Channel == Hcsr04Info.active_channel))
  {
    if(Hcsr04Info.edge_state == 0)      //  捕獲上升沿
    {
      // 得到上升沿開(kāi)始時(shí)間T1,并更改輸入捕獲為下降沿
      Hcsr04Info.t1 = HAL_TIM_ReadCapturedValue(htim, Hcsr04Info.ic_tim_ch);
      __HAL_TIM_SET_CAPTUREPOLARITY(htim, Hcsr04Info.ic_tim_ch, TIM_INPUTCHANNELPOLARITY_FALLING);
      Hcsr04Info.tim_overflow_counter = 0;  //  定時(shí)器溢出計(jì)數(shù)器清零
      Hcsr04Info.edge_state = 1;        //  上升沿、下降沿捕獲標(biāo)志位
    }
    else if(Hcsr04Info.edge_state == 1) //  捕獲下降沿
    {
      // 捕獲下降沿時(shí)間T2,并計(jì)算高電平時(shí)間
      Hcsr04Info.t2 = HAL_TIM_ReadCapturedValue(htim, Hcsr04Info.ic_tim_ch);
      Hcsr04Info.t2 += Hcsr04Info.tim_overflow_counter * Hcsr04Info.period; //  需要考慮定時(shí)器溢出中斷
      Hcsr04Info.high_level_us = Hcsr04Info.t2 - Hcsr04Info.t1; //  高電平持續(xù)時(shí)間 = 下降沿時(shí)間點(diǎn) - 上升沿時(shí)間點(diǎn)
      // 計(jì)算距離
      Hcsr04Info.distance = (Hcsr04Info.high_level_us / 1000000.0) * 340.0 / 2.0 * 100.0;
      // 重新開(kāi)啟上升沿捕獲
      Hcsr04Info.edge_state = 0;  //  一次采集完畢,清零
      __HAL_TIM_SET_CAPTUREPOLARITY(htim, Hcsr04Info.ic_tim_ch, TIM_INPUTCHANNELPOLARITY_RISING);
    }
  }
}

/**
 * @description: 讀取距離 
 * @param {*}
 * @return {*}
 */
float Hcsr04Read(void)
{
  // 測(cè)距結(jié)果限幅
  if(Hcsr04Info.distance >= 450)
  {
    Hcsr04Info.distance = 450;
  }
  return Hcsr04Info.distance;
}


hc-sr04.h

/*
 * @Author       : yzy
 * @Date         : 2021-05-31 17:03:27
 * @LastEditors  : yzy
 * @LastEditTime : 2021-05-31 19:02:54
 * @Description  : 
 * @FilePath     : \F103_Test\BSP_HARDWARE\hc-sr04.h
 */
#ifndef HCSR04_H_
#define HCSR04_H_

#include "main.h"

typedef struct
{
	uint8_t  edge_state;
	uint16_t tim_overflow_counter;
	uint32_t prescaler;
	uint32_t period;
	uint32_t t1;	//	上升沿時(shí)間
	uint32_t t2;	//	下降沿時(shí)間
	uint32_t high_level_us;	//	高電平持續(xù)時(shí)間
	float    distance;
	TIM_TypeDef* instance;
  uint32_t ic_tim_ch;
	HAL_TIM_ActiveChannel active_channel;
}Hcsr04InfoTypeDef;

extern Hcsr04InfoTypeDef Hcsr04Info;

/**
 * @description: 超聲波模塊的輸入捕獲定時(shí)器通道初始化
 * @param {TIM_HandleTypeDef} *htim
 * @param {uint32_t} Channel
 * @return {*}
 */
void Hcsr04Init(TIM_HandleTypeDef *htim, uint32_t Channel);

/**
 * @description: HC-SR04觸發(fā)
 * @param {*}
 * @return {*}
 */
void Hcsr04Start(void);

/**
 * @description: 定時(shí)器計(jì)數(shù)溢出中斷處理函數(shù)
 * @param {*}    main.c中重定義void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim)
 * @return {*}
 */
void Hcsr04TimOverflowIsr(TIM_HandleTypeDef *htim);

/**
 * @description: 輸入捕獲計(jì)算高電平時(shí)間->距離
 * @param {*}    main.c中重定義void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
 * @return {*}
 */
void Hcsr04TimIcIsr(TIM_HandleTypeDef* htim);

/**
 * @description: 讀取距離 
 * @param {*}
 * @return {*}
 */
float Hcsr04Read(void);

#endif /* HCSR04_H_ */


驅(qū)動(dòng)文件里面函數(shù)的具體使用都有介紹,我就不做過(guò)多解釋了。

2、添加中斷回調(diào)函數(shù)

如果有了解過(guò)超聲波的工作原理的話(huà)就可以知道使用到了定時(shí)器,我們還配置了TIM4一通道為輸入捕獲,所以我們需要輸出捕獲中斷和定時(shí)器溢出中斷的回調(diào)函數(shù)。

/* USER CODE BEGIN 4 */
/**
 * @description: 定時(shí)器輸入捕獲中斷
 * @param {TIM_HandleTypeDef} *htim
 * @return {*}
 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  Hcsr04TimIcIsr(htim);
}

/**
 * @description: 定時(shí)器溢出中斷
 * @param {*}
 * @return {*}
 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
		Hcsr04TimOverflowIsr(htim);
}
/* USER CODE END 4 */

示例:

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_USART1_UART_Init();
  MX_TIM4_Init();
  /* USER CODE BEGIN 2 */
  Hcsr04Init(&htim4, TIM_CHANNEL_1);  //  超聲波模塊初始化
  Hcsr04Start();  //  開(kāi)啟超聲波模塊測(cè)距
  printf("hc-sr04 start!\r\n");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    // 打印測(cè)距結(jié)果
    
    Hcsr04Start();
		printf("distance:%.1f cm\r\n", Hcsr04Read());
    HAL_Delay(300); //  測(cè)距周期300ms
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

效果圖如下:
【CubeMX配置STM32驅(qū)動(dòng)超聲波模塊(HC-SR04)】
發(fā)送端發(fā)送一個(gè)大于10us的高電平,發(fā)送結(jié)束后接收端立即置高,當(dāng)接收到返回的聲波信號(hào)時(shí)置低,所以在輸入捕獲的接收函數(shù)中有將上升沿捕獲改為下降沿捕獲的做法,也可以直接將輸入捕獲設(shè)置兩個(gè)通道,一個(gè)上升沿一個(gè)下降沿。
如果有什么錯(cuò)誤歡迎大家指正。謝謝啦文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-433102.html

到了這里,關(guān)于【CubeMX配置STM32驅(qū)動(dòng)超聲波模塊(HC-SR04)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(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)文章

  • STM32F103驅(qū)動(dòng)HCSR04超聲波測(cè)距顯示

    STM32F103驅(qū)動(dòng)HCSR04超聲波測(cè)距顯示

    超聲波模塊在電子DIY作品中實(shí)現(xiàn)小車(chē)避障測(cè)距等方面均應(yīng)用廣泛,在大學(xué)生智能車(chē)DIY愛(ài)好者中尤為顯眼。 點(diǎn)擊圖片購(gòu)買(mǎi) HC-SR04超聲波測(cè)距模塊可提供2cm-400cm的非接觸式距離感測(cè)功能,測(cè)距精度可達(dá)3mm,包括發(fā)射器、接收器與控制電路,它是一種壓電式傳感器,利用電致伸縮現(xiàn)

    2024年02月02日
    瀏覽(18)
  • STM32驅(qū)動(dòng)超聲波+OLED顯示,并上傳數(shù)據(jù)到云端(ONENET)

    STM32驅(qū)動(dòng)超聲波+OLED顯示,并上傳數(shù)據(jù)到云端(ONENET)

    本文將介紹如何使用STM32F103C8T6單片機(jī)和HC-SR04超聲波測(cè)距模塊來(lái)實(shí)現(xiàn)測(cè)距功能,并通過(guò)0.96寸OLED屏幕顯示測(cè)距結(jié)果。 首先,我們需要了解一下HC-SR04超聲波測(cè)距模塊的工作原理。該模塊通過(guò)發(fā)送超聲波脈沖并接收回波信號(hào)的時(shí)間來(lái)計(jì)算物體與模塊之間的距離。具體實(shí)現(xiàn)過(guò)程如下

    2024年02月12日
    瀏覽(25)
  • stm32-HY-SRF05 超聲波模塊-原理及代碼解讀

    stm32-HY-SRF05 超聲波模塊-原理及代碼解讀

    目錄 一、基礎(chǔ)知識(shí) 1.功能:超聲波測(cè)距 2.硬件介紹及電路連接 二、底層代碼原理分析 1基本工作原理 2代碼分析 1時(shí)序圖 步驟1 步驟2 ? ? ??HY-SRF05 超聲波測(cè)距模塊可提供2cm-450cm 的非接觸式距離感測(cè)功能,測(cè)距精度可達(dá)高到3mm ???????? ? VCC 供5V 電源, GND 為地線(xiàn), TRIG 觸

    2024年02月02日
    瀏覽(27)
  • STM32傳感器外設(shè)集--超聲波模塊(HC_SR04)

    STM32傳感器外設(shè)集--超聲波模塊(HC_SR04)

    目錄 1.器件介紹 1.1.參數(shù) 1.2.測(cè)量范圍 1.3.計(jì)算公式 1.4.優(yōu)點(diǎn) 2.1.原理 3.代碼編寫(xiě) 3.1.接線(xiàn)圖 3.2.代碼 3.2.1.HC_SR04.h 3.2.2.HC_SR04.c 3.2.3.timer.h 3.2.4.timer.c ?3.2.5.main.c 5根引腳 工作電壓5v 工作電流15mA 工作頻率40Hz 最近距離 2cm 最遠(yuǎn)距離 4m 測(cè)量角度 15度 測(cè)試距離=(高電平時(shí)間*聲速(340

    2024年02月14日
    瀏覽(27)
  • 基于STM32的HC_SR04模塊實(shí)現(xiàn)超聲波測(cè)距(附源碼)

    基于STM32的HC_SR04模塊實(shí)現(xiàn)超聲波測(cè)距(附源碼)

    本次實(shí)驗(yàn)需要通過(guò)STM32與HC_SR04模塊實(shí)現(xiàn)實(shí)時(shí)測(cè)距,并將測(cè)距信息通過(guò)串口顯示在電腦上 原理 超聲波測(cè)距原理是在超聲波發(fā)射裝置發(fā)出超聲波,它的根據(jù)是接收器接到超聲波時(shí)的時(shí)間差,與雷達(dá)測(cè)距原理相似。 超聲波發(fā)射器向某一方向發(fā)射超聲波,在發(fā)射時(shí)刻的同時(shí)開(kāi)始計(jì)時(shí)

    2024年02月11日
    瀏覽(20)
  • HC-SR04超聲波測(cè)距模塊使用方法和例程(STM32)

    HC-SR04超聲波測(cè)距模塊使用方法和例程(STM32)

    基于STM32和HC-SR04模塊實(shí)現(xiàn)超聲波測(cè)距功能 最近在學(xué)STM32做個(gè)簡(jiǎn)單的應(yīng)用實(shí)踐一下,順便水一篇文章。 本文用的單片機(jī)是STM32F103C8T6,超聲波測(cè)距模塊是HC-SR04,顯示測(cè)距結(jié)果用的是0.96寸OLED屏模塊。 下圖中小于10cm時(shí)的顯示結(jié)果有點(diǎn)問(wèn)題,代碼已修復(fù)并更新 修復(fù)后的結(jié)果: 視頻

    2024年02月03日
    瀏覽(20)
  • 基于STM32的超聲波HC-SR04和紅外測(cè)距模塊測(cè)量距離的實(shí)驗(yàn)對(duì)比(HAL庫(kù))

    基于STM32的超聲波HC-SR04和紅外測(cè)距模塊測(cè)量距離的實(shí)驗(yàn)對(duì)比(HAL庫(kù))

    ????????前言: 本文主要是為了 日常普通場(chǎng)合 下測(cè)距做的 對(duì)比實(shí)驗(yàn) ,本實(shí)驗(yàn)主要包含 2種模塊 : 超聲波測(cè)距模塊 (HC-SR04)和 紅外測(cè)距模塊 (SHARP GP2Y0A21YK0F)。兩種模塊不管是測(cè)距原理和編程實(shí)驗(yàn)方式都是不相同的,其測(cè)距效果也存在很大差異。感興趣的讀者朋友,

    2023年04月27日
    瀏覽(40)
  • STM32超聲波避障小車(chē)(舵機(jī)云臺(tái)+超聲波/stm32f103/HAL/Cube)

    STM32超聲波避障小車(chē)(舵機(jī)云臺(tái)+超聲波/stm32f103/HAL/Cube)

    一、小車(chē)1.0——基本藍(lán)牙小車(chē)(僅藍(lán)牙遙控小車(chē)運(yùn)動(dòng)方向,本篇) 二、小車(chē)2.0——藍(lán)牙小車(chē)PLUS(可以藍(lán)牙控制方向+藍(lán)牙直接調(diào)節(jié)車(chē)速) 三、小車(chē)3.0——避障小車(chē)(超聲波+舵機(jī)云臺(tái)) 四、小車(chē)4.0——無(wú)線(xiàn)手柄方向感知操控小車(chē)(mpu6050+雙藍(lán)牙透?jìng)鳎?五、雙輪自平衡小車(chē)(HAL庫(kù)版

    2024年02月05日
    瀏覽(22)
  • STM32系列(HAL庫(kù))——F103C8T6通過(guò)HC-SR04超聲波模塊實(shí)現(xiàn)測(cè)距

    STM32系列(HAL庫(kù))——F103C8T6通過(guò)HC-SR04超聲波模塊實(shí)現(xiàn)測(cè)距

    (1)編程平臺(tái):Keil5 (2)CubeMX (3)XCOM(串口調(diào)試助手) (1)某寶買(mǎi)的超聲波模塊 ? (2)F1的板子,本例使用經(jīng)典F103C8T6 (3)ST-link?下載器 (4)USB-TTL模塊 (5)杜邦線(xiàn)若干 (1)模塊簡(jiǎn)介: ????????超聲波是振動(dòng)頻率高于20kHz的機(jī)械波。它具有頻率高、波長(zhǎng)短、繞射現(xiàn)象小、方向性好、能夠成為射

    2024年02月02日
    瀏覽(21)
  • Linux驅(qū)動(dòng)基礎(chǔ)(HC-SR04超聲波模塊)

    本篇文章將講解HC-SR04超聲波模塊的驅(qū)動(dòng)程序編寫(xiě),有了上篇SR501模塊驅(qū)動(dòng)程序編寫(xiě)的基礎(chǔ)后這篇文章大家將會(huì)學(xué)的非常輕松。 HC-SR04超聲波模塊是一種常用于距離測(cè)量和障礙物檢測(cè)的模塊。它通過(guò)發(fā)射超聲波信號(hào)并接收回波來(lái)計(jì)算所測(cè)量物體與傳感器之間的距離。 HC-SR04超聲波

    2024年02月05日
    瀏覽(25)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包