毕业设计 基于PID控制的智能平衡车 - stm32 物联网 单片机【超详细】

news2024/9/25 23:13:59

文章目录

  • 0 前言
  • 1 课题背景
  • 2 设计内容
  • 3 设计方案
    • 3.1 设计思路
    • 3.3 硬件设计
    • 3.4 软件设计
      • 3.4.1 关键技术 - PID控制算法
      • 3.4.2 关键技术 - 倾角估计算法
      • 3.4.3 关键技术 - 直立控制算法
      • 3.4.4 速度控制
      • 3.4.5 方向控制
  • 4 视频演示
  • 5 最后


0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 基于PID控制的智能平衡车设计与实现

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:4分
  • 工作量:4分
  • 创新点:3分

1 课题背景

随着机器人研究的进一步深入,在工业生产、安防系统、智能家居、物流网等领域
的应用更加广泛, 在实际应用中, 可能遇到复杂的任务环境。

相比多轮的轮式机器人,两轮自平衡机器人体积小, 运动灵活, 能够在比较狭窄、 需要大转角的场合中运动。 这种机器人两轮共轴,可以通过运动保持自身平衡,能实现前进、 后退、 转向、 原地静止等基本运动功能, 由于其结构特殊, 能适应不同的地形环境, 研究两轮自平衡机器人,具有重要的意义。

在这里插入图片描述


2 设计内容

使用 ARM Cortex-M4 内核的 Freescale K60 单片机为主控制器, 对加速度计和陀螺
仪的数据进行融合, 得到车身倾角最优估计, 设计 MOS 电机驱动电路, 编写 PID 控制算法控制车轮, 达到自主直立的目的。 利用编码器构成速度反馈回路, 使用 PID 控制算法进行速度和转向的控制, 最终使其保持平衡、 实现期望的运动。 本文将就倾角融合算法、机器人控制算法等问题展开研究, 具体内容如下:

  • 1) 硬件电路设计: 设计制作主控电路板、 电机驱动控制板。
  • 2) 传感器数据融合: 将陀螺仪所测数据和加速度计所测数据进行融合, 得到稳定、可靠的倾角值。
  • 3) 控制程序设计: 通过对状态反馈控制、 PID 算法等方法和理论的研究, 设计控制程序, 使小车能够完成直立、 前进、 后退、 转向等运动功能。
  • 4)单片机程序设计: 设计单片机程序, 使其具备人机交互、 控制等功能。

3 设计方案

3.1 设计思路

从控制的角度来看, 电机是系统唯一的控制对象。 车模运动控制任务可以分解成以下三个基本控制任务:

  • (1) 直立控制任务: 车模的倾角作为控制的输入量, 使用PD算法, 控制车模稳定在平衡位置。

  • (2) 速度控制任务: 直立车模的速度控制与普通的车模速度控制不同, 在直立系统中, 速度控制是通过改变车模倾角来完成的。 具体实施思路是, 对电机转速加入干扰,使车身偏离平衡位置, 以此刺激直立控制任务, 从而达到控制速度的目的, 速度控制使用PI算法。

  • (3)方向控制任务: 通过控制两个电机的差速来达到转向的目的, 方向控制使用PD算法, 使用X轴的角速度作为微分项的因子, 可以极大改善转向的动态性能, 避免振荡。

程序设计中, 三个控制任务独立进行计算。 但是每一个任务的控制对象都是电机,因此它们直接也存在着干扰与耦合。 在设计每一个控制任务时, 为了便于分析, 都假设其他两个任务是稳定的。 例如, 在进行速度控制程序设计时, 车模是能够稳定直立的;在进行方向控制程序设计时, 车模的直立控制和速度控制都是稳定的;

在进行直立控制时, 车模的速度控制和方向控制都是稳定的。这三个任务中保持车模平衡是最关键的。 由于车模同时受到三种控制的影响, 从车模平衡控制的角度来看, 其它两个控制就成为它的干扰。 为了避免影响车模平衡控制,这个车模倾角的改变需要非常缓慢的进行。 因此, 虽然三个控制任务独立运行, 但是它们之间有优先级, 即控制应该最优先满足直立的要求, 其次是方向控制的要求, 最后才是速度控制的要求。

