STM32超聲波模塊

一:超聲波模塊

1:工作原理

采用IO觸發測距,給至少10us的高電平信號。
模塊自動發送8個40KHz的方波,自動檢測是否有信號返回。
·有信號返回,通過IO輸出一高電平,高電平持續時間就是超聲波從發射到返回的時間聲波從發射到返回的時間
· HC-SRO4超聲波測距模塊提供2cm-400cm的測距功能,精度達3mm。
2.硬件接線
四根杜邦線,VCC連接單片機3.3-5V (推薦5V供電),GND接到板子的GND, Trig 為外部觸發信號輸入,輸入一個10us的高電平即可觸發模塊測距,Echo即為 回響信號輸出,測距結束時此管引腳輸出一個低電平,電平寬度反映超聲主返時間之和。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.控制超聲波測距步驟
初始化超聲波引腳和定時器時鐘·? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 初始化引腳模式和定時器中斷

Tim.c

#include "stm32f10x.h"
#include "Tim.h"uint16_t  mountus;void delay_us(uint32_t us)
{us *=8;while(us--);}void delay_ms(uint32_t ms)
{while(ms--){delay_us(1000);}}void Base_Tim_Init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;NVIC_InitTypeDef NVIC_Initstruct;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up ;TIM_TimeBaseInitstruct.TIM_Period=1000-1;TIM_TimeBaseInitstruct.TIM_Prescaler=72-1;TIM_TimeBaseInitstruct.TIM_RepetitionCounter=0;TIM_TimeBaseInit( TIM2, &TIM_TimeBaseInitstruct);TIM_ITConfig( TIM2, TIM_IT_Update, ENABLE);TIM_Cmd(TIM2, DISABLE);NVIC_Initstruct.NVIC_IRQChannel=TIM2_IRQn ;NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=0;NVIC_Initstruct.NVIC_IRQChannelSubPriority=0;NVIC_Initstruct.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_Initstruct);}void HC04_Init()
{GPIO_InitTypeDef GPIO_Initstruct;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,ENABLE);GPIO_Initstruct.GPIO_Pin= GPIO_Pin_11;GPIO_Initstruct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Initstruct.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init( GPIOB, &GPIO_Initstruct);GPIO_Initstruct.GPIO_Pin=GPIO_Pin_10;GPIO_Initstruct.GPIO_Mode=  GPIO_Mode_IPD;GPIO_Init( GPIOB, &GPIO_Initstruct);}void open_Tim()
{mountus=0;TIM_SetCounter( TIM2,0);TIM_Cmd(TIM2, ENABLE);}void close_Tim()
{TIM_Cmd(TIM2, DISABLE);}void TIM2_IRQHandler ()
{if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){mountus++;TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}}int Get_Echo_Time()
{uint16_t t=0;t=mountus*1000;t=t+TIM_GetCounter(TIM2);TIM_SetCounter( TIM2,0);delay_ms(50);return t;}float Get_Length()
{int i=0;float sum=0;uint16_t t=0;float length=0;while(i<5){	GPIO_SetBits(GPIOB,GPIO_Pin_11);delay_us(20);GPIO_ResetBits(GPIOB,GPIO_Pin_11);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == RESET );open_Tim();i++;while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == SET );close_Tim();t=Get_Echo_Time();length=((float)t/58.0);sum=sum+length;}length=sum/5.0;return length;}

Tim.h

#ifndef _TIM_H_
#define _TIM_H_void Base_Tim_Init(void);
void HC04_Init(void);
float Get_Length(void);#endif

main.c

#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "Bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"
#include "wireless.h"
#include "exti_key.h"
#include "usart.h"
#include "stdio.h"
#include "Tim.h"void delay(uint16_t time)//延時1ms  軟件延時粗延時
{uint16_t i=0;while(time --){i=12000;while(i --);}}int  main()
{float length=0;LED_Init();Base_Tim_Init();HC04_Init();my_usart_Init();while(1){length = Get_Length();printf("%lf\r\n",length );}}

代碼心得

1:

定時器中斷工作機制

  1. 定時器配置

    • 在您的代碼中,TIM2配置為1MHz計數頻率(72MHz主頻/72分頻)

    • 自動重裝載值1000 → 每1ms(1000μs)產生一次更新中斷

  • 每1ms觸發一次中斷,與高電平持續時間無關

  • 中斷頻率由定時器配置決定,不是由外部信號決定

2

為什么需要延遲?

1:

void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter)
{/* Check the parameters */assert_param(IS_TIM_ALL_PERIPH(TIMx));/* Set the Counter Register value */TIMx->CNT = Counter;
}

實際上這個函數是對一個寄存器進行了賦值,所以我們需要一定的時間去讓寄存器賦值,這個就是他的作用,我們這里用了50ms,就是充分讓 寄存器賦值 這個步驟可以完成!

在原始代碼中:

c

int Get_Echo_Time() {t = mountus*1000 + TIM_GetCounter(TIM2);TIM_SetCounter(TIM2,0);delay_ms(50);  // 關鍵延遲return t;
}

