直流电机 PID 开发指南学习笔记

news2025/1/2 0:10:11

直流电机 PID 开发指南

(基于【平衡小车之家】直流电机 PID 学习套件 1.0)

目录

1.位置闭环控制

1.1 理论分析

1.2 控制原理图

1.3 C 语言实现

1.4 参数整定

2.速度闭环控制

2.1 理论分析

2.2 控制原理图

2.3 C 语言实现


        PID 调节器出现于上世纪 30 年代。所谓 PID 控制,就是对偏差进行比例、 积分和微分的控制。PID 由 3 个单元组成,分别是比例(P)单元、积分(I)单 元、微分(D)单位。在工程实践中,一般 P 是必须的,所以衍生出许多组合的 PID 控制器,如 PD、PI、PID 等。

         在我们的微处理器里面,因为控制器是通过软件实现其控制算法的,所以必须对模拟调节器进行离散化处理,这样它只需根据采样时刻的偏差值计算控制量。因此,我们需要使用离散的差分方程代替连续的微分方程。

        假定采样时间很短时(比如 10ms),可做如下处理:

1) 用一介差分代替一介微分;

2) 用累加代替积分。

1.位置闭环控制

        位置闭环控制就是根据编码器的脉冲累加测量电机的位置信息,并与目标值 进行比较,得到控制偏差,然后通过对偏差的比例、积分、微分进行控制,使偏 差趋向于零的过程。

1.1 理论分析

        根据位置式离散 PID 公式

        Pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]

        e(k):本次偏差

        e(k-1):上一次的偏差

        ∑e(k):e(k)以及之前的偏差的累积和;其中 k 为 1,2,,k;

        Pwm 代表输出

1.2 控制原理图

        图 1 为位置控制原理图。其中需要说明的是,我们这边是通过微机实现 PID 控制的,所以下面的【位置 PID 控制器】是一个软件实现的过程,比如在我们的 代码里面就是一个我们定义的函数。

图 1

1.3 C 语言实现

        如何把我们以上的理论分析和控制原理图使用 C 语言写出来呢,这是一个有 趣且实用的过程。位置式 PID 具体通过 C 语言实现的代码如下:

int Position_PID (int Encoder,int Target)

{

        static float Bias,Pwm,Integral_bias,Last_Bias;

        Bias=Encoder-Target; //计算偏差

        Integral_bias+=Bias; //求出偏差的积分 

        Pwm=Position_KP*Bias+Position_KI*Integral_bias+Position_KD*(Bias-Last_Bias);        
        Last_Bias=Bias; //保存上一次偏差

        return Pwm; //输出

}

        入口参数为编码器的位置测量值和位置控制的目标值,返回值为电机控制 PWM(现在再看一下上面的控制原理图是不是更加容易明白了)。

第一行是相关内部变量的定义。

第二行是求出速度偏差,由测量值减去目标值。

第三行通过累加求出偏差的积分。

第四行使用位置式 PID 控制器求出电机 PWM。

第五行保存上一次偏差,便于下次调用。

最后一行是返回。

然后,在定时中断服务函数里面调用该函数实现我们的控制目标: Moto=Position_PID(Encoder,Target_Position);

Set_Pwm(Moto); //===赋值给 PWM 寄存器

1.4 参数整定

        首先我们需要明确我们的控制目标,也就是满足控制系统的 3 个要求:

        1 稳定性

        2 快速性

        3 准确性

        具体的评估指标有最大超调量、上升时间、静差等。 最大超调量是响应曲线的最大峰值与稳态值的差,是评估系统稳定性的一个 重要指标;上升时间是指响应曲线从原始工作状态出发,第一次到达输出稳态值 所需的时间,是评估系统快速性的一个重要指标;静差是被控量的稳定值与给定 值之差,一般用于衡量系统的准确性,具体可以参考图 2 的解析。

 图 2

        下面我们使用【平衡小车之家】直流电机 PID 学习套件 1.0 进行 PID 参数整 定实验,使用套件的控制板上面的按键调节 PID 参数,然后通过观察上位机响应 曲线,并评估控制效果,给出 PID 调节的心得。关于 P、I、D 三个参数的主要作 用,可以大致又不完全地概况为:P 用于提高响应速度、I 用于减小静差、D 用 于抑制震荡。

         下面我们把控制目标从 10000 上升至 10260 时,观察响应曲线的变化。一般 我们进行 PID 参数整定的时候,首先设 I 和 D 值为零,然后把 P 值从 0 逐渐增大,