在这里插入图片描述

3.3 硬件设计

在这里插入图片描述

主控电路板主要包括以下部分: 微控制器电路、 电源管理电路、 微控制器接口、 按键电路、蜂鸣器电路。
其中,电源管理电路分为 3. 3V 电源管理电路和 5V 电源管理电路,5V 管理电路使用 LM2940 三端线性稳压器, 输入 7. 2V 电池电压, 输出 5V 电压。

3.3V 管理电路使用 LM1117 三端线性稳压器, 输入接 LM2940 的 5V 电压, 输出 3. 3V 电压。

考虑到本系统中器件、 传感器较多, 因此 5V 管理电路和 3. 3V 管理电路均使用两个。

微控制器接口主要包括: OLED 接口、 蓝牙接口、 MMA7361 传感器接口、 L3G4200D 传感器接口、编码器正交解码接口 2 个、 四通道 PWM 接口、 遥控器解码接口, 以及预留 IO,方便调试使用。

在这里插入图片描述

3.4 软件设计

小车的控制主干流程如下:

在这里插入图片描述

3.4.1 关键技术 - PID控制算法

在自动控制中, 按照偏差(目标值与反馈值之差) 的比例§ 、 积分(I) 、 微分(D)
的组合进行控制的方法称为PID控制算法, 由于其原理简单、 稳定性好、 可靠性高、 易
于调整等优点, 在自动控制领域应用最为广泛, 已有近70年历史, 现有的很多控制方法
都是基于PID控制算法发展演变而来。 当我们对目标系统和控制对象的模型不够了解,或者不能得到控制系统的参数时, PID控制算法尤为适用。

在这里插入图片描述

1) 比例控制部分: 成比例地反应控制系统的偏差信号e(t) , 偏差一旦产生, 调节器
立即产生控制作用以减小偏差, 其控制作用最为明显。

2) 积分控制部分: 积分控制作用的强弱取决于积分时间常数Ti, Ti越大, 积分作用
越弱, 反之则越强。 积分控制主要用于消除静差, 提高系统的无差度。

3)微分控制部分: 微分控制的计算因子是偏差的变化率, 能够抑制偏差的变化, 并偏差的值变得太大之前, 引入一个早期修正量, 达到加快系统响应调节速度的目的。积分控制可以提高系统的动态性能, 提高反应速度, 克服振荡。

PID控制算法的计算结果是偏差信号的比例、 积分、 微分三部分的线性叠加, 偏差值e(t) 即目标值r(t) 与反馈值c(t) 的差, 属于闭环控制系统, 因此需要使用传感器构成反馈回路。

(代码实现)

3.4.2 关键技术 - 倾角估计算法

要控制车模平衡, 首先就需要测量车身倾角。 测量倾角主要有两种方法:

1. 利用加速度传感器。 加速度计静止放置的时候, 因为受到重力加速度的影响, 三个轴感应到的加速度跟传感器与地平面之间的倾角有关, 具体关系如下图所示。

在这里插入图片描述

加速度传感器的值与地面之间的倾角呈三角函数关系:

在这里插入图片描述

然而小车在运动过程中, 会产生极大的噪声, 取加速度传感器瞬时值计算倾角误差太大。 难以获得稳定的倾角数据。

2.利用陀螺仪测量的角速度进行积分。

角速度积分可以得到变化的角度。 但是传感器
都有误差, 陀螺仪也不例外, 而且陀螺仪还存在温漂, 因此长时间的积分过程, 很难保
证得到正确的角度。

因此需要一种算法, 能够结合陀螺仪的动态性能和加速度传感器的静态精确度, 从而得到可靠的倾角数据。

3.4.3 关键技术 - 直立控制算法

车模平衡控制需要负反馈, 就需要能够测量车体的倾角, 构成反馈回路。 在能够测量倾角的情况下, 设定目标平衡角度, 使用 PID 算法进行闭环控制。 因为车体只会在一个的方向上运动, 只存在一个维度的倾斜, 因此只需要测量一个维度的倾角, 然后控制轮子转动, 抵消车体在该维度上的倾斜, 就可以完成平衡控制

