数字控制系统

news2024/10/3 6:26:51

  

目录

两轮自平衡式机器人的控制器设计

TMS320F28069 芯片特点

处理器引脚及功能

首先分析模型来确定控制原理

速度控制器

方向控制器

系统控制框架

智能平衡移动机器人PID控制


两轮自平衡式机器人的控制器设计

由于两轮自平衡式机器人的自不稳定性,控制起来可以类比于一级倒立摆系统,因而可以借鉴相关的控制方法,常见的方法有反馈线性化方法,除此之外还有非线性PID控制自适应控制与自抗扰控制.        本文考虑到使用 Matlab/Simulink 模型直接生成控制代码,为减少控制的复杂程度与提高代码的效率,采用较为简单的双闭环PID控制思想来具体实现平衡模型到能够成功运行的嵌入式代码的实验。首先分析系统的平衡控制,整个系统通过陀螺仪加速度计传感器的数据计算到角度,根据编码器信号计算出速度信息,角度和速度作为系统输入量给到控制芯片计算出电机的控制量,最后以PWM信号的方式输出给驱动芯片,驱动执行部件——有刷电机进行运动。基础平衡计算由角度偏差值计算得到,但平衡量不足以维持平衡,加入速度控制量与转向控制量,三者线性叠加得到最终的电机PWM控制量进行输出。

TMS320F28069 芯片特点

处理器引脚及功能

    TMS320F28069分为80引脚和100引脚两种,平衡移动机器人控制板采用100引脚形式,由于引脚复用,所有外设不可同时使用,引脚及功能框图见配套资料。

首先分析模型来确定控制原理

简化机械模型如右图所示。 假设整体质量为 M,中心距离车轴高度约为 L,相对垂直面倾斜角度为θ,运动加速度为 a(t),同时车身有个角加速度 F(t),可以分析其受力方程如式所示。

Ld^2θ(t)/dt^2=gsinθ(t)−a(t)cosθ(t)+L∗F(t)               (1)

在接近平衡的时候,角度θ可以认为很小,因此可以将𝑠𝑖𝑛 𝜃(𝑡)和 𝑐𝑜𝑠 𝜃(𝑡)简化为式(4.2)。 Ld^2θ(t)/dt^2=g∗θ(t)−a(t)+L∗F(t)                             (2)

当平台趋于静止平衡的时候,加速度应该为 0,此时:

Ld^2θ(t)/dt^2=g∗sinθ(t)+L∗F(t)                                (3)

对应可以求出系统传递函数:

H(s)=θ(s)/F(s)=1/s^2−g/L                                        (4)

    由上面的公式可以知道该系统一共有两个极点,分别为±√g/L,但是根据奈奎斯特判据,其中一个极点位于s平面的右半面会引起系统的不稳定性,为了消除这种情况,可以采用加入反馈环节的方法,能够有效避免闭环过程中的参数波动所产生的扰乱系统控制效果的影响,同时能够减小系统时间常数和非线性的影响。反馈控制器可以是PI,可以是PD,也可以是PID,这里考虑到角度控制环节中,由于角度信息由陀螺仪加速度计采集,这一类惯性测量仪器容易有信号噪声和零点漂移,为了防止这些误差被积分环节进一步扩大,因而决定引入比例和微分反馈。此时系统如左下图所示。

速度控制器

         在保持平衡的前提下做速度控制是一件较为复杂的事,因为改变速度的同时不能影响基本的平衡控制,故不能将速度的控制效果直接加到电机速度的改变中去;因此,为了简化控制量与控制结果之间的关系,我们将速度控制看作是与角度相关的平衡控制的外环控制来看,即将直立控制的目标值看作是速度控制的结果         分析可以得到如图所示的控制原理图。

这里的速度反馈主要是通过编码器信号通过 eQEP功能模块的读取实现,由图可以看出原先直立平衡中的输入量变成了速度控制的输出量,由此形成一个串级控制系统,由于前面平衡控制器采用的是PD控制,这里为了消除系统的静态误差,提高响应速度以及抗扰能力,选定速度控制器为PI控制器。

 x=kp∗(θ−x_1)+kd∗θ^′                              

