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.mzph.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("后期在调用任务创建用的伪类的名称") 称为伪类是因为…