在这里插入图片描述

我们对系统进行简单建模, 首先, 两轮自平衡车可以简化为一个一阶倒立摆模型,假设车体的高度为 L, 质量为 m , 在外力作用下, 车模产生角加速度为 x(t) 。

如下图所示, 沿着垂直于底盘的方向进行受力分析, 可以得到运动加速度 a(t) 以及外力干扰加速度 x(t) 之间的运动方程

在这里插入图片描述

控制流程

在这里插入图片描述

void Angle_Calculate()
{
int16_t AngleControlOut_P,AngleControlOut_D;
angle_Accel = (A_Z-AZ_ZERO);
angle_Accel*=0.0039f;
angle_Accel = asin(angle_Accel);
angle_Accel*=500;
Gyro_Now = (T_Y-TY_OFFSET) * TY_Ratio;26 页 共 47Erjie_Lvbo(angle_Accel,Gyro_Now);
if(FilterSwitch==0) myfilter=QingHua_AngleCalaulate;
else if(FilterSwitch==1)myfilter=Yijie_Lvbo;
else if(FilterSwitch==2) myfilter=Erjie_Lvbo;
else if(FilterSwitch==3) myfilter=Kalman_Filter;
if(FilterSwitch==3)
{
myfilter(angle_Accel,Gyro_Now);
ZL.error=angle_now_kal-(Balance_Point);
}
else
{
myfilter(angle_Accel,Gyro_Now);
ZL.error=angle_now-(Balance_Point);
}
AngleControlOut_P=-(int16_t)(ZL.P*ZL.error);
AngleControlOut_D=-(int16_t)(ZL.D*Gyro_Now);
if(AngleControlOut_D>500) AngleControlOut_D=500;//对微分项限幅
else if(AngleControlOut_D<-500) AngleControlOut_D=-500;
AngleControlOut=AngleControlOut_P+AngleControlOut_D;
if(AngleControlOut>800) AngleControlOut=800;
else if(AngleControlOut<-800) AngleControlOut=-800;
}

3.4.4 速度控制

直立车模的速度控制方法与普通车模的速度控制方法不同, 因为普通车模的电机只需要控制转动, 而直立车模的电机输出是平衡控制、 速度控制、 方向控制三部分之间的叠加。

因为直立系统的首要任务是保持直立, 当车模倾角发生改变, 车模就会在直立控制的作
用下向倾斜方向运动。 速度控制就是利用了直立系统的这种特性。

改变车模倾角有两种方法:

(1) 改变车模直立控制的目标角度, 直立控制 PD 算法中, 有一个目标倾角, 当目
标倾角不是真正的平衡位置倾角时, 车模会一直运动。 通过编码器测量转速, 形成
速度反馈回路, 就可以使用 PID 算法进行速度调节。

(2) 给电机施加干扰输出。 在直立过程中, 如果增加或者减少电机输出, 车模就很难维持平衡, 在直立控制的作用下, 车模就会运行。 通过编码器测量转速, 形成速度反馈回路, 就可以使用 PID 算法进行速度调节。

学长设计的系统中,使用第二种方法对速度进行控制, 因为第二种方法对直立的影响较小,可以提高系统的稳定性, 但是速度控制的灵敏度没有第一种高。

在这里插入图片描述

void Speed_Calculate()
{
SP.goal=(t1-t1_mid)/10;
if(SP.goal>50) SP.goal=50;
else if(SP.goal<-30) SP.goal=-30;
SpeedControlOut_Old=SpeedControlOut;
SP.error=(SP.goal)-(Speed_L+Speed_R)/2;
SP.error_sum+=SP.error;
if(SP.error_sum>200) SP.error_sum=200;//积分限幅
else if(SP.error_sum<-200) SP.error_sum=-200;
SpeedControlOut=-(int16_t)((SP.P)*SP.error+SP.I*SP.error_sum);
if(SpeedControlOut>300) SpeedControlOut=300;//速度环输出限幅
else if(SpeedControlOut<-300) SpeedControlOut=-300;
}

