c语言程序位置式pid算法,增量式与位置式PID算法(C语言实现与电机控制项目)...

4.2核心代码

/**************************************************************************

函数功能:增量PI控制器

入口参数:编码器测量值,目标速度

返回  值:电机PWM

根据增量式离散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)代表上一次的偏差  以此类推

pwm代表增量输出

在我们的速度控制闭环系统里面,只使用PI控制

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

**************************************************************************/

int Incremental_PI (int Encoder,int Target)

{

float Kp=20,Ki=30;

static int Bias,Pwm,Last_bias;         //相关内部变量的定义。

Bias=Encoder-Target;                //求出速度偏差,由测量值减去目标值。

Pwm+=Kp*(Bias-Last_bias)+Ki*Bias;   //使用增量 PI 控制器求出电机 PWM。

Last_bias=Bias;                       //保存上一次偏差

return Pwm;                         //增量输出

}复制代码

这里可以看到使用的是增量式比例积分控制器,Kp和Ki的值在函数中临时设置,完全按照公式编写,简单易懂。

4.3定时控制

int Target_velocity=50;  //设定速度控制的目标速度为50个脉冲每10ms

int TIM3_IRQHandler(void)

{

if(TIM3->SR&0X0001)//10ms定时中断

{

TIM3->SR&=~(1<<0);                                       //===清除定时器1中断标志位

Encoder=Read_Encoder(2);                                 //===读取编码器的值,M法测速,输出为每10ms的脉冲数

Led_Flash(100);                                          //===LED闪烁;指示单片机正常运行

Moto1=Incremental_PI(Encoder,Target_velocity);           //===速度PI控制器

Xianfu_Pwm();                                            //===PWM限幅

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

}

return 0;

}复制代码

这里控制周期设定的是每10ms控制一次,设置在10ms的中断中进行,得到控制量后,在经过简单的赋值和去绝对值来输出给驱动的PWM控制器。

4.4其他代码

/**************************************************************************

函数功能:赋值给PWM寄存器

入口参数:PWM

返回  值:无

**************************************************************************/

void Set_Pwm(int moto1)

{

if(moto1>0)         AIN2=1,         AIN1=0;

else              AIN2=0,           AIN1=1;

PWMA=myabs(moto1);

}

/**************************************************************************

函数功能:限制PWM赋值

入口参数:无

返回  值:无

**************************************************************************/

void Xianfu_Pwm(void)

{

int Amplitude=7100;    //===PWM满幅是7200 限制在7100

if(Moto1

if(Moto1>Amplitude)  Moto1=Amplitude;

}

/**************************************************************************

函数功能:绝对值函数

入口参数:int

返回  值:unsigned int

**************************************************************************/

int myabs(int a)

{

int temp;

if(a<0)  temp=-a;

else temp=a;

return temp;

}复制代码

主函数

int main(void)

{

Stm32_clock_Init(9);            //系统时钟设置

...

MiniBalance_PWM_Init(7199,0);   //=====初始化PWM 10KHZ 高频可以防止电机低频时的尖叫声

Encoder_Init_TIM2();            //初始化编码器

Timer3_Init(99,7199);           //=====10MS进一次中断服务函数,中断服务函数在control.c

while(1);

}复制代码

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

5.1核心代码

/**************************************************************************

函数功能:位置式PID控制器

入口参数:编码器测量位置信息,目标位置

返回  值:电机PWM

根据位置式离散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代表输出

**************************************************************************/

int Position_PID (int Encoder,int Target)

{

float Position_KP=80,Position_KI=0.1,Position_KD=500;

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);       //位置式PID控制器

Last_Bias=Bias;                                       //保存上一次偏差

return Pwm;                                           //增量输出

}复制代码

这里采用稍微复杂一点的PID控制,相比之前的速度控制多了个微分环节,但是由于是位置式控制,所以代码较为简单,容易理解。

5.2控制中断函数

int Target_position=11000;    //初始值是10000,目标值是11000

int TIM3_IRQHandler(void)

{

if(TIM3->SR&0X0001)//10ms定时中断

{

TIM3->SR&=~(1<<0);                                         //===清除定时器1中断标志位

Encoder=Read_Encoder(2);                                  //===读取编码器的位置数据 初始值是10000

Led_Flash(100);                                           //===LED闪烁;指示单片机正常运行

Moto1=Position_PID(Encoder,Target_position);              //===位置PID控制器

Xianfu_Pwm();                                             //===PWM限幅

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

}

return 0;

}复制代码

其他代码和上面类似

6.参数整定

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

稳定性

快速性

准确性