直到系统震荡。 ① KP=500,KI=0,KD=0.响应曲线如图 3:

图 3

        这个时候因为 P 值比较大,出现了震荡。可能大家会疑惑,为什么 I 值为零, 但是没有静差呢?因为这个时候的 P 值已经很大了,静差一般是在 P 值较小而 I 值为零的时候出现的。为了验证我们的想法,我们对 PID 参数进行调整。

② KP=50,KI=0,KD=0.响应曲线如图 4:

图 4

        据图分析,如我们所设想的,在 P 值较小的时候出现了静差,响应速度也明显降 低。所以增大 P 值可以一定程度上消除静差,提高响应速度,但是会导致系统震 荡,而加入微分控制可以有效抑制震荡。下面我们尝试一组新的 PID 参数。

③ KP=500,KI=0,KD=400.响应曲线如图 5:

图 5

        据图分析,加入微分控制之后,图 5 与图 3 相比,系统的震荡得到了抑制,震荡 次数减少。事物都有两面性,微分控制也是弊端的。可以看到,系统的响应明显 变慢了,因为引入微分控制相当于增大了系统的阻尼。这个时候我们需要结合 P 值和 I 值进行进一步的优化。

        在实践生产工程中,不同的控制系统对控制器效果的要求不一样。比如平衡 车、倒立摆对系统的快速性要求很高,响应太慢会导致系统失控。智能家居里面 的门窗自动开合系统,对快速性要求就不高,但是对稳定性和准确性的要求就很 高,所以需要严格控制系统的超调量和静差。所以 PID 参数在不同的控制系统中 是不一样的。只要我们理解了每个 PID 参数的作用,我们就可以应对工程中的各 种项目的 PID 参数整定了。

        位置控制的调节经验可以总结为:先只使用 P 控制,增大 P 系数至系统震荡 之后加入微分控制以增大阻尼,消除震荡之后再根据系统对响应和静差等的具体 要求,调节 P 和 I 参数。

         一般而言,一个控制系统的控制难度,一般取决于系统的转动惯量和对响应速度的要求等。转动惯量越小、对响应速度要求越低,PID 参数就越不敏感。

图 6

        比如现在我们接到一个任务,使用如图 6 所示的【平衡小车之家】直流电机 PID 学习套件控制电机转 90°,需要严格控制超调量、和静差。但是对响应速度 无要求。

        因为电机处于轻载的情况下,转动惯量很小,这是一个很容易完成的工作。 根据上面的理论分析和实践,因为响应速度无要求,一般 P 应该给小一点,然后 加大系统的阻尼防止超调,也就是 D 参数尽量大,另外因为 P 值较小,应该加入 I 控制减小静差。根据我们的经验和简单的参数整定,最终得到一组 PID 参数 KP=120,KI=0.1,KD=500;响应曲线如图 7 所示。

图 7

2.速度闭环控制

        速度闭环控制就是根据单位时间获取的脉冲数(这里使用了 M 法测速)测量 电机的速度信息,并与目标值进行比较,得到控制偏差,然后通过对偏差的比例、 积分、微分进行控制,使偏差趋向于零的过程。

        一些 PID 的要点在位置控制中已经有讲解,这里不再赘叙。

        需要说明的是,这里速度控制 20ms 一次,一般建议 10ms 或者 5ms,因为在 这里电机是使用 USB 供电,速度比较慢,20ms 可以延长获取速度的单位时间, 提高编码器的采值。

2.1 理论分析

根据增量式离散 PID 公式

                Pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]

e(k):本次偏差

e(k-1):上一次的偏差

e(k-2):上上次的偏差

Pwm 代表增量输出

在我们的速度控制闭环系统里面只使用 PI 控制,因此对 PID 控制器可简化 为以下公式:

Pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)