3.4.5 方向控制

直立车模的转向是通过两轮的差速来完成的, 转向控制使用 PD 算法, 小车不具备自主识别路径的功能, 因此 PD 算法的输入参数使用遥控器完成。 为了改善转向的动态特性, 避免振荡, 对 PD 算法做了修改, 微分项的因子不再使用传统的 e(t) -e(t-1) ,而是使用陀螺仪的 X 轴, 因为陀螺仪输出灵敏度更高。

在这里插入图片描述

void Direction_Calculate(int16_t bias)
{
DIR.last_error=DIR.error;
DIR.error=bias/6-dmp_yaw;
DIR.error_sum+=DIR.error;
if(DIR.error_sum>2000) DIR.error_sum=2000;
else if(DIR.error_sum<-2000) DIR.error_sum=-2000;
DirectionControlOut_Old=DirectionControlOut;
DirectionControlOut = DIR.P*DIR.error
+ DIR.I*DIR.error_sum
+ DIR.D*(T_X-TX_OFFSET);
DirectionControlOut_Old=DirectionControlOut;
DirectionControlOut=bias*0.15f;
if(DirectionControlOut>300) DirectionControlOut=300;
else if(DirectionControlOut<-300) DirectionControlOut=-300;
}

4 视频演示

基于stm32的双轮平衡车


5 最后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/97594.html

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

相关文章

长短时记忆网络(LSTM)负荷预测项目(matlab)

目录 1. LSTM介绍 2. 数据集准备及预处理 3. LSTM模型搭建与训练 4. 预测模型测试 1. LSTM介绍 长短期记忆网络 LSTM&#xff08;long short-term memory&#xff09;是 RNN 的一种变体&#xff0c;其核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径…

每日一道LeetCode(一):两数之和

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

刷完这1000道JAVA面试题,让你成功逆袭上岸

内容涵盖&#xff1a;Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈。 由于整个笔记比较全面&#xff0c;内容相当的多 &#xff0c;这里仅展示面经中的面试真题&#xff0…

Keras深度学习实战(41)——语音识别

Keras深度学习实战&#xff08;41&#xff09;——语音识别0.前言1. 模型与数据集分析1.1 数据集分析1.2 模型分析2. 语音识别模型2.1 数据加载与预处理2.2 模型构建与训练小结系列链接0.前言 语音识别(Automatic Speech Recognition, ASR&#xff0c;或称语音转录文本)使声音…

openssl加密base64编码

openssl OpenSSL 是一个安全套接字层密码库&#xff0c;囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议&#xff0c;并提供丰富的应用程序供测试或其它目的使用。 首先&#xff0c;要安装 openssl: centos命令: sudo yum install openssl-devel ubuntu命令&#x…

WebService基于Baidu OCR和Map API的导航服务

哈尔滨工业大学国家示范性软件学院 《面向服务的软件系统》大作业 项目题目&#xff1a; 基于OCR和地图API的路牌定位与导航服务 项目组成员&#xff1a; 姓名 学号 李启明 120L021920 完成日期&#xff1a; 2022年 12 月 15 日 1.选题 1.1 作业…

NUS CS5477 assignment1

课程链接三维视觉 作业任务任务 课程任务就一个&#xff0c;实现一个Linear Sweep Algorithm&#xff0c;这个算法是用来检测两张图片之间的对应点。 因为SIFT检测如果把检测点的数量增大&#xff0c;可能会存在一些错误错误检测点&#xff0c;所有通常把SIFT检测的点的数量…

内网穿透:在家远程ssh访问学校内部网服务器

注册一个cpolar账号 cpolar官网注册即可&#xff08;邮箱即可&#xff09; cpolar支持http/https/tcp协议&#xff0c;不限制流量&#xff08;花生壳免费只能使用1G流量&#xff09;&#xff0c;也不需要公网ip&#xff0c;只要在服务器上安装客户端即可配置&#xff0c;免费&…

攻防世界-file_include

