紅外超聲波雷達測距(water)

文章目錄

  • 一 RS-232
  • 二 RS485
  • 三 Modbus
  • 四 stm32多路超聲波測距
    • 4.1 設計方案
    • 4.2 代碼
  • 參考資料
  • 總結

實驗要求
一. 采用stm32F103和HC-SR04超聲波模塊, 使用標準庫或HAL庫+ 定時器中斷,完成1或2路的超聲波障礙物測距功能。
1)測試數據包含噪聲,程序需要進行濾波處理;將測距數值通過串口上傳到上位機串口助手;
2)根據障礙物距離遠近,控制一個蜂鳴器(可以用LED燈代替)發出頻率不同的聲音(或LED不同閃爍),即輸出占空比變化的PWM波形;
3)在沒有超聲波模塊硬件的場景下,先使用Keil中的仿真邏輯分析儀,觀察分析對應管腳上的時序波形,判讀是否符合協議規范。
二. 當前智能汽車上一般配置有12路超聲波雷達,這些專用超聲波雷達內置了MCU,直接輸出數字化的測距結果,一般硬件接口采用串口RS485,通信協議采用modbus。請思考:
1)RS485與RS232(UART)有什么不同?
2)Modbus協議是什么?
3)如果讓你設計一款 12路車載超聲波雷達,采用 stm32F103+HC-SR04超聲波模塊,對外提供RS485和Modbus協議,你的設計方案是什么?

一 RS-232

異步串行通信接口標準之一,規定了連接電纜和機械、電氣特性、信號功能及發送過程
請添加圖片描述

特點:

  • 支持全雙工通信
  • 波特率可選
  • 負邏輯傳送
  • 傳送距離較遠

缺點:

  • 接口信號電平值較高,易損壞接口電路芯片
  • 傳輸速率較低,只有20Kbps
  • 共地傳輸,易產生共模干擾
  • 傳輸距離有限

引腳定義
在這里插入圖片描述
通信機理
A向B發送數據:
1、A先設置RTS為1,表示要發數據給B
2、B檢測到RTS為1,先看自己是否準備好:
如果準備好,就設置CTS為1表示A可以發數據給B了
如果沒有準備好,繼續處理自己的數據。弄完了,再將CTS設置為1,讓A發送數據
3、A發現CTS置1后,將數據通過TXD信號線發送出去
4、A每發送一次數據給B之前,都會繼續上面的邏輯
5、A發送完數據后,就將RTS置0,表示數據發送完畢

二 RS485

為針對RS232的缺點,出現了RS485

半雙工網絡
請添加圖片描述

特點

  • RS-485的電氣特性:以兩線間的電壓差表示電平1和0
    在這里插入圖片描述

  • 最高傳輸速率是10Mbps

  • 平衡驅動器和差分接收器組合,抗共模干擾能力強,抗噪聲干擾性好

  • RS232在總線上只允許連接1個收發器。RS485允許連接多達128個收發器,可使用單一的RS485建立設備網絡

485驅動電路
請添加圖片描述
RXD和TXD是連接串口的,choose是選擇作為接收端還是發送端(二選一)。右邊就輸出A和B,即差分信號的線,與其它的485器件的AB連接。
請添加圖片描述

三 Modbus

  • Modbus是一種由Modicon(施耐德電氣公司)于1979年開發的串行通信協議,主要用于可編程邏輯控制器(PLC)和其他工業電子設備之間的通信。
  • Modbus網絡遵循主/從模型,其中主站(Master)負責請求信息,而從站(Slave)提供信息。如下圖所示。
    在這里插入圖片描述

地址標識:每個從設備都有一個唯一的地址標識。
信息交互:主站可以讀取從站的內部寄存器,也可以向其寫入信息。

四 stm32多路超聲波測距

4.1 設計方案

這里假設設定四路超聲波。設定4個輸入捕獲通道,當超聲波模塊echo收到回波后,即觸發輸入捕獲上升沿,開始echo持續時間的計時,然后下降沿后開始使用公式進行換算,得到距離,通過串口發送出去。其中,著重要考慮以下問題;

  • stm32的定時器資源是否足夠,同一定時器可以采用多路記錄超聲波嗎

可知stm32一個定時器有幾個通道,這些通道可以用來進行輸入捕獲,此方案也節省了io口資源。但是需要考慮如何設定定時器計數頻率,以及如何避免這種情況:假設定時器的重載值為200,echo在180時收到上升沿開始計數,會持續50個計數值,即在下一輪的30得到下降沿,此時如果直接使用減法,會造成負數或者不準確數值的問題。所以為了避免這種情況,需要使用一個變量來判斷是否完成了一個計數周期。

  • stm32的定時器之間是否會有計數沖突:

在實驗檢驗過程中,單獨測試一個通道時記錄結果大致準確,但是接入兩個模塊時,似乎結果發生了干擾,但無法確認是否是定時器問題還是其它問題,后續有待解決。

  • 若采用輪詢(狀態機)方案訪問會出現當一個超聲波停止工作時,其它超聲波也無法正常工作的狀態。

4.2 代碼

GPIO定時器初始化

void GPIO_Init(void) {// 配置Trig引腳為輸出,Echo引腳為輸入RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2; // Trig1, Trig2GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_3; // Echo1, Echo2GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);
}void Timer_Init(void) {// 配置定時器用于捕獲Echo信號RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period = 65535;TIM_TimeBaseStructure.TIM_Prescaler = 72-1; // 1MHzTIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;TIM_ICInitStructure.TIM_ICFilter = 0x0;TIM_ICInit(TIM2, &TIM_ICInitStructure);TIM_Cmd(TIM2, ENABLE);
}

Modbus設計

void USART_Init(void) {// 配置USART用于RS485通信RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // USART1_TXGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // USART1_RXGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);USART_Cmd(USART1, ENABLE);
}void Send_Modbus_Response(uint8_t* response, uint8_t length) {// 發送Modbus響應幀for (uint8_t i = 0; i < length; i++) {USART_SendData(USART1, response[i]);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);}
}

參考資料

https://blog.csdn.net/LX567567/article/details/139182689?spm=1001.2014.3001.5502
https://mp.weixin.qq.com/s/6wBNP-9SHh1OGiTV51gH1w

總結

進一步了解了RS232及RS485,為后續設計打下基礎。

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

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

相關文章

Bezier Python 用法:深入探索與實用指南

Bezier Python 用法&#xff1a;深入探索與實用指南 在數字圖形學和計算機編程中&#xff0c;貝塞爾曲線&#xff08;Bezier Curves&#xff09;是一種重要的參數曲線&#xff0c;被廣泛應用于二維圖形應用程序中&#xff0c;如字體輪廓、矢量圖形和動畫等。Python作為一種功能…

EukRep:區分真核和原核序列

https://github.com/patrickwest/EukRep 安裝 conda create -y -n eukrep-env -c bioconda scikit-learn0.19.2 eukrep mamba install -c conda-forge numpy1.19.5 使用 EukRep -i <Sequences in Fasta format> -o <Eukaryote sequence output fasta file>

【Linux】線程ID

大致草稿—————————— 思維導圖 學習目標 一、線程ID的理解 1.1 引出對tid的理解 我們先來創建一個線程復習一下線程的函數&#xff1a; pthread_t tid; // 創建一個線程 pthread_create(&tid, nullptr, threadrun, (void*)"thread-1"); // 打印出…

二分查找學習:優雅的二分查找——“Leetcode 35. 搜索插入位置”

例題 給定一個排序數組和一個目標值&#xff0c;在數組中找到目標值&#xff0c;并返回其索引。如果目標值不存在于數組中&#xff0c;返回它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的算法。 示例 1: 輸入: nums [1,3,5,6], target 5 輸出: 2 示例 2…

怎么花草識別?方法有三種!

怎么花草識別&#xff1f;在這個五彩斑斕的世界里&#xff0c;花草是我們生活中不可或缺的一部分。它們點綴著我們的環境&#xff0c;為我們帶來無盡的美麗與驚喜。然而&#xff0c;面對眾多的花草種類&#xff0c;你是否曾感到困惑和迷茫&#xff0c;不知道如何識別它們&#…

VIO System 丨適用于控制器開發前期的測試系統

VIO綜述 嵌入式軟件的HIL測試需要復雜的測試系統及完整的ECU硬件&#xff0c;這導致通常只能在開發流程的后期階段進行測試。全新推出的低成本解決方案VIO System&#xff0c;使得在開發前期不僅可以進行總線通訊測試&#xff0c;也可以同時進行I/O信號測試。 該系統旨在通過…

用 Vim 打造舒適高效的編程體驗

作為程序員,Vim 無疑是最常使用的編輯器之一。它之所以如此受歡迎,得益于其強大的功能和高度可定制的特性。今天,讓我帶大家一起探索如何通過簡單的 .vimrc 配置,打造一個個性化的 Vim 編程環境。 啟用語法高亮 我們首先要確保 Vim 能夠正確地識別和高亮代碼語法。只需在 .vi…

LabVIEW版本控制

LabVIEW作為一種流行的圖形化編程環境&#xff0c;在軟件開發中廣泛應用。有效地管理版本控制對于確保軟件的可靠性和可維護性至關重要。LabVIEW提供了多種方式來管理VI和應用程序的修訂歷史&#xff0c;以滿足不同規模和復雜度的項目需求。 LabVIEW中的VI修訂歷史 LabVIEW內置…

docker安裝Mysql5.7版本

