MSPM0G3507(三十六)——超声波PID控制小车固定距离

news2024/11/13 16:41:02

效果图:

波形图软件是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_PIN
			while(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*50)/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.coloradmin.cn/o/1923173.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nacos服务公网环境登陆报密码错误问题排查

作者:小丫 一、问题现象 nacos服务内网可以正常登录,如下: 走公网代理出来之后,无法正常登录,报错"用户名密码错误" 二、排查步骤 1、链路分析 首先确认公网代理的链路: 域名—>haprox…

扩散的魔法:如何打造未来生物打印?

生物打印技术正在快速发展,它允许我们将生物材料、细胞和生长因子等生物活性成分精确地打印成具有特定形状和功能的结构。而扩散现象在生物打印中扮演着至关重要的角色,它影响着打印结构的特性、机械性能、生物功能和形态。为了更好地利用扩散现象&#…

青年发展型城市成新青择地,期待与挑战并存

随着社会的发展和城市化进程的加快,青年人在选择未来定居地时面临着越来越多的选择。近日,中国青年报社社会调查中心联合问卷网对1500名青年进行的一项调查显示,74.8%的受访青年表示会优先考虑青年发展型城市。那么,青年在选择未来…

深耕一个领域存在的风险?

深耕一个领域存在的风险? 我们常常听到:要深耕一个领域/行业。 对于个人来说是选择一份职业深耕,还是在多个领域尝试? ​ 首先看看人才分类 人才的分类可以归纳为三种类型,I型,T型,X型,三种类型简称ITX “I” 型人才 “I” 型人才可以分为专才或者通才。横向放置…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《面向规模化分布式可再生能源并网的群网协同互动优化方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

ABAP调用BAPI时COMMIT WORK AND WAIT未按照预期同步提交问题分析

背景: 在做ABAP开发时,经常会有连续调用BAPI的需求,比如先创建销售订单,再依据销售订单创建交货单,再对交货单进行过账等类似的一连串调用,这种类似的场景往往需要前一步操作的数据完全写入数据库才能进行…

数据库mysql-对数据库和表的DDL命令

文章目录 一、什么是DDL操作二、数据库编码集和数据库校验集三、使用步骤对数据库的增删查改1.创建数据库2.进入数据库3.显示数据库4.修改数据库mysqldump 5.删除数据库 对表的增删查改1.添加/创建表2.插入表内容3.查看表查看所有表查看表结构查看表内容 4.修改表修改表的名字修…

经典关系抽取(一)CasRel(层叠式指针标注)在DuIE2.0数据集上的应用

经典关系抽取(一)CasRel(层叠式指针标注)在DuIE2.0数据集上的应用 关系抽取(Relation Extraction)就是从一段文本中抽取出(主体,关系,客体)这样的三元组,用英文表示是 (subject, relation, obj…

【Windows】硬链接和软链接(OneDrive同步指定目录?)

文章目录 一、场景带入二、Windows下的硬链接和软链接2.1 硬链接(Hard Link)2.2 软链接(符号链接,Symbolic Link)2.3 软链接和快捷方式2.4 应用场景 三、OneDrive中的应用3.1 错误姿势3.2 好像可行的尝试3.3 合理的解决…

SpringBoot使用Redisson操作Redis及使用场景实战

前言 在SpringBoot使用RedisTemplate、StringRedisTemplate操作Redis中,我们介绍了RedisTemplate以及如何SpringBoot如何通过RedisTemplate、StringRedisTemplate操作Redis。 RedisTemplate的好处就是基于SpringBoot自动装配的原理,使得整合redis时比较…

51单片机(STC8H8K64U/STC8051U34K64)_RA8889_8080参考代码(v1.3)

硬件:STC8H8K64U/STC8051U34K64 RA8889开发板 硬件跳线变更为并口8080模式,PS00x,R143,R142不接,R141无关 8080接口电路连接图: 实物连接图: RA8889开发板外接MCU连接器之引脚定义&…

防火巡查记录卡数字化平台

防火巡查记录卡数字化平台 利用凡尔码搭建防火巡查记录卡数字化平台是一个高效且实用的解决方案,能够显著提升防火巡查的效率和管理水平。替代纸质巡检造成的数据丢失等困扰。 一、如何注册凡尔码平台 百度搜索“凡尔码”找到平台地址即可注册开通。凡尔码平台通…

二叉树层序遍历?秒了!

废话不多说,直接上题,涉及到二叉树层序遍历的题目大部分都可以用这个方法: 示例:力扣102 二叉树的层序遍历 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有…

实验8 视图创建与管理实验

一、实验目的 理解视图的概念。掌握创建、更改、删除视图的方法。掌握使用视图来访问数据的方法。 二、实验内容 在job数据库中,有聘任人员信息表:Work_lnfo表,其表结构如下表所示: 其中表中练习数据如下: 1.‘张明…

数据结构之单链表(赋源码)

数据结构之单链表 线性表 线性表的顺序存储结构,有着较大的缺陷 插入和删除操作需要移动大量元素。会耗费很多时间增容需要申请空间,拷贝数据,释放旧空间。会有不小的消耗即使是使用合理的增容策略,实际上还会浪费许多用不上的…

【Oracle】实验五 PL_SQL编程

【实验目的】 熟悉PL/SQL的数据类型和书写规则熟悉控制结构和游标的使用编写和运行函数、过程和触发器 【实验内容】 编写脚本文件,调试运行脚本文件,并记录结果。 本地子程序的编写及调试 1、编写一个PL/SQL块,功能用于打印学生信息。整…

【学习css1】flex布局-页面footer部分保持在网页底部

中间内容高度不够屏幕高度撑不开的页面时候&#xff0c;页面footer部分都能保持在网页页脚&#xff08;最底部&#xff09;的方法 1、首先上图看显示效果 2、奉上源码 2.1、html部分 <body><header>头部</header><main>主区域</main><foot…

深入解析香橙派 AIpro开发板:功能、性能与应用场景全面测评

文章目录 引言香橙派AIpro开发板介绍到手第一感觉开发板正面开发板背面 性能性能概况性能体验 应用场景移植操作系统香橙派 AIpro开发板支持哪些操作系统&#xff1f;烧写操作系统到SD卡中启动开发板的步骤查看系统提供的事例程序体验——开发的简洁性 视频播放展示ffmpeg简介f…

【Python3】自动化测试_用Playwright发送API请求

一、创建APIRequestContex实例 # 连接到 APIRequest&#xff0c;可用于 Web API 测试的 API。 myRequest myPlaywright.request# 创建APIRequestContext实例&#xff0c;该实例可用于发送 Web 请求 myRequestContext myRequest.new_context() myRequest.new_context(**kwargs…

【MySQL】8.复合查询

复合查询 一.基本查询回顾(新增子查询)二.多表查询三.自连接四.子查询1.单列单行子查询2.单列多行子查询——三个关键字3.多列子查询4.在 from 子句中使用子查询 五.合并查询六.总结 一.基本查询回顾(新增子查询) //1.查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还…