/************  PID算法(C语言)  ************/

  #include <stdio.h>
  #include<math.h>
  
  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.
  ------------------------------------------------------------------------*/
  
  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=;
  }
  
  /*------------------------------------------------------------------------
  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 = ;
  }
  
  /*------------------------------------------------------------------------
  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.
  ------------------------------------------------------------------------*/
  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"
  ------------------------------------------------------------------------*/
  
  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 > || pterm < -)
   {
   pid->integral = 0.0;
   }
   else
   {
   pid->integral += pid->igain * ferror;
   if (pid->integral > 100.0)
   {
   pid->integral = 100.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;
   return (result);
  }
  
  void main(void)
  {
   float display_value;
   int count=;
  
   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 = ;
   set_point = ;
   p_gain = (float)(5.2);
   i_gain = (float)(0.77);
   d_gain = (float)(0.18);
  
   dead_band = ;
   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<=)
   {
   scanf("%d",&process_point);
  
   pid_init(&warm, process_point, set_point);
   pid_tune(&warm, p_gain,i_gain,d_gain,dead_band);
   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算法(C语言)的更多相关文章

  1. 【转】位置式、增量式PID算法C语言实现

    位置式.增量式PID算法C语言实现 芯片:STM32F107VC 编译器:KEIL4 作者:SY 日期:2017-9-21 15:29:19 概述 PID 算法是一种工控领域常见的控制算法,用于闭环反 ...

  2. PID算法(c 语言)(转)

    PID算法(c 语言)(来自老外) #include <stdio.h> #include<math.h> //定义PID 的结构体 struct _pid { int pv; ...

  3. PID控制算法的C语言实现二 PID算法的离散化

    上一节中,我论述了PID算法的基本形式,并对其控制过程的实现有了一个简要的说明,通过上一节的总结,基本已经可以明白PID控制的过程.这一节中先继续上一节内容补充说明一下. 1.说明一下反馈控制的原理, ...

  4. PID控制算法的C语言实现一 PID算法原理

    本系列是转载............. 全部的程序有一个共同点:就是我没认真去调pid的参数 在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设 ...

  5. PID算法的C语言实现

    1.根据我控制算法类文章中关于PID的理论的一些描述,同时也根据网络上一些其他的PID文章,以及自己最近一个项目的实践后,总结了几套基于C语言的PID算法,由于网络中很少有人进行分享完整的PID算法实 ...

  6. PID控制器开发笔记之一:PID算法原理及基本实现

    在自动控制中,PID及其衍生出来的算法是应用最广的算法之一.各个做自动控制的厂家基本都有会实现这一经典算法.我们在做项目的过程中,也时常会遇到类似的需求,所以就想实现这一算法以适用于更多的应用场景. ...

  7. 单片机之PID算法

    说到PID算法,想必大部人并不陌生,PID算法在很多方面都有重要应用,比如电机的速度控制,恒温槽的温度控制,四轴飞行器的平衡控制等等,作为闭环控制系统中的一种重要算法,其优点和可实现性都成为人们的首选 ...

  8. PID控制算法的C语言实现十 专家PID与模糊PID的C语言实现

    本节是PID控制算法的C语言实现系列的最后一节,前面8节中,已经分别从PID的实现到深入的过程进行了一个简要的讲解,从前面的讲解中不难看出,PID的控制思想非常简单,其主要问题点和难点在于比例.积分. ...

  9. PID控制算法的C语言实现三 位置型PID的C语言实现

    上一节中已经抽象出了位置性PID和增量型PID的数学表达式,这一节,重点讲解C语言代码的实现过程,算法的C语言实现过程具有一般性,通过PID算法的C语言实现,可以以此类推,设计其它算法的C语言实现. ...

随机推荐

  1. Java网络编程详解

    内容: 1.网络通信协议 2.UDP与TCP 3.UDP通信 4.TCP通信 5.网络编程总结 1.网络通信协议 (1)基本概念 网络:由多台计算机以及外部设备连接起来的一个系统,我们称之为网络 通信 ...

  2. 暴搜 - Codeforces Round #327 (Div. 2) E. Three States

    E. Three States Problem's Link Mean: 在一个N*M的方格内,有五种字符:'1','2','3','.','#'. 现在要你在'.'的地方修路,使得至少存在一个块'1 ...

  3. Python自定义状态码枚举类

    在Java里很容易做到自定义有状态码和状态说明的枚举类例如: public enum MyStatus { NOT_FOUND(404, "Required resource is not ...

  4. spring 的 切片Aspect

    语法:  <aop:config> <!-- 配置多个切点,&& || ! --> <aop:pointcut id="pc" exp ...

  5. as3 文本竖排效果实现

    import flash.text.engine.TextBlock; import flash.text.engine.ElementFormat; import flash.text.engine ...

  6. cmd 查看本地端口被占用程序

    netstat -ano 列出当前活动的网络连接 参数:-a所有侦听端口  -n以数字格式显示地址和端口号 -o显示进程号 tasklist|find "8888" 找出占用888 ...

  7. 关于str.split(",")中间 什么时候该加\\转义

    java 分割符,对于某些符号的分割符进行切割的时候需要加转义字符,我贴上例子 1. package test1; public class split { public static void ma ...

  8. How to Pronounce SAY, SAYS, and SAID

    How to Pronounce SAY, SAYS, and SAID Share Tweet Share Tagged With: Comparison I’ve noticed many non ...

  9. [转]Gulp思维 —— Gulp高级技巧

    感受过gulp.js带来的兴奋过后,你需要的不仅仅是它的光鲜,而是切切实实的实例.这篇文章讨论了一些使用gulp.js时常踩的坑,以及一些更加高级和定制化的插件和流的使用技巧. 基本任务 gulp的基 ...

  10. Recursion递归

    /*java.lang 核心包 如 String Math Integer System Thread等 拿来直接用 * java.awt 窗口工具 GUI * java.net 网络包 * java ...