這個延遲解決了兩個問題:

  1. 傳感器恢復時間

    • HC-SR04需要50-60ms的恢復周期

    • 連續測量會導致傳感器無法響應

  2. 中斷沖突預防

    • 重置定時器(TIM_SetCounter(0))和mountus=0操作需要時間

    • 無延遲時,下次測量可能打斷重置過程

3總結代碼

  1. 定時器中斷由定時器硬件觸發,與Echo引腳狀態無關

  2. mountus記錄的是時間流逝(每1ms增加),不是信號事件

  3. 高電平期間定時器持續運行,通過:

    • 中斷次數(mountus) → 完整毫秒數

    • 當前計數值 → 亞毫秒時間

  4. 延遲50ms解決了傳感器恢復和操作原子性問題

  5. 最佳實踐:用中斷保護替代延遲,并在主循環中管理傳感器時序

1. 基本概念對比

數據類型符號位寬范圍頭文件
int有符號32位-2,147,483,648 到 2,147,483,647內置
uint16_t無符號16位0 到 65,535#include <stdint.h>
uint32_t無符號32位0 到 4,294,967,295#include <stdint.h>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914958.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914958.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914958.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RK3568項目(十一)--linux驅動開發之mipi屏幕調試

目錄 一、引言 二、MIPI DSI 屏幕 ------>2.1、MIPI聯盟 ------------>2.1.1、多媒體部分 ------------>2.1.2、硬件協議 ------------>2.1.3、D-PHY功能模式及速率 ------------>2.1.4、分辨率計算 ------>2.2、MIPI-DSI硬件連接 ------>2.3、傳…

C語言小游戲——飛機大戰

目錄 引言 開發環境與工具準備 1. 開發環境配置 2. 資源文件準備 游戲設計與架構 1. 游戲核心數據結構 2. 游戲全局變量 游戲核心功能實現 1. 游戲初始化 2. 游戲主循環 3. 游戲渲染 4. 游戲狀態更新 關鍵游戲機制實現 1. 敵機生成系統 2. 碰撞檢測系統 3. 敵機…

SQLite的可視化界面軟件的安裝

1、如下圖所示&#xff0c;DB Browser軟件&#xff0c;在壓縮包中。2、首先解壓到一個文件夾中。例如&#xff08;D:\\DB Browser&#xff09;文件夾。解壓后的內容如下圖。3、將解壓后的DB Browser文件夾&#xff0c;剪切到D:\Program Files\目錄中。如下兩圖。win10操作系統下…

基于 STM32H743VIT6 的邊緣 AI 實踐:貓咪叫聲分類 CNN 網絡部署實戰(已驗證)中一些bug總結

前言前面發了一篇文章基于 STM32H743VIT6 的邊緣 AI 實踐&#xff1a;貓咪叫聲分類 CNN 網絡部署實戰&#xff08;已驗證&#xff09;。這里面有一些我遇到過的bug&#xff0c;當時基本都花了很長的時間才解決。這里將這些bug總結一下方便后續查閱。1.使用cubemx插件解析AI模型…

【機器學習】突破分類瓶頸:用邏輯回歸與Softmax回歸解鎖多分類世界

&#x1f497;&#x1f497;&#x1f497;歡迎來到我的博客&#xff0c;你將找到有關如何使用技術解決問題的文章&#xff0c;也會找到某個技術的學習路線。無論你是何種職業&#xff0c;我都希望我的博客對你有所幫助。最后不要忘記訂閱我的博客以獲取最新文章&#xff0c;也歡…

Android gradle plugin agp8.6.1發布時間

Android gradle plugin agp8.6.1發布時間 Android Gradle Plugin (AGP) 的版本 8.6.1 是在2023年發布的。具體來說&#xff0c;它是在2023年4月發布的。這個版本的更新包括了多個重要的改進和修復&#xff0c;旨在提升開發者在Android開發過程中的體驗和效率。 主要更新包括&am…

閉包的兩種設計模式

閉包設計模式 概述 閉包是 JavaScript 中的一個重要概念&#xff0c;它允許內層函數訪問外層函數的變量。在實際開發中&#xff0c;閉包經常被用于實現特定的設計模式&#xff0c;主要包括輔助函數模式和工廠模式。 1. 輔助函數模式&#xff08;Helper Function Pattern&#x…

力扣119:楊輝三角Ⅱ

力扣119:楊輝三角Ⅱ題目思路代碼題目 給定一個非負索引 rowIndex&#xff0c;返回「楊輝三角」的第 rowIndex 行。 思路 楊輝三角的規律&#xff1a; 第n行有n1個數&#xff0c;n從0開始每行的第一個數和最后一個數都是1。除了第一行的數其他的數都是由它左上角和右上角的…

@Linux自建證書 Nginx+HTTPS