题目 访问路径获得源码 <?php highlight_file(__FILE__);include("./check.php");if(isset($_GET[filename])){$filename $_GET[filename];include($filename);} ?> 通过阅读php代码&#xff0c;我们明显的可以发现&#xff0c;这个一个文件包含的类型题…

Java项目:ssm校内超市管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本系统分为管理员与普通用户两种角色。采用后端SSM框架&#xff0c;前端BootStrap&#xff08;前后端不分离&#xff09;的系统架构模式&#x…

python中调用命令行执行外部程序

&#x1f31e;欢迎来到python的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f320;本阶段属于练气阶段&#xff0c;希望各位仙友顺利完成…

STM32的三种更新固件的方式

说明&#xff1a; stm32有三种更新固件的方式&#xff0c;分别为&#xff08;1&#xff09;DFU模式&#xff08; Development Firmware Upgrade 即“开发固件升级”&#xff09;&#xff1b;&#xff08;2&#xff09;SWD/JLINK 下载 &#xff08;3&#xff09;第三方bootload…

NoSQL数据库原理与应用综合项目——HBase篇

NoSQL数据库原理与应用综合项目——HBase篇 文章目录NoSQL数据库原理与应用综合项目——HBase篇0、 写在前面1、本地数据或HDFS数据导入到HBase2、Hbase数据库表操作2.1 Java API 连接HBase2.2 查询数据2.3 插入数据2.4 修改数据2.5 删除数据3、Windows远程连接HBase4、数据及源…

springboot常用组件集成

今天与大家分享spring-mybatis、reids集成&#xff0c;druid数据库连接池。如果有问题&#xff0c;望指教。 1. 创建项目 File -> New -> project ...Spring Initializr选择项目需要的第三方组件注&#xff1a;可以参考第二次课演示的操作步骤&#xff0c;有详细的拷图…

java药店网站药店系统药店源码刷脸支付源码

简介 首页&#xff0c;搜索商品&#xff0c;详情页&#xff0c;根据不同规格显示不同的商品价格&#xff0c;加入购物车&#xff0c;立即购买&#xff0c;评价列表展示&#xff0c;商品详情展示&#xff0c;商品评分&#xff0c;分类商品&#xff0c;标签查询&#xff0c;更多…

MapReduce 概述原理说明

文章目录MapReduce概述一、MapReduce定义二、MapReduce 优缺点1、MapReduce 优点(1)、MapReduce 易于编程(2)、良好的扩展性(3)、高容错性(4)、适合PB级以上的海量数据的离线处理2、MapReduce 缺点(1)、不擅长实时计算(2)、不擅长流式计算(3)、不擅长DAG(有向图)计算三、MapRed…

二叉树进阶

博主的博客主页&#xff1a;CSND博客 Gitee主页&#xff1a;博主的Gitee 博主的稀土掘金&#xff1a;稀土掘金主页 博主的b站账号&#xff1a;程序员乐 公众号——《小白技术圈》&#xff0c;回复关键字&#xff1a;学习资料。小白学习的电子书籍都在这。 目录根据二叉树创建字…

基于java+springmvc+mybatis+vue+mysql的协同过滤算法的电影推荐系统

项目介绍 基于协同过滤算法的电影推荐系统利用网络沟通、计算机信息存储管理&#xff0c;有着与传统的方式所无法替代的优点。比如计算检索速度特别快、可靠性特别高、存储容量特别大、保密性特别好、可保存时间特别长、成本特别低等。在工作效率上&#xff0c;能够得到极大地…

Hive自定义UDF函数

以下基于hive 3.1.2版本 Hive中自定义UDF函数&#xff0c;有两种实现方式&#xff0c;一是通过继承org.apache.hadoop.hive.ql.exec.UDF类实现&#xff0c;二是通过继承org.apache.hadoop.hive.ql.udf.generic.GenericUDF类实现。 无论是哪种方式&#xff0c;实现步骤都是&…

网上超市系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 研究内容&#xff1a;设计开发简单购网上超市系统&#xff0c;采用Java语言&#xff0c;使用ySQL数据库&#xff0c; 实…