MSPM0G3507(三十六)——超聲波PID控制小車固定距離

效果圖:

波形圖軟件是VOFA,B站有教程?,雖然有缺點但是非常簡單。

視頻效果:

PID控制距離

之前發過只有超聲波測距的代碼,MSPM0G3507(三十二)——超聲波模塊移植代碼-CSDN博客

?SYSCFG配置:

?ultrasonic_two.c

#include "ti_msp_dl_config.h"
#include "Delay_two.h"
#include "motor_two.h"
int distance=0;
int overcount=0;      //記錄定時器溢出次數  
int  Senor_Using();
extern int MOTO1,MOTO2;
int left_pwm=0;int right_pwm=0;
//PID控制距離      (速度環)             第二題的PID
int Senor_control_PID(int true_distance,int Target_distance)
{ 	float Position_KP=40,Position_KI=0.2,Position_KD=1.2;static float Bias,Pwm,Integral_bias,Last_Bias;Bias=Target_distance-true_distance;                                  //計算偏差Integral_bias+=Bias;	                                 //求出偏差的積分Pwm=-(Position_KP*Bias+Position_KI*Integral_bias+Position_KD*(Bias-Last_Bias));       //位置式PID控制器Last_Bias=Bias;                                       //保存上一次偏差 return Pwm;                                           //增量輸出}void Senor_control()
{distance=Senor_Using();left_pwm= Senor_control_PID(distance,15);;right_pwm= Senor_control_PID(distance,15);;
MOTO1=left_pwm;
MOTO2= right_pwm;Limit(&MOTO1,&MOTO2);	//速度限幅Load(MOTO1,MOTO2);		 //加載到電機上。}//測距函數
int  Senor_Using() 
{unsigned int sum=0;unsigned int tim;unsigned int i=0;unsigned int length;int cnt_i=0;while(i!=3)        {DL_GPIO_setPins( ultrasonic_Port_PORT ,ultrasonic_Port_TRIG_Pin_PIN );                     //TRIG=1;              //給發送端高電平delay_us(20);    DL_GPIO_clearPins(ultrasonic_Port_PORT ,ultrasonic_Port_TRIG_Pin_PIN );               //TRIG=0;              //給發送端低電平cnt_i=0;//DL_GPIO_readPins(xunji_PORT_PIN1_PORT                 , xunji_PORT_PIN1_PIN       )==xunji_PORT_PIN1_PINwhile(DL_GPIO_readPins(ultrasonic_Port_PORT,ultrasonic_Port_MCHO_Pin_PIN)!=ultrasonic_Port_MCHO_Pin_PIN)    //當接收端為0,一直循環      while(ECHO==0){cnt_i++;delay_us(1);if(cnt_i>300){	DL_GPIO_setPins( ultrasonic_Port_PORT ,ultrasonic_Port_TRIG_Pin_PIN );        // TRIG=1;        發送端給高電平  delay_us(20);DL_GPIO_clearPins(ultrasonic_Port_PORT ,ultrasonic_Port_TRIG_Pin_PIN );                //TRIG=0;    發送端給低電平cnt_i=0;          }} //跳出循環說明已經接收到信號,開啟定時器記錄時間DL_Timer_startCounter(TIMER_ultrasonic_INST    );     //  TIM_Cmd(TIM3,ENABLE);      使能定時器                                         i+=1;                     while(DL_GPIO_readPins(ultrasonic_Port_PORT,ultrasonic_Port_MCHO_Pin_PIN)==ultrasonic_Port_MCHO_Pin_PIN)	          //這里是知道信號結束,等待定時器計時      while(ECHO==1);	     {}DL_Timer_stopCounter(TIMER_ultrasonic_INST) ;                  //TIM_Cmd(TIM3,DISABLE);         失能定時器                     tim=DL_Timer_getTimerCount(TIMER_ultrasonic_INST) ;                  //tim=TIM_GetCounter(TIM3);         得到時計單元個數length=(tim*100)/58.0;                                               //微秒計算法求距離sum=length+sum;DL_Timer_setTimerCount(TIMER_ultrasonic_INST,0) ;                          //TIM3->CNT=0;     將計數值清零overcount=0;                                        //一般來說沒有超過一個定時器周期該值不需要調用,一直給0即可//delay_ms(10);}length=sum/3;                                           //三次作為平均值return length; 
}//測距定時器中斷服務函數
void TIMER_ultrasonic_INST_IRQHandler (void)
{switch (DL_TimerA_getPendingInterrupt(TIMER_ultrasonic_INST)){case DL_TIMER_IIDX_ZERO:overcount++;break;default:break;}}

ultrasonic_two.h

#ifndef __ultrasonic_two_H
#define	__ultrasonic_two_H#include "ti_msp_dl_config.h"int Senor_Using() ;
void TIMER_ultrasonic_INST_IRQHandler (void);
int Senor_control_PID(int true_distance,int Target_distance);
void Senor_control();#endif

主函數中while循環調用??Senor_control();即可

這里只列出了超聲波的所有代碼

有些函數沒有列出來,大家可以自己給他加上去,就是驅動電機的程序,非常簡單。比如limit和load 一個是速度限幅一個是給電機加載PWM,每個人有每個人的寫法,實在不會在評論區回復就行。

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

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

相關文章

Ubuntu下如何設置程序include搜索路徑及鏈接路徑

添加庫的include及lib路徑 linux下系統默認路徑為 /usr/include, /usr/local/include, gcc在編譯程序時會按照當前目錄路徑->系統默認路徑->系統環境變量的路徑方式去查找,所以當我們想調用的庫未安裝在系統默認路徑時,我們可以通過手動添加環境變…

數據壓縮的藝術:Kylin Cube設計中的自動壓縮特性

數據壓縮的藝術:Kylin Cube設計中的自動壓縮特性 在大數據的浩瀚宇宙中,Apache Kylin以其卓越的數據立方體(Cube)技術,為企業提供快速的多維數據分析能力。隨著數據量的不斷增長,存儲效率成為了一個關鍵問…

用友NC Cloud blobRefClassSearch FastJson反序列化RCE漏洞復現

0x01 產品簡介 用友 NC Cloud 是一種商業級的企業資源規劃云平臺,為企業提供全面的管理解決方案,包括財務管理、采購管理、銷售管理、人力資源管理等功能,實現企業的數字化轉型和業務流程優化。 0x02 漏洞概述 用友 NC Cloud blobRefClassSearch 接口處存在FastJson反序列…

開源PHP論壇HadSky本地部署與配置公網地址實現遠程訪問

文章目錄 前言1. 網站搭建1.1 網頁下載和安裝1.2 網頁測試1.3 cpolar的安裝和注冊 2. 本地網頁發布2.1 Cpolar臨時數據隧道2.2 Cpolar穩定隧道(云端設置)2.3 Cpolar穩定隧道(本地設置)2.4 公網訪問測試 總結 前言 今天和大家分享…

idea啟動ssm項目詳細教程

前言 今天碰到一個ssm的上古項目,項目沒有使用內置的tomcat作為服務器容器,這個時候就需要自己單獨設置tomcat容器。這讓我想起了我剛入行時被外置tomcat配置支配的恐懼。現在我打算記錄一下配置的過程,希望對后面的小伙伴有所幫助吧。 要求…

什么是計算機數據結構的字典

字典數據結構在計算機編程領域中是一個非常重要且常用的數據結構。它也被稱為關聯數組、哈希表或映射(Map),在不同編程語言中有不同的實現和稱呼,但其核心概念和用途大致相同。 字典數據結構是一種鍵值對(key-value p…

Linux 軟件工具安裝

Linux 軟件包管理器 yum 什么是軟件包 在Linux下安裝軟件, 一個通常的辦法是下載到程序的源代碼, 并進行編譯,得到可執行程序。 但是這樣太麻煩了, 于是有些人把一些常用的軟件提前編譯好,做成軟件包(可以理解成wind…

動態路由的基本概念

動態路由的基本概念 什么是動態路由? 網絡中的路由器彼此之間相互通信,傳遞各自的路由信息,利用收到的路由信息來更新和維護自己的路由表的過程。 基于某種路由協議實現(6大協議)。 動態路由的特點: 減…

SpringBoot3.3.0升級方案

本文介紹了由SpringBoot2升級到SpringBoot3.3.0升級方案,新版本的升級可以解決舊版本存在的部分漏洞問題。 一、jdk17下載安裝 1、下載 官網下載地址 Java Archive Downloads - Java SE 17 Jdk17下載后,可不設置系統變量java_home,僅在id…

開發技術-Java BigDecimal 精度丟失問題

文章目錄 1. 背景2. 方法3. 總結 1. 背景 昨天和小伙伴排查一個問題時,發現一個 BigDecimal 精度丟失的問題,即 double a 1.1;BigDecimal ba new BigDecimal(a).subtract(new BigDecimal(0.1));System.out.println(ba);輸出: 1.000000000…

構建自定義Tensorflow鏡像時用到的鏈接地址整理

NVIDIA相關: NVIDIA CUDA鏡像的docker hub:https://hub.docker.com/r/nvidia/cuda/tags?page&page_size&ordering&name12.4.1NVIDIA 構建的Tensorflow鏡像包:https://docs.nvidia.com/deeplearning/frameworks/tensorflow-rele…

項目屬性的精粹:Gradle中配置項目屬性的全面指南

項目屬性的精粹:Gradle中配置項目屬性的全面指南 在構建自動化的宏偉藍圖中,Gradle以其靈活的項目屬性配置脫穎而出。項目屬性是構建過程中可配置的參數,它們可以控制構建行為、定義條件邏輯,甚至影響依賴解析。本文將深入探討如…

Vue3 使用 Vue Router 時,prams 傳參失效和報錯問題

Discarded invalid param(s) “id“, “name“, “age“ when navigating 我嘗試使用 prams 傳遞數據 <script setup> import { useRouter } from vue-routerconst router useRouter() const params { id: 1, name: ly, phone: 13246566476, age: 23 } const toDetail…

快速使用BRTR公式出具的大模型Prompt提示語

Role:文章模仿大師 Background: 你是一位文章模仿大師&#xff0c;擅長分析文章風格并進行模仿創作。老板常讓你學習他人文章后進行模仿創作。 Attention: 請專注在文章模仿任務上&#xff0c;提供高質量的輸出。 Profile: Author: 一博Version: 1.0Language: 中文Descri…

半邊數據結構學習

半邊數據結構學習 一、網格數據結構二、半邊數據結構頂點(Vertex)半邊(HalfEdge)面片(Face) 三、OpenMesh 相關代碼拓撲關聯對象遍歷 四、OpenFilpper 相關代碼HoleInfo類孔洞檢測孔洞信息HoleFiller類孔洞補全 一、網格數據結構 對于表面網絡來說&#xff0c;其關鍵在于拓撲&…

【MySQL系列】VARCHAR的底層存儲

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

python-親和數(賽氪OJ)

[題目描述] 古希臘數學家畢達哥拉斯在自然數研究中發現&#xff0c;220 的所有真約數(即不是自身的約數)之和為&#xff1a; 1245101120224455110&#xff1d;284 。 而 284 的所有真約為 1 、 2 、 4 、 71 、 142 &#xff0c;加起來恰好為 220 。人們對這樣的數感到很驚奇&a…

頤養優選元宇宙

頤養優選是一個專注于為中老年人提供高品質養老服務的品牌或平臺。它通常涵蓋了一系列服務和產品&#xff0c;旨在幫助老年人享受健康、舒適、有尊嚴的晚年生活。這些服務可能包括但不限于以下幾個方面&#xff1a; ###健康管理 -**定期體檢**&#xff1a;提供定期的身體健康檢…

如何搞定美國TikTok直播網絡?

在全球范圍內&#xff0c;TikTok已經積累了超過30億次的下載量&#xff0c;月活躍用戶達到13億以上&#xff0c;支持75種語言&#xff0c;覆蓋了150多個國家和地區。這一龐大的流量池吸引了眾多國內電商人嘗試在TikTok上進行業務拓展。本文將探討如果要在美國運營TikTok直播&am…

ruoyi定時任務使用

使用沒有什么特別的&#xff0c;不再贅述&#xff0c;可參見前端文檔 或下面的文章 ruoyi若依定時任務的基本使用_若依框架定時任務怎么用-CSDN博客 只說一下被調度任務的建立 1、在調用的類上添加Component("后期在調用任務創建用的偽類的名稱") 稱為偽類是因為…