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算法相关推荐

  1. 自研!东鸽用 Go 语言写了一个能够自动解析新闻网页的算法

    这是「进击的Coder」的第 593 篇技术分享 作者:韦世东 来源:NightTeam " 阅读本文大概需要 8 分钟. " 输入网页文本(不需要输入 xpath),自动结构化输 ...

  2. 易语言写c盘配置文件,易语言写配置文件的方法

    易语言编程开发环境的诞生引领了一个编程新时代的到来.它以其本土化.易用化.开发速度快等优点迅速被广大编程爱好者所认可和接受."配置文件"这个术语相信大家都很熟悉了,因为日常生活中随 ...

  3. 电脑怎么用c语言写丘比特,如何用C语言先输出一段文字如何再输出心形图案?...

    学习C语言其实并不是枯燥无味的,也有蛮多好玩的 代码如下: #include int main() { int i,j; printf("     ******       ******\n ...

  4. 圆弧插补程序c语言,用C语言写的简易的逐点比较法插补算法,包括直线逐点插补和圆弧插补...

    源文件:https://pan.baidu.com/s/17FQKqn3UaEPQHkmTcOXKOg 提取码:atb2 #include #include #include #include //运 ...

  5. linux下c语言写文件,Linux下C语言之文件操作

    C语言库函数的文件操作实际上是独立于具体的操作系统平台的,不管是在DOS.Windows.Linux还是在VxWorks中都是这些函数: 创建和打开的函数: FILE *fopen(const cha ...

  6. dll文件是什么语言写的程序_易语言图文教学:写好了程序,如何配置程序名称、图标?内详...

    引导语 通过前两篇图文,相信大家能制作出一个简单的易语言程序啦.今天是教大家怎样配置程序.说的再清楚些,就是给你的程序加个图标,改个进程名字,加上版本号,添加作者信息等等. 具体操作方法 打开一个已经 ...

  7. python是c语言写的_python使用C语言写扩展示例

    对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! 本文介绍如何用 C 语言来扩展 python.所举的例子是,为 python 添加一个设置字符串到 ...

  8. 易语言写c盘配置文件,易语言 读写配置项(ini配置文件)源码

    简介 易语言 读写配置项(ini配置文件)源码 源码 .版本 2 .支持库 iext .程序集 窗口程序集_启动窗口 .子程序 _按钮1_被单击 .局部变量 账号, 文本型 .局部变量 密码, 文本型 ...

  9. Linux语言写的高通滤波,高通滤波器c语言实现

    描述 高通滤波器,又称低截止滤波器.低阻滤波器,允许高于某一截频的频率通过,而大大衰减较低频率的一种滤波器.它去掉了信号中不必要的低频成分或者说去掉了低频干扰. 高通滤波器是一种让某一频率以上的信号分 ...

  10. c语言写报告抽象数据类型,C语言抽象数据类型ADT

    根据编程的问题匹配合适的数据类型.数据项连接构成了链表,定义了一个结构代表单独的项.设计了一些方法把一系列结构构成一个链表.本质上,我们使用C语言的功能设计了一种符合程序要求的新的数据类型.但是上述的 ...

最新文章

  1. Kubernetes(基础 一):进程
  2. python适合做后端开发吗-想从事Python 后端开发?
  3. PanDownload复活了!速度60MB/s!
  4. Mongodb基本使用方法
  5. python collections,函数等笔记
  6. java.lang.InstantiationException:
  7. word里面用mathtype编辑公式转成PDF后出现乱码
  8. http://jingyan.baidu.com/article/fcb5aff78e6a48edab4a7146.html
  9. C# datagridview 实现按指定某列或多列进行排序
  10. 【软件介绍】GWAS meta分析软件:METAL
  11. SQL查询分析器的使用说明
  12. 农夫安全-安全网站导航 farmsec
  13. ShadowMap教程
  14. VSCode操作小技巧
  15. 现有的画笔和创建自己的画笔6zhongGDI
  16. Unity+Mirror实现虚拟现实下的多人连接
  17. linux scp命令找不到,bashscp:未找到命令的解决方法-linux运维
  18. 用java玩的游戏平台_分享4个边玩边学Python的编程游戏网站
  19. java的单例模式、恶汉、懒汉
  20. 【软工项目组】团队介绍与第一次会议

热门文章

  1. java抽象类为什么不能实例化?
  2. 【MSYS2】Windows 无MSVC 安装 MinGW Clang
  3. Java集合面试题(总结最全面的面试题!!!)
  4. php获取微信uninoid_微信小程序获取用户unionId
  5. C# 发送带cookie的http请求_C#发送请求带cookie
  6. c语言isnumber函数的使用方法,使用ISNUMBER函数进行判断处理 使用ISNUMBER函数判断...
  7. 解决:You have 18 unapplied migration(s). Your project may not work properly until you apply
  8. PHP socket类
  9. Mybatis驼峰命名
  10. Qt6串口多功能助手64位版本上位机源码