首先Linux系統已經安裝好了docker應用。 1.搜索鏡像 docker search mysql 2.拉取5.7的鏡像 總之,選starts最多的那個就對了。 docker pull mysql:5.7 ~ docker pull mysql:5.7 5.7: Pulling from library/mysql fc7181108d40: Downloading [============> …

mysql創建數據表----centos7.9

mysql創建數據表 查看存在的表 show tables;我這里還未創建任何表所以是這樣的 如有是這樣 若沒有表需要先創建一個表 CREATE DATABASE tb_your_name&#xff1b;創建字段及屬性 CREATE TABLE tb_laws_regulations (id INT AUTO_INCREMENT PRIMARY KEY, -- 文件唯…

柯橋外貿俄語哪里可以學,零基礎俄語培訓

Де?лать 做 из му?хи 從蒼蠅 слона? 大象 我覺得漢語里有一個很合適的詞來形容&#xff1a; Де?лать из му?хи слона? 就是 小題大做&#xff0c;本來是一件很小的事&#xff0c;卻把它形容成天大的事一樣 Хвтит де?…

【UE5.1 角色練習】10-物體抬升、拋出技能 - part2

目錄 前言 效果 步驟 一、讓物體緩慢的飛向手掌 二、向著鼠標方向發射物體 前言 在上一篇&#xff08;【UE5.1 角色練習】08-物體抬升、拋出技能 - part1&#xff09;的基礎上繼續完成角色將物體吸向手掌&#xff0c;然后通過鼠標點擊的方向來發射物體的功能。 效果 步驟…

c#實現BPM系統網絡傳輸接口,http協議,post

BPM通過http協議實現網絡傳輸&#xff0c;語言使用.net(c#)&#xff0c;在這里只提供一個接口&#xff0c;具體代碼如下,請參照&#xff1a; public string MakeRequest(string parameters) { ServicePointManager.ServerCertificateValidationCallback new Syst…

代碼隨想錄算法訓練營第三十二 | ● 122.買賣股票的最佳時機II ● 55. 跳躍游戲 ● 45.跳躍游戲II

122.買賣股票的最佳時機II 講解鏈接&#xff1a;https://programmercarl.com/1005.K%E6%AC%A1%E5%8F%96%E5%8F%8D%E5%90%8E%E6%9C%80%E5%A4%A7%E5%8C%96%E7%9A%84%E6%95%B0%E7%BB%84%E5%92%8C.html 簡單思路&#xff1a;逐個計算連續兩天的股票差值&#xff0c;sum初始為零&…

Spring Task 定時任務

文章目錄 Spring Task 定時任務pom 包配置啟動類開啟定時創建定時任務實現類定時任務 1:定時任務 2: 參數說明fixedRate 說明cron 說明 并行任務 Spring Task 定時任務 在項目開發中&#xff0c;經常需要定時任務來幫助我們來做一些內容&#xff0c;比如定時派息、跑批對賬、業…

【并查集】專題練習

題目列表 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 模板 836. 合并集合 - AcWing題庫 #include<bits/stdc.h> using lllong long; //#define int ll const int N1e510,mod1e97; int n,m; int p[N],sz[N]; int find(int a) {if(p[a]!a) p[a]find(p[a]);return p[a…

第十八講:聯合和枚舉

第十八講&#xff1a;聯合和枚舉 1.聯合體&#xff08;共用體&#xff09;1.1聯合體的聲明1.2聯合體大小的計算1.3聯合體的特點1.4聯合體的使用1.4.1聯合體的直接使用1.4.2聯合體直接使用的優化方法1.4.3聯合體成員中含有數組的使用1.4.4使用聯合體判斷當前機器是大端排序&…

K8s(Kubernetes)常用命令

大家好&#xff0c;當談及容器編排工具時&#xff0c;Kubernetes&#xff08;常簡稱為K8s&#xff09;無疑是當今最受歡迎和廣泛使用的解決方案之一。作為一個開源的容器編排平臺&#xff0c;Kubernetes 提供了豐富的功能&#xff0c;可以幫助開發人員和運維團隊管理、部署和擴…

電商分析@電商數據與運營優化

電商數據分析與運營優化是指通過對電商平臺的各種數據進行深入分析&#xff0c;以發現潛在的問題和機會&#xff0c;并采取相應的優化措施&#xff0c;提高電商運營效率和盈利能力。 首先&#xff0c;電商數據分析需要收集和整理各類數據&#xff0c;包括銷售數據、用戶數據、流…

大宋咨詢(深圳車主滿意度調查)如何開展汽車展會觀眾滿意度問卷調查

汽車展覽是由政府機構、專業協會或主流媒體等組織,在專業展館或會場中心進行的汽車產品展示展銷會或汽車行業經貿交易會、博覽會等活動。汽車展覽通過對汽車工藝的呈現與汽車產品的廣告,為消費者提供汽車制造工業與汽車產品的發展動向。同時,汽車廠商可通過汽車展覽對外宣傳產品…