久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3752|回復(fù): 4
收起左側(cè)

PID算法實現(xiàn)(c 語言)

[復(fù)制鏈接]
ID:198331 發(fā)表于 2017-5-9 16:46 | 顯示全部樓層 |閱讀模式
  1.     #include <stdio.h>
  2.     #include<math.h>
  3.     //定義PID 的結(jié)構(gòu)體
  4.     struct _pid
  5.     {
  6.         int pv; //integer that contains the process value 過程量
  7.         int sp; //*integer that contains the set point   設(shè)定值
  8.         float integral; // 積分值 -- 偏差累計值
  9.         float pgain;
  10.         float igain;
  11.         float dgain;
  12.         int deadband;    //死區(qū)
  13.         int last_error;
  14.     };
  15.     struct _pid warm,*pid;
  16.     int process_point, set_point,dead_band; float p_gain, i_gain, d_gain,integral_val,new_integ;;
  17.     /*----------------------------------------------
  18.     pid_init DESCRIPTION This function initializes the
  19.     pointers  in  the  _pid  structure  to  the  process  variable
  20.     and the setpoint. *pv and *sp are integer pointers.
  21.     ---------------------------------------------- */
  22.     void pid_init(struct _pid *warm, int process_point, int set_point)
  23.     {
  24.         struct _pid *pid;
  25.         pid = warm;
  26.         pid->pv = process_point;
  27.         pid->sp = set_point;
  28.     }
  29.     /*----------------------------------------------
  30.     pid_tune DESCRIPTION Sets the proportional gain
  31.     (p_gain), integral gain (i_gain),
  32.     derivitive  gain  (d_gain),  and  the  dead  band  (dead_band)
  33.     of a pid control structure _pid.
  34.     設(shè)定PID參數(shù) ---- P,I,D,死區(qū)
  35.     ---------------------------------------------- */
  36.     void pid_tune(struct _pid *pid, float p_gain, float i_gain, float d_gain, int dead_band)
  37.     {
  38.         pid->pgain = p_gain;
  39.         pid->igain = i_gain;
  40.         pid->dgain = d_gain;
  41.         pid->deadband = dead_band;
  42.         pid->integral= integral_val;
  43.         pid->last_error=0;
  44.     }
  45.     /*----------------------------------------------
  46.     pid_setinteg DESCRIPTION Set a new value for the
  47.     integral term of the pid equation.
  48.     This is useful for setting the initial output of the
  49.     pid controller at start up.
  50.     設(shè)定輸出初始值
  51.     ---------------------------------------------- */
  52.     void pid_setinteg(struct _pid *pid,float new_integ)
  53.     {
  54.         pid->integral = new_integ;
  55.         pid->last_error = 0;
  56.     }
  57.     /*----------------------------------------------
  58.     pid_bumpless DESCRIPTION Bumpless transfer
  59.     algorithim.
  60.     When suddenly changing setpoints, or when restarting
  61.     the PID equation after an extended pause,
  62.     the derivative of the equation can cause a bump in the controller output. This function will help smooth out
  63.     that bump.
  64.     The process value in *pv should be the updated just
  65.     before this function is used.
  66.     pid_bumpless 實現(xiàn)無擾切換
  67.     當(dāng)突然改變設(shè)定值時,或重新啟動后,將引起擾動輸出。這
  68.     個函數(shù)將能實現(xiàn)平順擾動, 在調(diào)用該函數(shù)之前需要先更新 PV值
  69.     ----------------------------------------------*/
  70.     void pid_bumpless(struct _pid *pid)
  71.     {
  72.         pid->last_error = (pid->sp)-(pid->pv);  //設(shè)定值與反饋值偏差
  73.     }
  74.     /*----------------------------------------------
  75.     pid_calc  DESCRIPTION  Performs  PID  calculations  for  the
  76.     _pid structure *a. This function uses the positional form of the pid
  77.     equation, and incorporates an integral windup
  78.     prevention algorithim.
  79.     Rectangular  integration  is  used,  so  this  function  must
  80.     be repeated on a consistent time basis for accurate
  81.     control.
  82.     RETURN VALUE The new output value for the pid loop.
  83.     USAGE #include "control.h"
  84.     本函數(shù)使用位置式PID計算方式,并且采取了積分飽和限制運算
  85.     PID計算
  86.     ----------------------------------------------*/
  87.     float pid_calc(struct _pid *pid)
  88.     {
  89.     int err;
  90.     float pterm, dterm, result, ferror;
  91.     // 計算偏差
  92.     err = (pid->sp) - (pid->pv);
  93.     // 判斷是否大于死區(qū)
  94.         if (abs(err) > pid->deadband)
  95.         {
  96.             ferror = (float) err;   //do integer to float conversion only once 數(shù)據(jù)類型轉(zhuǎn)換
  97.             // 比例項
  98.             pterm = pid->pgain * ferror;
  99.             if (pterm > 100 || pterm < -100)
  100.             {
  101.                 pid->integral = 0.0;
  102.             }
  103.             else
  104.             {
  105.                 // 積分項
  106.                 pid->integral += pid->igain * ferror;
  107.                 // 輸出為0--100%
  108.                 // 如果計算結(jié)果大于100,則等于100
  109.                 if (pid->integral > 100.0)
  110.                 {
  111.                     pid->integral = 100.0;
  112.                 }
  113.                 // 如果計算結(jié)果小于0.0,則等于0
  114.                 else if (pid->integral < 0.0)
  115.                 {
  116.                     pid->integral = 0.0;
  117.                 }
  118.             }
  119.             // 微分項
  120.             dterm  =  ((float)(err  -  pid->last_error))  *  pid->dgain;
  121.             result = pterm + pid->integral + dterm;
  122.         }
  123.         else
  124.         {
  125.             result = pid->integral; // 在死區(qū)范圍內(nèi),保持現(xiàn)有輸出
  126.         }
  127.         // 保存上次偏差
  128.         pid->last_error = err;
  129.         // 輸出PID值(0-100)
  130.         return (result);
  131.     }
  132.     //----------------------------------------------
  133.     void main(void)
  134.     {
  135.         float display_value;
  136.         int count=0;
  137.         pid = &warm;
  138.         // printf("Enter the values of Process point, Set point, P gain, I gain, D gain \n");
  139.         // scanf("%d%d%f%f%f", &process_point, &set_point,&p_gain, &i_gain, &d_gain);
  140.         // 初始化參數(shù)
  141.         process_point = 30;
  142.         set_point = 40;
  143.         p_gain = (float)(5.2);
  144.         i_gain = (float)(0.77);
  145.         d_gain = (float)(0.18);
  146.         dead_band = 2;
  147.         integral_val =(float)(0.01);
  148.         printf("The  values  of  Process  point,  Set  point,  P  gain, I gain, D gain \n");
  149.         printf(" %6d %6d %4f %4f %4f\n", process_point,
  150.         set_point, p_gain, i_gain, d_gain);
  151.         printf("Enter the values of Process point\n");
  152.         while(count<=20)
  153.         {
  154.             scanf("%d",&process_point);
  155.             // 設(shè)定PV,SP 值
  156.             pid_init(&warm, process_point, set_point);
  157.             // 初始化PID 參數(shù)值
  158.             pid_tune(&warm, p_gain,i_gain,d_gain,dead_band);
  159.             // 初始化PID 輸出值
  160.             pid_setinteg(&warm,0.0);
  161.             //pid_setinteg(&warm,30.0);
  162.              //Get input value for process point
  163.             pid_bumpless(&warm);
  164.             // how to display output
  165.             display_value = pid_calc(&warm);
  166.             printf("%f\n", display_value);
  167.             //printf("\n%f%f%f%f",warm.pv,warm.sp,warm.igain,wa
  168.             rm.dgain);
  169.             count++;
  170.         }
  171.     }