文章目錄Linux自建證書并配置Nginx HTTPS1. 準備工作2. 安裝必要的工具3. 自建證書腳本3.1 創建CA根證書&#xff08;可選&#xff0c;用于自簽名證書鏈&#xff09;3.2 創建服務器證書腳本4. 證書文件說明5. 配置Nginx使用HTTPS5.1 創建證書存放目錄5.2 配置Nginx站點5.3 啟用…

解決 RAGFlow報錯 `peewee.OperationalError: (1045)`:MySQL 容器密碼錯誤排查手記

文章目錄 ????♂? 深度排查過程 ?? 完美解決方案:同步真實密碼 ? 驗證結果 ?? 經驗總結與最佳實踐 問題現象: 部署 ragflow 時遭遇以下錯誤,且訪問前端頁面無響應: peewee.OperationalError: (1045, "Access denied for user root@192.168.48.6")關鍵線…

lwIP WebSocket 客戶端 TCP PCB 泄漏問題分析與解決

在嵌入式開發中&#xff0c;使用 lwIP 實現 WebSocket 客戶端時&#xff0c;偶爾會遇到反復連接導致 TCP PCB&#xff08;Protocol Control Block&#xff09;泄漏&#xff0c;最終連接數達到上限&#xff08;如 4&#xff09;后無法再建立新連接的問題。本文將結合實際案例&am…

k8s之Attach 和 Mount

Attach 和 Mount 一、核心概念對比操作Attach&#xff08;掛載設備&#xff09;Mount&#xff08;掛載文件系統&#xff09;定義將存儲卷&#xff08;如 EBS、NFS 等&#xff09;連接到宿主機將已 Attach 的存儲設備映射為宿主機上的文件系統路徑執行者云提供商驅動&#xff08…

API Gateway HTTP API 控制客戶端訪問 IP 源

前言 在 API Gateway REST API 中我們可以配置 Resource policy 來實現對特定客戶端 IP 地址的限制. 然而 HTTP API 并不提供這個功能, 不過我們可以用 Lambda 搓一個 Authorizer 實現等效的功能. 創建 Lambda authorizer import json import os import ipaddressdef lambda…

Linux搭建LAMP環境(CentOS 7 與 Ubuntu 雙系統教程)

Linux搭建LAMP環境 一、LAMP 環境核心概念 定義&#xff1a;由 Linux、Apache、MySQL、PHP 四大組件組成的開源 Web 應用平臺本質&#xff1a;四個獨立開源軟件的組合體&#xff0c;因長期協同使用形成高度兼容性&#xff0c;成為動態網站和服務器的主流解決方案 二、LAMP 四大…

c# 開機自動啟動程序

以下是兩種實現C#軟件開機自啟動的常用方法&#xff0c;根據需求選擇適合的方案&#xff1a; 方法1&#xff1a;通過注冊表實現&#xff08;需管理員權限&#xff09; using Microsoft.Win32; using System.Diagnostics;public static class AutoStartManager {/// <summa…

C語言---動態內存管理

為什么要有動態內存分配我們在學習動態內存管理之前&#xff0c;一直都是通過開辟變量&#xff0c;或者是開辟數組的方式來在內存的棧區開辟空間的&#xff0c;但是這樣的開辟方式有局限性&#xff0c;因為一旦開辟之后&#xff0c;它們的大小就無法改變&#xff0c;就缺少了很…

C++標準庫(std)詳解

C標準庫&#xff08;std&#xff09;詳解——目錄C標準庫&#xff08;std&#xff09;詳解一、命名空間&#xff08;namespace&#xff09;二、主要組件1. 輸入輸出流&#xff08;<iostream>&#xff09;2. 字符串處理&#xff08;<string>&#xff09;3. STL容器&…

ESP32的OTA升級詳解:3. 搭建node/python服務器升級(native ota原生API)

一、OTA兩種方式&#xff1a;app_update 與 esp_https_ota 區別 ESP32/ESP32-S2/ESP32-C3等可通過Wi-Fi或以太網下載新固件到OTA分區實現運行時升級。ESP-IDF提供兩種OTA升級方法&#xff1a; 使用app_update組件的原生API使用esp_https_ota組件的簡化API(支持HTTPS升級) 本次…

byte[]作為接口參數傳遞的方法

在C#中通過WebService或API傳遞byte參數&#xff08;如文件、圖像等二進制數據&#xff09;時&#xff0c;通常有以下幾種實現方式&#xff1a; ?1. 使用Base64編碼&#xff08;推薦REST API&#xff09;? 將byte數組轉換為Base64字符串傳輸&#xff0c;適用于JSON格式的API&…

元宇宙與Web3的深度融合:構建沉浸式數字體驗的愿景與挑戰

一、技術特征與融合基礎1. 元宇宙的技術架構&#xff08;2025年&#xff09;空間構建技術&#xff1a;3D建模與渲染&#xff1a;實時渲染引擎&#xff08;如Unity HDRP&#xff09;支持路徑追蹤光追&#xff0c;AI生成模型&#xff08;NVIDIA Get3D&#xff09;3秒生成3D場景。…