x_1=kp_1∗e(k)+ki_1∗∑e(k)                   

方向控制器

当不需要转向时,由于电机性能的差异,导致车子在行进过程中会偏离设定的轨迹,所以需要加入转向环的控制。利用陀螺仪Z轴角速度,来抑制小车绕Z轴的转动。这里,设置Z轴的角速度为0,利用简单的P控制或者PD控制,实现对转向环的控制要求。 当需要转向时,设置Z轴的角速度为某一正值或者负值就能实现车子的正向、反向转弯运动。转向实质就是依靠左右两个车轮的差速进行实现。

系统控制框架

控制流程主要分以下三部分。 (1)系统初始化 进行系统中断的配置,全局中断的开启,I/O口初始化,PWM初始化,QEP 初始化,IIC通信的初始化以及MPU6050的初始化,最后打开Timer0的中断及串口中断。 (2)串口中断程序 设计串口中断程序,可以实现诸如 APP 控制和参数下载、模式切换等拓展功能。 (3)主中断程序 主要中断流程设计如右图所示。

    

 智能平衡移动机器人PID控制

可分解为直立控制、速度控制和方向控制,采用 PID叠加的方法控制驱动电 机转速,实现对小车直立、速度和方向的控制。其控制算法总框图如图所示。

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

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

相关文章

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)2.7-2.8

目录 第四门课 卷积神经网络(Convolutional Neural Networks)第二周 深度卷积网络:实例探究(Deep convolutional models: case studies)2.7 Inception 网络(Inception network)2.8 使 用 开 源 …

C++容器之list基本使用

目录 前言 一、list的介绍? 二、使用 1.list的构造 2.list iterator的使用 3.list capacity 🥇 empty 🥇size 4.list element access 🥇 front 🥇 back 5.list modifiers 🥇 push_front 🥇 po…

Apache POI 2024/10/2

导入Apache POI的maven坐标 通过POI向Excel文件写入文件内容 package com.sky.test;import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File; import java.…

在Linux系统安装Nginx

注意:Nginx端口号是80(云服务器要放行) 我的是基于yum源安装 安装yum源(下面这4步就好了) YUM源 1、将源文件备份 cd /etc/yum.repos.d/ && mkdir backup && mv *repo backup/ 2、下载阿里源文件 curl -o /etc/yum.repos.d/CentOS-Base.repo ht…

java OOP基础:类与对象(万字长文)

目录 类与对象 自定义类 对象的内存模型 “”赋值 对象引用:this 作为常量的对象变量:final 判等操作 1. “重写(override)”基类的equals()方法 2. “重载(overload)”equals()方法 对象的构造 有参构造与无…

腾讯云轻量服务器+宝塔面板+基于springboot的web网页部署

经历了一段时间的折磨,近期也在看数据挖掘,还有最优化算法,现在基于我上一篇的的问题上,现在你的情况是不是:本地已经存在一个Springboot的项目,在本地能够良好运行。现在你要做的是把自己的项目部署到网上…

B树、B+树

前言 B树和B树都是平衡的多路搜索树,它们在数据库和文件系统中广泛使用,用于存储和检索数据。B是指balance,也就是平衡的意思。那这俩与平衡二叉树有啥区别?首先要知道AVL树与B树、B树他们都是自平衡搜索树。 ALV的子树间高度不会…

知识图谱入门——4:Protégé 5.6.4安装和主要功能介绍、常用插件(2024年10月2日):知识图谱构建的利器

