当前位置: 首页 > news >正文

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,每个人有每个人的写法,实在不会在评论区回复就行。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 景联文科技以高质量多模态数据集赋能AI大模型,精准匹配提升模型性能
  • 通用型I2C接口的应用之综合应用(N32G45XVL-STB)
  • 强化学习编程实践-4-基于蒙特卡洛的方法
  • HQL案例大全之1. 查询没有学全所有课的学生的学号、姓名(特殊:应该先连接,在筛选)
  • 鸿蒙HarmonyOS应用开发为何选择ArkTS不是Java?
  • eNSP:防火墙设置模拟公司配置(二)
  • python入门基础知识·二
  • oslo_i18n学习小结
  • LocalAI离线安装部署
  • java八股文面试题
  • 智能家居装修怎么布线?智能家居网络与开关插座布置
  • java设计模式之:策略模式+工厂模式整合案例实战(一)
  • 【C++深入学习】类和对象(一)
  • QT5.12.9 通过MinGW64 / MinGW32 cmake编译Opencv4.5.1
  • [笔试题] 笔试题面试题
  • Google 是如何开发 Web 框架的
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JAVA多线程机制解析-volatilesynchronized
  • JS+CSS实现数字滚动
  • JS变量作用域
  • pdf文件如何在线转换为jpg图片
  • python大佬养成计划----difflib模块
  • Python学习之路16-使用API
  • Terraform入门 - 3. 变更基础设施
  • zookeeper系列(七)实战分布式命名服务
  • 基于游标的分页接口实现
  • 计算机在识别图像时“看到”了什么?
  • 如何合理的规划jvm性能调优
  • 微信支付JSAPI,实测!终极方案
  • 栈实现走出迷宫(C++)
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​flutter 代码混淆
  • ​Java基础复习笔记 第16章:网络编程
  • ​虚拟化系列介绍(十)
  • !!java web学习笔记(一到五)
  • #NOIP 2014#Day.2 T3 解方程
  • (Java)【深基9.例1】选举学生会
  • (java)关于Thread的挂起和恢复
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (Python第六天)文件处理
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (二)pulsar安装在独立的docker中,python测试
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (三)c52学习之旅-点亮LED灯
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (转)socket Aio demo
  • (转)四层和七层负载均衡的区别
  • .net 发送邮件
  • .Net 基于MiniExcel的导入功能接口示例
  • .NET 通过系统影子账户实现权限维持
  • .NET的微型Web框架 Nancy
  • @Repository 注解
  • [ 数据结构 - C++] AVL树原理及实现
  • [C\C++]读入优化【技巧】