2.2 控制原理图

        图 8 为速度控制原理图。其中需要说明的是,我们这边是通过微机实现 PID 控制的,所以下面的【速度 PI 控制器】是一个软件实现的过程,比如在我们的 代码里面就是一个我们定义的函数。

图 8

2.3 C 语言实现

        增量式 PI 控制器具体通过 C 语言实现的代码如下:

int Incremental_PI (int Encoder,int Target) 
{ 
    static float Bias,Pwm,Last_bias; 
    Bias=Encoder-Target; //计算偏差 
    Pwm+=Velocity_KP*(Bias-Last_bias)+Velocity_KI*Bias; //增量式 PI 控制器 
    Last_bias=Bias; //保存上一次偏差 
    return Pwm; //增量输出 
}

入口参数为编码器的速度测量值和速度控制的目标值,返回值为电机控制 PWM。

第一行是相关内部变量的定义。

第二行是求出速度偏差,由测量值减去目标值。

第三行使用增量 PI 控制器求出电机 PWM。

第四行保存上一次偏差,便于下次调用。

最后一行是返回。

然后,在定时中断服务函数里面调用该函数实现我们的控制目标: Moto=Incremental_PI(Encoder,Target_Velocity);

Set_Pwm(Moto); //===赋值给对应 MCU 的 PWM 寄存器

         这里我们的参数 Velocity_KP=20,Velocity_KI=30,PI 参数在不同的系统中 不一样,我们的代码中的 PID 参数,仅针对【平衡小车之家】直流电机 PID 学习 套件 1.0 调试得到,大家可以使用控制板的按键调节 PI 参数,然后通过观察上 位机波形评估控制效果。

         以上的知识请结合完整代码理解,我们的代码基于 STM32F103C8 控制器,但是把基于 C 语言的 PID 控制器部分剥离,并放在 control.c 里面,故对 STM32 不熟悉的同学依然可以使用记事本打开这个文件查看。

转自:平衡小车之家学习资料,如有侵权请联系删除。

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

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

相关文章

keepalived脑裂后,近20min不能访问虚拟IP事故分析

问题现象和说明 真实的场景比较复杂,抽象起来可以用下面的图表示, #mermaid-svg-q8mZrLctqAENT1r0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-q8mZrLctqAENT1r0 .error-icon{fill:#5522…

【经验总结】浮点数double/float精度误差问题总结

现象 最近做的项目中经常会在C环境下和高精度的double浮点类型数据打交道 这些double类型数据精度级别可能到 pico级别(10^-12) 甚至 femto级别(10^-15),用来表示集成电路的一些微观属性 但是非常诡异的是,不知道为什么在对这些高精度的浮点数进行运算时&#xff…

RK3588平台开发系列讲解(工具篇)ADB的使用

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、连接设备1.1、USB 的方式1.2、网络的方式二、常用命令沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍ADB的使用。 一、连接设备 1.1、USB 的方式 主机通过 USB 连接设备,具体如何连接。 US…

chatgpt赋能python:Python中5%-3的用法介绍

Python中5%-3的用法介绍 在Python编程中,5%-3是一个常用的运算符,其作用是对5除以3取余数。在本文中,我将介绍5%-3的用法以及如何在Python编程中使用该运算符。 什么是5%-3运算符 5%-3运算符表示对5除以3取余数,余数为2。 5%-…

chatgpt赋能python:Python中9/2的结果为4.5——一篇关于Python运算符的SEO文章

Python中9/2的结果为4.5——一篇关于Python运算符的SEO文章 如果你是一名Python开发工程师,那么你肯定熟悉运算符这个概念。作为一门计算机语言,Python中有各种各样的运算符,包括算术运算符、赋值运算符、比较运算符等等。今天,我…

WiFi 6 vs WiFi 5

在现代无线通信领域,WiFi已经成为人们日常生活中不可或缺的一部分。随着技术的不断发展,WiFi标准也在不断更新和演进。WiFi 6(802.11ax)和WiFi 5(802.11ac)是当前两个主要的WiFi标准。 本文将详细介绍WiFi …

大佬联合署名!反对 ACL 设置匿名期!

