C 语言实现增量式PID
一直以来,pid都是控制领域的经典算法,之前尝试理解了很久,但还是一知半解,总是不得要领,昨天模仿着别人的代码写了一个增量式pid的代码。
我的理解就是pid其实就是对你设置的预定参数进行跟踪。在控制领域,他先采集目前的实时参数,与设定的参数进行比较,计算出误差,然后进行积分微分运算,计算出控制器需要的增量(正负),
然后与实际参数相加,使他尽可能的接近设定值 。没有D参数的称为PI控制器,也比较常用。具体公式其实不理解也没关系,只要对照着差分方程,写出相应的算法即可,然后上网查查pid调节的经验。
找到最适的pid参数。
程序中的count为需要计算的次数,有兴趣的读者可以尝试着修改一下这个数值,当count值为100的时候,你会发现他最后迭代的值并不是设定值200.0.而是一个比他小的数,
这是因为100次计算并不能使他达到设定值,毕竟我们设置的初始实际值为0,要让0直接跟踪到200需要一段跳跃时间。这个跳跃时间并不是100计算就能达到的;可以尝试几次试试。
当然实际控制领域应用的时候,并没有这个count,他会一直进行 动态运算,使实际值一直保持在设定值附近。
//实现增量式PID算法 #include "stdio.h"
void pid_init();//PID参数初始化
float pid_realise(float speed);//实现PID算法 struct {
float set_speed;//设定速度
float actual_speed;//实际速度
float error;//偏差
float error_next;//上一个偏差
float error_last;//上上一个偏差
float kp,ki,kd;//定义比例,积分,微分参数 }pid; int main()
{
pid_init();
int count = ;
while(count<)//进行400次 PID 运算,使初始值从0开始接近200.0
{
float speed = pid_realise(200.0);//设定值设定为200.0
printf("%f\n",speed);//输出每一次PID 运算后的结果
count++;
}
} void pid_init()
{
pid.set_speed = 0.0;
pid.actual_speed = 0.0;
pid.error = 0.0;
pid.error_next = 0.0;
pid.error_last = 0.0;
//可调节PID 参数。使跟踪曲线慢慢接近阶跃函数200.0 //
pid.kp = 0.2;
pid.ki = 0.01;
pid.kd = 0.2;
} float pid_realise(float speed)//实现pid
{
pid.set_speed = speed;//设置目标速度
pid.error = pid.set_speed - pid.actual_speed;
float increment_speed;//增量 increment_speed = pid.kp*(pid.error-pid.error_next)+pid.ki*pid.error+\
pid.kd*(pid.error-*pid.error_next+pid.error_last);//增量计算公式 pid.actual_speed+= increment_speed;
pid.error_last = pid.error_next;//下一次迭代
pid.error_next = pid.error;
return pid.actual_speed; }
C 语言实现增量式PID的更多相关文章
- 【转】位置式、增量式PID算法C语言实现
位置式.增量式PID算法C语言实现 芯片:STM32F107VC 编译器:KEIL4 作者:SY 日期:2017-9-21 15:29:19 概述 PID 算法是一种工控领域常见的控制算法,用于闭环反 ...
- 外置式与增量式PID模板程序(51单片机c语言)
外置式PID模板 #define MuBiaoCS 0 //目标常数 #define CHang_aCS 0 //比例常数 #define CHang_bCS 0 //积分常数 #define CHa ...
- 增量式PID计算公式4个疑问与理解
一开始见到PID计算公式时总是疑问为什么是那样子?为了理解那几道公式,当时将其未简化前的公式“活生生”地算了一遍,现在想来,这样的演算过程固然有助于理解,但假如一开始就带着对疑问的答案已有一定看法后再 ...
- 增量式PID简单翻板角度控制
1.研究背景 随着电子技术.信息技术和自动控制理论技术的完善与发展,近来微型处理器在控制方面的应用也越来越多.随之逐渐渗透到我们生活的各个领域.如导弹导航装置,飞机上仪表的控制,网络通讯与数据传输,工 ...
- 位置式PID与增量式PID算法
位置式PID与增量式PID算法 PID控制是一个二阶线性控制器 定义:通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能. 优点 ...
- 增量式PID的stm32实现(转)
源:增量式PID的stm32实现,整定过程 首先说说增量式PID的公式,这个关系到MCU算法公式的书写,实际上两个公式的写法是同一个公式变换来得,不同的是系数的差异. 资料上比较多的是: 还有一种是: ...
- 位置式PID与增量式PID
//位置式PID float Kp; float Ki; float Kd; float eSum,e0,e1; float pid_control(float now,float target) { ...
- 增量式pid和位置式PID参数整定过程对比
//增量式PID float IncPIDCalc(PID_Typedef* PIDx,float SetValue,float MeaValue)//err»ý·Ö·ÖÀë³£Êý { PIDx-& ...
- 增量式PID的matlab实现
首先,增量式PID的实现公式: 式中 Δe(k)=e(k)-e(k-1) 进一步可以改写成 式中 . . 为了便于理解,也可写成: 式中e(k)为第k次采样时的设定值与实际值的差,e(k-1 ...
随机推荐
- android project 文件夹
android多国语言文件夹 http://www.blogjava.net/zhaojianhua/archive/2012/02/09/369676.html Android平板开发精确适配不同的 ...
- Ubuntu18.10安装网易云音乐(图文并茂!)
听音乐,怎么少得了网易云音乐,下面我们在Ubuntu18.10上来安装下: 首先进入网易云音乐的下载页:https://music.163.com/#/download,选择下载Ubuntu版本: 我 ...
- 【MySQL】[Err] [Imp] 2006 - MySQL server has gone away .
wait_timeout= interactive_timeout = max_allowed_packet=10M my.ini 后面增加 就可以解决
- Nginx以服务方式启动并用定时任务每天备份日志
1.安装Nginx以服务方式启动: a.下载 instsrv.exe.srvany.exe 以管理员方式启动CMD执行以下命令: instsrv Nginx D:\nginx\srvany.exe b ...
- Dubbo -- 系统学习 笔记 -- 入门
Dubbo -- 系统学习 笔记 -- 目录 入门 背景 需求 架构 用法 入门 背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行, ...
- moment.js用法总结
moment(),获取当前时间 moment(string)把字符串变成moment时间格式 moment().format("YYYY-MM-DD HH:mm:ss"):规定时间 ...
- Explaining Delegates in C# - Part 4 (Asynchronous Callback - Way 1)
So far, I have discussed about Callback, Multicast delegates, Events using delegates, and yet anothe ...
- MySQL 安装与配置
Linux 安装 MySQL Windows 安装 MySQL 如何连接 MySQL 如何修改 MySQL 密码 如何重置 MySQL 密码
- RAC的搭建(一)--安装环境准备
软硬件环境准备: 1.1 虚拟环境: VirtualBox上两个虚拟机,3G内存1核 1.2 软件环境: 数据库安装软件:p10404530_112030_LINUX_1of7.zip p10404 ...
- [Ubuntu] 关于使用 root 账号登录
(本文验证环境为 Ubuntu 14.04 和 Lubuntu 13.04) Ubuntu 维护者们认为实在没有必要使用 root 帐户,因为你想做的所有事情管理员都可以完成,管理员只需使用 sudo ...