Buon giorno a tutti, sto' utilizzando un dspic30f6010a ed ho "scoperto" la libreria DSP che tra le altre cose contiene la funzione PID. Senza dilungarmi troppo vedo che il calcolo dell'OUTPUT viene cosi' implementato:
controlOutput[n] = controlOutput[n-1]
+ controlHistory[n] * abcCoefficient[0]
+ controlHistory[n-1] * abcCoefficient[1]
+ controlHistory[n-2] * abcCoefficient[2]
where,
abcCoefficient[0] = Kp + Ki + Kd
abcCoefficient[1] = -(Kp + 2*Kd)
abcCoefficient[2] = Kd
ControlHistory[n] =
MeasuredOutput[n] - ReferenceInput[n]
dove il calcolo di abcCoefficient se lo fa' lui richiamando una delle tre funzioni PID mentre a me tocca inserire Kp Ki e Kd (dichiarate come fractional) percui mi chiedo ma il Td è sottointeso nel valore da me inserito in Ki e Kd visto che nel calcolo di abcCoefficient non c'è traccia?
Inoltre aprendo un esempio microchip dove si fa uso delle tre funzioni PID noto che Kp Ki Kd sono forniti nel seguente modo:
kCoeffs[0] = Q15(0.7);
kCoeffs[1] = Q15(0.2);
kCoeffs[2] = Q15(0.07);
il vettore che contiene i kCoeffs è dichiarato fractional.
Aprendo l'Header file dsp.h mi accorgo che chiamando Q15(x) lui fa' questo calcolo:
#define Q15(X) \
((X < 0.0) ? (int)(32768*(X) - 0.5) : (int)(32767*(X) + 0.5))
che non ho assolutamente compreso, perchè se la interpreto come una divisione allora qualsiasi valore ci metta ad X il risultato mi viene sempre uguale ad 1 per via del casting int fatto al dividendo e divisore comunque facendo un debug vedo che ad esempio Q15(0.7) viene trasformato in un numero pari a 0.7x2^15 cioè nel formato Q15 PERO' visto che sicuramente il mio Kp sarà maggiore di 1 come lo si riporta in formato Q15? (Non credo si faccia ad esempio se Kp=30 allora 30x2^15)
Un saluto