c语言写pid算法,用c语言实现的pid算法
pid算法应该算是所以算法中最稳定最可靠最简单的算法,在库函数中添加这种算法对实际控制的时延有非常大的帮助。
全部资料51hei下载地址:
C语言PID算法.doc
PID算法(c语言)(来自老外)
#include
#include
//定义PID的结构体
struct _pid
{
int pv; //integer that contains the process value 过程量
int sp; //*integer that contains the set point 设定值
float integral; // 积分值 -- 偏差累计值
float pgain;
float igain;
float dgain;
int deadband; //死区
int last_error;
};
struct _pid wARM,*pid;
int process_point, set_point,dead_band;
float p_gain, i_gain, d_gain, integral_val,new_integ;;
//----------------------------------------------
pid_init DESCRIPtiON This function initializes the pointers in the _pid structure to the process variable and the setpoint. *pv and *sp are integer pointers.
//----------------------------------------------
void pid_init(struct _pid *warm, int process_point, int set_point)
{
struct _pid *pid;
pid = warm;
pid->pv = process_point;
pid->sp = set_point;
}
//----------------------------------------------pid_tune DESCRIPTION Sets the proportional gain (p_gain), integral gain (i_gain),
derivitive gain (d_gain), and the dead band (dead_band) of a pid control structure _pid.
设定PID参数 ---- P,I,D,死区
//----------------------------------------------
void pid_tune(struct _pid *pid, float p_gain, float i_gain, float d_gain, int dead_band)
{
pid->pgain = p_gain;
pid->igain = i_gain;
pid->dgain = d_gain;
pid->deadband = dead_band;
pid->integral= integral_val;
pid->last_error=0;
}
//----------------------------------------------
pid_setinteg DESCRIPTION Set a new value for the integral term of the pid equation.
This is useful for setting the initial output of the pid controller at start up.
设定输出初始值
//----------------------------------------------
void pid_setinteg(struct _pid *pid,float new_integ)
{
pid->integral = new_integ;
pid->last_error = 0;
}
//----------------------------------------------
pid_bumpless DESCRIPTION Bumpless transfer algorithim.
When suddenly changing setpoints, or when restarting the PID equation after an extended pause,
the derivative of the equation can cause a bump in the controller output. This function will help smooth out that bump.
The process value in *pv should be the updated just before this function is used.
pid_bumpless 实现无扰切换
当突然改变设定值时,或重新启动后,将引起扰动输出。这个函数将能实现平顺扰动,在调用该函数之前需要先更新PV值
//----------------------------------------------
void pid_bumpless(struct _pid *pid)
{
pid->last_error = (pid->sp)-(pid->pv); //设定值与反馈值偏差
}
//----------------------------------------------
pid_calc DESCRIPTION PeRForms PID calculations for the _pid structure *a.
This function uses the positional form of the pid equation, and incorporates an integral windup prevention algorithim.
Rectangular integration is used, so this function must be repeated on a consistent time basis for accurate control.
RETURN VALUE The new output value for the pid loop. USAGE #include "control.h"
本函数使用位置式PID计算方式,并且采取了积分饱和限制运算
PID计算
//----------------------------------------------
float pid_calc(struct _pid *pid)
{•
int err;
float pterm, dterm, result, ferror;
// 计算偏差
err = (pid->sp) - (pid->pv);
// 判断是否大于死区
IF (abs(err) > pid->deadband)
{
ferror = (float) err; //do integer to float conversion only once 数据类型转换
// 比例项
pterm = pid->pgain * ferror;
if (pterm > 100 || pterm < -100)
{
pid->integral = 0.0;
}
else
{
// 积分项
pid->integral += pid->igain * ferror;
// 输出为0--100%
// 如果计算结果大于100,则等于100
if (pid->integral > 100.0)
{
pid->integral = 100.0;
}
// 如果计算结果小于0.0,则等于0
else if (pid->integral < 0.0)
pid->integral = 0.0;
}
// 微分项
dterm = ((float)(err - pid->last_error)) * pid->dgain;
result = pterm + pid->integral + dterm;
}
else
result = pid->integral; // 在死区范围内,保持现有输出
// 保存上次偏差
pid->last_error = err;
// 输出PID值(0-100)
return (result);
}
//----------------------------------------------
void main(void)
{
float display_value;
int count=0;
pid = &warm;
// printf("Enter the values of Process point, Set point, P gain, I gain, D gain \n");
// scanf("%d%d%f%f%f", &process_point, &set_point, &p_gain, &i_gain, &d_gain);
// 初始化参数
process_point = 30;
set_point = 40;
p_gain = (float)(5.2);
i_gain = (float)(0.77);
d_gain = (float)(0.18);
dead_band = 2;
integral_val =(float)(0.01);
printf("The values of Process point, Set point, P gain, I gain, D gain \n");
printf(" %6d %6d %4f %4f %4f\n", process_point, set_point, p_gain, i_gain, d_gain);
printf("Enter the values of Process point\n");
while(count<=20)
{
scanf("%d",&process_point);
// 设定PV,SP值
pid_init(&warm, process_point, set_point);
// 初始化PID参数值
pid_tune(&warm, p_gain,i_gain,d_gain,dead_band);
// 初始化PID输出值
pid_setinteg(&warm,0.0);
//pid_setinteg(&warm,30.0);
//Get input value for process point
pid_bumpless(&warm);
// how to display output
display_value = pid_calc(&warm);
printf("%f\n", display_value);
//printf("\n%f%f%f%f",warm.pv,warm.sp,warm.igain,warm.dgain);
count++;
}
}
增量式PID算法
#include
#include
struct _pid
{ double set;
double actual;
double err;
double err_one;
double err_two;
double Kp,Ki,Kd;
}pid;
void PID_init()
{ pid.set=0.0;
pid.actual=0.0;
pid.err=0.0;
pid.err_one=0.0;
pid.err_two=0.0;
pid.Kp=0.2;
pid.Ki=0.02;
pid.Kd=0.2;
}
double PID_real(double speed)
{ double increment;
pid.set=speed;
pid.err=pid.set-pid.actual;
increment=pid.Kp*(pid.err-pid.err_one)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_one+pid.err_two); pid.actual+=increment;
pid.err_two=pid.err_one;
pid.err_one=pid.err;
return pid.actual;
}
main()
{ int i;
PID_init();
for(i=0;i<1200;i++)
{ double speed=PID_real(100.0);
printf("%f\n",speed);
}system("pause");
}
c语言写pid算法,用c语言实现的pid算法相关推荐
- 自研!东鸽用 Go 语言写了一个能够自动解析新闻网页的算法
这是「进击的Coder」的第 593 篇技术分享 作者:韦世东 来源:NightTeam " 阅读本文大概需要 8 分钟. " 输入网页文本(不需要输入 xpath),自动结构化输 ...
- 易语言写c盘配置文件,易语言写配置文件的方法
易语言编程开发环境的诞生引领了一个编程新时代的到来.它以其本土化.易用化.开发速度快等优点迅速被广大编程爱好者所认可和接受."配置文件"这个术语相信大家都很熟悉了,因为日常生活中随 ...
- 电脑怎么用c语言写丘比特,如何用C语言先输出一段文字如何再输出心形图案?...
学习C语言其实并不是枯燥无味的,也有蛮多好玩的 代码如下: #include int main() { int i,j; printf(" ****** ******\n ...
- 圆弧插补程序c语言,用C语言写的简易的逐点比较法插补算法,包括直线逐点插补和圆弧插补...
源文件:https://pan.baidu.com/s/17FQKqn3UaEPQHkmTcOXKOg 提取码:atb2 #include #include #include #include //运 ...
- linux下c语言写文件,Linux下C语言之文件操作
C语言库函数的文件操作实际上是独立于具体的操作系统平台的,不管是在DOS.Windows.Linux还是在VxWorks中都是这些函数: 创建和打开的函数: FILE *fopen(const cha ...
- dll文件是什么语言写的程序_易语言图文教学:写好了程序,如何配置程序名称、图标?内详...
引导语 通过前两篇图文,相信大家能制作出一个简单的易语言程序啦.今天是教大家怎样配置程序.说的再清楚些,就是给你的程序加个图标,改个进程名字,加上版本号,添加作者信息等等. 具体操作方法 打开一个已经 ...
- python是c语言写的_python使用C语言写扩展示例
对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! 本文介绍如何用 C 语言来扩展 python.所举的例子是,为 python 添加一个设置字符串到 ...
- 易语言写c盘配置文件,易语言 读写配置项(ini配置文件)源码
简介 易语言 读写配置项(ini配置文件)源码 源码 .版本 2 .支持库 iext .程序集 窗口程序集_启动窗口 .子程序 _按钮1_被单击 .局部变量 账号, 文本型 .局部变量 密码, 文本型 ...
- Linux语言写的高通滤波,高通滤波器c语言实现
描述 高通滤波器,又称低截止滤波器.低阻滤波器,允许高于某一截频的频率通过,而大大衰减较低频率的一种滤波器.它去掉了信号中不必要的低频成分或者说去掉了低频干扰. 高通滤波器是一种让某一频率以上的信号分 ...
- c语言写报告抽象数据类型,C语言抽象数据类型ADT
根据编程的问题匹配合适的数据类型.数据项连接构成了链表,定义了一个结构代表单独的项.设计了一些方法把一系列结构构成一个链表.本质上,我们使用C语言的功能设计了一种符合程序要求的新的数据类型.但是上述的 ...
最新文章
- Kubernetes(基础 一):进程
- python适合做后端开发吗-想从事Python 后端开发?
- PanDownload复活了!速度60MB/s!
- Mongodb基本使用方法
- python collections,函数等笔记
- java.lang.InstantiationException:
- word里面用mathtype编辑公式转成PDF后出现乱码
- http://jingyan.baidu.com/article/fcb5aff78e6a48edab4a7146.html
- C# datagridview 实现按指定某列或多列进行排序
- 【软件介绍】GWAS meta分析软件:METAL
- SQL查询分析器的使用说明
- 农夫安全-安全网站导航 farmsec
- ShadowMap教程
- VSCode操作小技巧
- 现有的画笔和创建自己的画笔6zhongGDI
- Unity+Mirror实现虚拟现实下的多人连接
- linux scp命令找不到,bashscp:未找到命令的解决方法-linux运维
- 用java玩的游戏平台_分享4个边玩边学Python的编程游戏网站
- java的单例模式、恶汉、懒汉
- 【软工项目组】团队介绍与第一次会议
热门文章
- java抽象类为什么不能实例化?
- 【MSYS2】Windows 无MSVC 安装 MinGW Clang
- Java集合面试题(总结最全面的面试题!!!)
- php获取微信uninoid_微信小程序获取用户unionId
- C# 发送带cookie的http请求_C#发送请求带cookie
- c语言isnumber函数的使用方法,使用ISNUMBER函数进行判断处理 使用ISNUMBER函数判断...
- 解决:You have 18 unapplied migration(s). Your project may not work properly until you apply
- PHP socket类
- Mybatis驼峰命名
- Qt6串口多功能助手64位版本上位机源码