Protg 是斯坦福大学开发的一款开放源代码的本体编辑工具。它为构建、共享和管理本体(Ontologies)提供了一个强大的平台,广泛应用于语义网、知识管理、自然语言处理等领域,特别是知识图谱的开发和管理。Protg 支持 OWL(…

Android-Handle消息传递和线程通信

本文为作者学习笔记,如有误,请各位大佬指点 目录 一、同步异步 二、Java多线程通信 三、Handler是什么 四、Handler相关的类 五、Handler常用方法 1. 发送消息 2. 接收处理消息 3. 切换线程 六、使用Handler 使用Handler更新UI 使用Handler延…

【MAUI】CommunityToolkit社区工具包介绍

一、为什么需要声明式开发 .NET的MVVM,始于WPF,很古典,它甚至可能是现代前端框架“声明式开发”的鼻祖。声明式开发,之所以出现,是因为命令式开发在UI层和代码层上无法解耦的问题。如下图所示: 1、命令式开发:后台代码需要调用UI层的控件(label.Text),如果更新UI层…

植物病虫害检测数据集 7800张 病虫害 带标注 voc yolo 7类

植物病虫害检测数据集 7800张 病虫害 带标注 voc yolo label| pic_ num| box_ num 越橘: . (932,980) 粘虫: (1104, 1104) 稻苞虫: (1389, 2269) 蝗虫: (1198, 1563) 蝽象若虫: (1594, 2576) . 绿蝽象: (1166&#xf…

微服务nginx解析部署使用全流程

目录 1、nginx介绍 1、简介 2、反向代理 3、负载均衡 2、安装nginx 1、下载nginx 2、解压nginx安装包 3、安装nginx​编辑 1、执行configure命令 2、执行make命令 4、启动nginx 1、查找nginx位置并启动 2、常用命令 3、反向代理 1、介绍反向代理配置 1、基础配置…

渗透测试入门学习——编写python脚本实现对网站登录页面的暴力破解

进入靶场输入任意密码进行尝试 发现登陆失败的特征字:“Username and/or password incorrect” 推荐用谷歌浏览器,按F12继续查看请求地址、请求头参数等详细信息,着重关注是否需要Cookie 编写python脚本 import requests # 填入请求地址 u…

Pikachu-csrf-CSRF(POST)

发起请求 拦截抓包&#xff0c;在请求信息中&#xff0c; Engagement Tool --》generate CSRF PoC 得到以下 html 代码 &#xff0c;生成poc.html 文件&#xff0c;当用户点击 <html><!-- CSRF PoC - generated by Burp Suite Professional --><body><…

C++仿函数的介绍以及priority_queue的介绍和模拟实现

目录 1.仿函数 1.1仿函数的介绍 1.2自定义类型使用仿函数 1.3自定义支持比较大小&#xff0c;但是比较的逻辑不是自己想要的逻辑 2.优先级队列priority_queue 2.1priority_queue的介绍 2.2priority_queue的使用 2.3priority_queue的模拟实现 1.仿函数 1.1仿函数的介绍…

Redis中一些其他的数据类型渐进式遍历

我们之前说了redis中的五个类型 分别是&#xff1a;String List Hash Set ZSet&#xff0c;那除了这五个redis文档中还给我们提供了一些其他的数据类型 &#xff08;一&#xff09;一些其他的数据类型 1.stream 这里的数据类型我们只做简单的一些介绍&#xff0c;如果想了解具体…

C++ | Leetcode C++题解之第452题用最少数量的箭引爆气球

题目&#xff1a; 题解&#xff1a; class Solution { public:int findMinArrowShots(vector<vector<int>>& points) {if (points.empty()) {return 0;}sort(points.begin(), points.end(), [](const vector<int>& u, const vector<int>&…

[云] Hands-on with a sample application--DockerCoins 挖矿程序!

DockerCoins 挖矿程序&#xff01;&#x1f4b0;&#x1f433;&#x1f4e6;&#x1f6a2; 不&#xff0c;你不能用 DockerCoins 买咖啡。 DockerCoins 如何工作&#xff1a; 生成一些随机字节&#xff1a; 程序首先生成一串随机的字节数据。这些随机字节用于模拟挖矿过程中的…

Pytorch实现玉米基因表达量预测模型

一、实验要求 通过搭建残差卷积网络&#xff0c;实现对玉米基因表达量的预测 二、实验目的 理解基因表达量预测问题&#xff1a;基因表达预测是生物信息学和基因组学领域中的重要任务之一&#xff0c;促进学科交叉融合。熟悉深度学习框架PyTorch&#xff1a;通过实现基因表达量…

Golang | Leetcode Golang题解之第453题最小操作次数使数组元素相等

题目&#xff1a; 题解&#xff1a; func minMoves(nums []int) (ans int) {min : nums[0]for _, num : range nums[1:] {if num < min {min num}}for _, num : range nums {ans num - min}return }