«

»

Jul 11

Pustaka PID dalam Arduino

Mungkin kita cukup familiar dengan persamaan berikut:

Dari persamaan di atas, kita bisa membuat sebuah program terkait:

unsigned long lastTime;
double Input, Output, Setpoint;
double errSum, lastErr;
double kp, ki, kd;
void Compute()
{
   /*How long since we last calculated*/
   unsigned long now = millis();
   double timeChange = (double)(now - lastTime);

   /*Compute all the working error variables*/
   double error = Setpoint - Input;
   errSum += (error * timeChange);
   double dErr = (error - lastErr) / timeChange;

   /*Compute PID Output*/
   Output = kp * error + ki * errSum + kd * dErr;

   /*Remember some variables for next time*/
   lastErr = error;
   lastTime = now;
}

void SetTunings(double Kp, double Ki, double Kd)
{
   kp = Kp;
   ki = Ki;
   kd = Kd;
}

Dalam implementasinya, khususnya dalam pengendali yang akan digunakan dalam industri, terdapat sejumlah parameter yang harus dipertimbangkan, khususnya terkait dengan karakteristik dari plant.

Beberapa waktu lalu, sebuah pustaka program terkait dengan pengendalian secara PID – Proportional Integral Derivative, muncul di area Arduino Playground.

Seberapa cepat komputasi PID yang dilakukan fungsi-fungsi dalam pustaka ini? Berikut adalah benchmark yang dilakukan oleh  pengembang:

#include <PID_v1.h>
double Setpoint, Input, Output;

PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);

void setup()
{
  Input = analogRead(0);
  Setpoint = 100;
  myPID.SetMode(AUTOMATIC);
  Serial.begin(9600);
}

void loop()
{
  unsigned startTime = millis();
  for ( int i = 0; i < 10000; i++ )
  {
    Input = analogRead(0);
    myPID.Compute();
    analogWrite(3,Output);
  }
  Serial.println(millis() - startTime);
}

Berikut adalah hasil eksekusinya:

Rata-rata 2088 / 10000 = 0.21 milidetik.

Bagaimana dengan kecepatan eksekusi dari fungsi Compute()?

Pengujian dapat dilakukan dengan memberikan tanda remark pada baris yang berisi analogRead() dan analogWrite(). Hasilnya, rata-rata 0.08 milidetik.