Bene qua si procede con discorsi pesanti raga!!!
Sto ancora praticando con il PID, che ne pensate di queste formule sono giuste?
[spoiler]byte sine256[] = { 0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16, 18,20,21,23,25,27,29,31,33,35,37,39,42,44,46,49,51,54,56,59, 62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118, 121,124,127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,
181,184,187,190,192,195,198,200,200,198,195,192,190,187,184,181,178,176,173,170, 167,164,161, 158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99, 96,93,90,87,84,81,78,76,73,70,67,64,62,59,56,54,51,49,46,44, 42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9, 7,6,5,5,4,3,2,2,1,1,1,0,0,0,0 };
#define pwmA 9 #define pwmB 10 int PWM_Out; int pwm; int valore=4;//valore feedback desiderato int err; //errore rilevato int t; //tempo di campionamento int Kp; // Guadagno proporzionale int Ki; // Guadagno Integrale int Kd; // Guadagno Derivata int P; //PROPORZIONALE int D; //derivata int I; //INTEGRALE
void setup() { // PWM sui pin 9 e 10 a 31,2KHz setPwmFrequency(pwmA, 1); setPwmFrequency(pwmB, 1);
}
void loop() { analogWrite(pwmA, PWM_Out); delayMicroseconds(100);//settare in base agli igbt usati analogWrite(pwmB, PWM_Out); delayMicroseconds(100);//settare in base agli igbt usati } // lettura partitore su A1 int val = analogRead(A1);//leggi da pin analogico 1 float feedback = val * (5.0 / 1023.0); //converti nella variabile feedback il valore letto su A1 err=valore-feedback; P=err * Kp; I=I+(err * t)*Ki; D=(err-err+(pwm)/t)*Kd; pwm= pgm_read_byte_near(sine256); PWM_Out= P+I+D;
}[/spoiler]
|