夕小瑶科技说 原创 作者 | 智商掉了一地、Python 近日,自然语言处理领域的多位知名学者联合发起了一项反对 ACL 设置匿名期的联合署名行动,包括著名学者 William Wang 和 Yoav Goldberg 在内,还有Christopher Potts、Hal Daume、Luke Zettl…

Springboot +spring security,认证方式---HTTP基本认证的实现

一.简介 这篇文章来学习下security的认证方式其中的HTTP基本认证。 二.Spring Security的认证方式 2.1什么是认证 认证: 就是用来判断系统中是否存在某用户,并判断该用户的身份是否合法的过程,解决的其实是用户登录的问题。认证的存在,是…

2023年系统分析师案例及论文(回忆版)

2023年5月27日,全国计算机等级上半年考试如期举行,北京市软件分析师考试地点在北京市对外贸易学校,早上外面下起雨 看考场分布图,44个考场,推测有44*301320名考生,本人所在的考场,实际到场17人…

【SpringCloud组件——GateWay】

前言: 在我们之前所用的Nacos和Feign以及Eureka,这些组件都是用与系统内部之间进行互相访问的,但是当用户访问系统时,我们没有采取任何措施,举个例子:系统管理员可以访问哪些接口并具备哪些操作权限&#…

chatgpt赋能python:Python中0的SEO优化综述

Python中0的SEO优化综述 在Python编程中,数字0是一个非常重要的数值,它有许多用途和应用。在SEO优化中,合理地应用0可以帮助我们提高网站排名和用户体验。本文将介绍Python中0的一些具体应用以及如何进行合理的SEO优化。 0的应用 0作为标记…

张小飞的Java之路——第四十一章——File

写在前面: 视频是什么东西,有看文档精彩吗? 视频是什么东西,有看文档速度快吗? 视频是什么东西,有看文档效率高吗? 介绍 诸小亮:从今天开始,我们学习 IO 流 张小飞…

CAPL(vTESTStudio) - CAPL控制程控电源IT6332A

目录 为什么要使用CAPL控制程控电源? 一、程控电源的选择 二、程控电源通信协议

Junit5单元测试框架详解

前面我们学习了Selenium自动化测试框架,但是有的时候测试用例会很多,我们需要一个工具来管理这些测试用例,而Junit就是一个很好的管理工具,简单点来说,Junit就是一个针对Java的单元测试框架; 目录 一. 关于…

凸优化系列——凸集

1.最优化问题概述 最优化问题是决策问题,选择一些可以执行的策略使得目标最优;一个最优化问题包括 决策变量;一个或多个目标函数;一个由可行策略组成的集合,可由等式或者不等式刻画; 最优化问题的形式: 最优化问题的分类 无约束优化问题和…

【C++】函数 - 定义,调用,值传递,常见样式,声明,分文件编写

文章目录 1. 函数的定义2. 函数的调用3. 值传递4. 常见的样式5. 函数的声明6. 函数的分文件编写 所谓数组,就是一个集合,里边存放了相同类型的数据元素。 特点1:数组中的每个数据元素都是相同的数据类型 特点2:数组是由连续的内存…

chatgpt赋能python:Python在SEO中的作用:不简单的搜索引擎优化工具

Python在SEO中的作用:不简单的搜索引擎优化工具 Python作为一种强大的编程语言,已经在各个领域中得到了广泛的应用。在搜索引擎优化(SEO)领域,Python也发挥了重要作用。 Python在SEO中的应用 程序化爬虫 很多SEO工…

(c语言)将一句话的单词进行倒置,标点不倒置(i like beijing.)

目录 例子: 思路方法: ​编辑 (分板块)代码的实现: 一.字符串的获取(3种简单的方法) 1.用gets()函数,即使中间有空格也会读取 2.用fgets(&am…

RK3588平台开发系列讲解(项目篇)RKNN-Toolkit2 的使用

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、RKNN-Toolkit2安装二、模型转换和模型推理三、性能和内存评估沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 NPU 是专门用于神经网络的处理单元。它旨在加速人工智能领域的神经网络算法,如机器视觉和自…

c#快速入门(2)

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析2 目录 👉🏻类、对象、类成员简介👉🏻语句…