具体的评估指标有最大超调量、上升时间、静差等。

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

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

一般而言,一个控制系统的控制难度,一般取决于系统的转动惯量和对响应速度的要求等。转动惯量越小、对响应速度要求越低,PID 参数就越不敏感。比如现在我们控制电机转 90°,需要严格控制超调量、和静差。但是对响应速度无要求。因为电机处于轻载的情况下,转动惯量很小,这是一个很容易完成的工作。根据上面的理论分析和实践,因为响应速度无要求,一般 P 应该给小一点,然后加大系统的阻尼防止超调,也就是 D 参数尽量大,另外因为 P 值较小,应该加入I 控制减小静差。

7.总结

调试装置的过程中会遇到各种各样的问题,硬件随外界环境会不断的出现变化,会干扰我们的调试以及运行结果。整定出能适应各种环境的参数,必须对每个环境都加以测试,综合得出最合适的参数。所以在图形化的调试整定过程能够快速直观的得出结论。

转自网络_zero.

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

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

相关文章

c语言编写modbus程序,C语言编写modbus协议

《C语言编写modbus协议》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《C语言编写modbus协议(23页珍藏版)》请在人人文库网上搜索。1、include / 字地址 0 - 255 (只取低 8位) / 位地址 0 - 255 (只取低 8位)/* CRC 高位字节值表 */ const uint8 code auchCRCHi 0x0…

c语言bfs程序讲解,面试算法--二叉树DFS/BFS实现(C语言)

深度优先搜索算法(Depth First Search)DFS是搜索算法的一种。它沿着树的深度遍历树的节点&#xff0c;尽可能深的搜索树的分支。当节点v的所有边都己被探寻过&#xff0c;搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还…

c语言 子进程,子Shell和子进程

Shell 中有很多方法产生子进程&#xff0c;比如以新进程的方式运行 Shell 脚本&#xff0c;使用组命令、管道、命令替换等&#xff0c;但是这些子进程是有区别的。子进程的概念是由父进程的概念引申而来的。在 Linux 系统中&#xff0c;系统运行的应用程序几乎都是从 init(pid为…

学C语言办公本和游戏本,为什么不建议买游戏本?入手前须知,别只看中游戏...

原标题&#xff1a;为什么不建议买游戏本&#xff1f;入手前须知&#xff0c;别只看中游戏作为一名游戏本用户&#xff0c;我自己在用的游戏本已经用了四五年的时间了&#xff0c;从最初的大学生到毕业工作2年时间&#xff0c;这一游戏本给我带来了不少麻烦。最大的麻烦就是“笨…

LL1文法的判别c语言,编译原理实验七:LL1文法的判断

《编译原理实验七&#xff1a;LL1文法的判断》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《编译原理实验七&#xff1a;LL1文法的判断(11页珍藏版)》请在人人文库网上搜索。1、实验七&#xff1a;LL(1)文法的判断 一&#xff1a;要求输入&#xff1a;任意的上下文无…

