Pidnn Arduino2
Pidnn Arduino2
h>
#include <SPI.h>
void setup() {
// *********************** - Timer 2 configuration - ***********************
SREG = (SREG & 0b01111111); // Disable interruptions **
TIMSK2 = TIMSK2|0b00000001; // Overflow interruption enable **
TCCR2B = 0b00000111; // Prescaler FT2 = 7812.5Hz **
SREG = (SREG & 0b01111111) | 0b10000000; // IS enabled // IS disabled **
//**************************************************************************
SPI.begin();
attachInterrupt(0, counterUp, FALLING);
Serial.begin(9600);
}
void loop() {
int speedRPM = speedCalculation(); // Reference acquistion
error[0] = setpoint - speedRPM; // Error calculation
u[0] = pidAntiWindUp(error[0], error[1], error[2], u[1], 0, 4000, T);
Serial.print(setpoint);
Serial.print(" ");
Serial.print(speedRPM);
Serial.print(" ");
Serial.println(u[0]);
counter[1] = counter[0]; // Shift register
error[1] = error[0]; // Shifting operation
error[2] = error[1]; // Shifting operation
u[1] = u[0]; // Shifting operation
delay(T);
}
int pidAntiWindUp(int e0, int e1, int e2, int u1, int lb, int ub, float T){
const float Kp = 2; // Proportional gain
const float Ti = .2; // Integral time
const float Td = 0; // Derivative time
const float Tt = Ti; // Anti windup gain
T = T/1000; // Conversion from ms to s
int v = sat(u1, lb, ub) - u1; // Saturation difference calculation
int u = u1 + Kp * (e0 - e1 + T/Ti * e0 + Td/T * (e0 - 2*e1 + e2)) + T/Ti * v;
return u;
}
void counterUp() {
counter[0] += 1; // Accumulator
}