復(fù)制代碼


回復(fù)

使用道具 舉報

ID:200117 發(fā)表于 2017-5-13 10:34 | 顯示全部樓層
一定用的到!謝謝
回復(fù)

使用道具 舉報

ID:200607 發(fā)表于 2017-5-14 15:00 | 顯示全部樓層
收下了,感謝
回復(fù)

使用道具 舉報

ID:221442 發(fā)表于 2017-11-17 15:32 | 顯示全部樓層
好厲害
回復(fù)

使用道具 舉報

ID:43600 發(fā)表于 2017-12-11 00:26 | 顯示全部樓層
收下了,研究中,謝分享。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美福利在线 | 精品国产乱码一区二区三 | 伊人久麻豆社区 | 亚洲啊v| 天天碰夜夜操 | 亚洲激情一区二区 | 99视频在线 | 国产乱码高清区二区三区在线 | 日本一二三区在线观看 | www成年人视频| 精品久久久久久 | 一级免费毛片 | 久久亚洲一区二区三区四区 | 欧美黄色一区 | 欧美日韩在线观看视频网站 | 国产特黄一级 | 久久久精 | 亚洲资源在线 | 97久久久久久 | 国产精品视频久久久久久 | 亚洲a视频| 在线欧美亚洲 | 97精品国产97久久久久久免费 | 干干干操操操 | www4虎| 精品久久网 | 国产精品完整版 | 99小视频 | 99久久精品视频免费 | 人人鲁人人莫人人爱精品 | 欧美电影免费观看高清 | 国产视频精品视频 | 国产成人精品亚洲日本在线观看 | 日本成年免费网站 | 男女午夜激情视频 | 中文字幕 在线观看 | 福利视频亚洲 | 日韩电影a | 欧美一区二不卡视频 | 精品日本中文字幕 | 成人欧美一区二区三区黑人孕妇 |