如何用c语言倒序输出字母,菜鸟求助-如何用指针法将一串字符按单词的倒序输出?如:i love yo...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include void fun (char *ch1, char *ch2){int i, n(0), k;int length;bool judge(true);for (length 0; *(ch1 length) ! \0; length );// 计算ch1长度for (i length - 1; i > 0; i --){if (*(ch1 (length - 1))…

AVR单片机计算器C语言源程序,AVR单片机简单计算器的Proteus仿真实现+源码

#include "mega16.h"#include "1602.h"#include "key.h"float k1,k2; //记录最终输入运算的两个数uint one,two,three,four; //记录每次输入的数字uint flag; //计数标志位uint flag1,flag2; //第一个数 第二…

android上传图片文件至c 服务器,Android 史上最优雅的实现文件上传、下载及进度的监听...

本文已授权「刘望舒」微信公众号独家原创发布前言本文将直接使用RxHttp库实现文件上传、下载、断点下载、进度的监听&#xff0c;不对RxHttp做过多讲解&#xff0c;如果对RxHttp不了解&#xff0c;请移步本文目的在于让更多的读者知道RxHttp库&#xff0c;如果您已阅读上面4篇文…

Android中http断点下载,Android HttpURLConnection断点下载(单线程)

HttpCilent 跟 HttpURLConnection 是安卓原生的用来实现http请求的类&#xff1a;Android 6.0之后取消了HttpClient&#xff0c;不支持跟新 &#xff0c;今天小编使用的是HttpURLConnection &#xff1a;直接上代码&#xff1a;URL url null;BufferedInputStream bin null;Ht…

Android ui 单元测试 覆盖率,Android单元测试—UI测试(Espresso)

前言我们先回顾一下&#xff0c;在上一篇博客中&#xff0c;主要分享了Android单元测试的逻辑测试部分。接下来&#xff0c;我们重点讲解Android单元测试的UI测试部分&#xff01;何为UI测试呢&#xff1f;就是对用户界面的交互元素进行测试&#xff0c;如TextView、ImageView&…

android shape 圆角百分比,Android shape显示圆角问题

当需要定义一个圆角效果,当在ADT中预览,没有有效果时,只要运行就可以了&#xff01;xmlns:Android"http://schemas.android.com/apk/res/android">android:state_pressed"true">android:startColor"#ff8c00"android:endColor"#FFFFFF…

Android png模拟svg,Android 中使用svg图片

1. svg认识SVG&#xff1a;android5.0出现&#xff0c;w3c推出使用xml 描述二维图形语言,矢量图,放大缩小无影响为什么用svg,现在手机的短板是内存,不是cpu,svg通过cpu计算&#xff0c;png占用内存Android上对svg进行阉割&#xff0c;使用Vector Drawable对svg支持&#xff0c;…

android 删除垃圾文件夹,别再用手机管家清理垃圾了!删除这些文件夹,内存瞬间释放几个G...

随着手机使用时间的增加&#xff0c;手机中缓存的东西越来越多&#xff0c;这时候手机内存空间就会告急&#xff0c;从而影响手机的流畅性。那么在这种时候不要乱清理&#xff0c;我们只需要删除这几个文件夹&#xff0c;就可以帮手机轻松释放好几个G的内存。下面我们就一起来看…

android软件perthbus,Transit

v5.9.10版更新说明(2021-03-19)Whether you’re riding transit for business, pleasure, or to get shredded from a socially-spaced-out bus ballet, you’ll notice “Favourite destination” icons have been newly primped to prom perfection.What else? Hello Free2M…

HTML中scr是图片的什么,HTML中关于url、scr、href的区别

HTML中关于url、scr、href的区别URL是什么URL&#xff1a;Uniform Resource Locators(统一资源定位器)的简写&#xff0c;Web浏览器通过URL从Web服务器请求页面。url不是属性&#xff0c;src和href是属性&#xff0c;src用于替换当前元素&#xff0c;href用于在当前文档和引用资…

html5页面结构案例,前端学习笔记(五)HTML+CSS静态页面实战案例:幸福西饼首页和百度首页...

按照知乎上面汪小黑推荐的前端学习路径&#xff0c;在自学了HTML和CSS之后&#xff0c;开始尝试实战制作静态页面小项目。幸福西饼首页制作首先我在网上下载到了千锋教育提供的的幸福西饼官网静态页面的教学视频和图片素材、源码等。我是先看一集视频&#xff0c;然后关掉视频自…

计算机的应用技术课程的看法,统计教学与计算机应用的几点看法论文

统计教学与计算机应用的几点看法论文一、传统教学方法的局限性和弊端统计学是一门关于搜集、整理、汇总、描述和分析数据资料&#xff0c;并在此基础上进行推断和决策的方法论科学&#xff0c;具有很强的应用性、实践性。统计学课程是中等职业学校、财经类专业的基础核心课程。…

计算机应用基础试卷结果分析,计算机应用基础 试题

计算机应用基础 试题计算机应用基础的试题有哪些?打击知道吗?下面小编为大家带来计算机应用基础试题&#xff0c;仅供参考&#xff0c;希望能够帮到大家。计算机应用基础试题选择题:1、现代信息社会的主要标志是 ___ 。(A) 汽车的大量使用 (B) 人口的日益增长 (C) 自然环境的…

中国石油大学计算机专业调剂信息,2014年中国石油大学(北京)计算机专业考研调剂信息(新)...

写在前面&#xff1a;随着2014年34所自主划线院校考研分数线及国家线的公布&#xff0c;2014年考研复试、调剂工作也陆续拉开序幕。为了帮助更多考生顺利通过复试&#xff0c;考研论坛特开启复试调剂答疑活动&#xff0c;解答2014年考生有关考研复试和调剂的问题&#xff0c;为…

jupyter可以打开HTML文件吗,Jupyter ~ 像写文章般的 Coding (附:同一个ipynb文件,执行多语言代码)...

前面用了很久Notebook来交互式编程了&#xff0c;此次说说几个其余的选项&#xff1a;htmlNotebook Markdown此次选Markdown模式(关于Markdown基础能够看以前写的Markdown Base)python和代码同样&#xff0c;Shift回车就能够预览了&#xff0c;怎么样是否是很酷的感受&#xff…