Nous avons abordé dans la V1 le concept et comment implémenter une commande incrémentale avec Arduino. Le point fort d’une commande incrémentale est sa convergence assurée vers la consigne Quelle que soit la charge avec une erreur statique nulle. C’est une commande générique contrairement aux stratégies d’asservissement traditionnelles par correcteurs (P, PI, PID, etc.). En revanche, le temps de réponse est un peu long. La version actuelle permet d’améliorer la stabilité de la commande (réduction des ondulations autour de la consigne) et réduire le temps de réponse. Les améliorations, on était apportés en particulier au filtre moyenneur. L’idée consiste à garder en mémoire les valeurs moyennes calculées (les moyennes précédentes). La valeur filtrée actuelle sera donc la somme des valeurs moyennes précédentes et la valeur actuelle du port A0. Le reste du programme reste le même comme celui de la V1.
// Calcul de la moyenne actuelle for (int i=0; i<N; i++) { vin_volat=(float)analogRead(A0)*5.0/1023.0; somme+=vin_volat; } v_fil=(somme/(float)N); somme=0.0;
// Initialisation du tableau des VM for (int i=0; i<NMoy; i++) valMoy[i]= v_fil;
// Affichage Serial.begin(115200); }
void loop() {
// 1. Lecture de l'entrée A0 vin_volat=(float)analogRead(A0)*5.0/1023.0;
// 2. Filtrage: Calcul de la Moyenne Glissante for (int i=0; i<NMoy; i++) somme+=valMoy[i]; v_fil=(somme/(float)NMoy); somme=0.0;
// 3. Mise à jour du tableau des VM valMoy[I]=(v_fil+vin_volat)/2.0; I++; I%=NMoy;
/*4. Mise à jour de la commande */ // 4.1: Consigne Atteinte if (((v_fil>=Consigne -1.5*Epsilon) && (v_fil<=Consigne +1.5*Epsilon))) { return; // Ne rien faire! }
// 4.2: Incrémentation if ((v_fil<Consigne)) { OutPWM+=StepCyc; if (OutPWM>=255.0) OutPWM-=StepCyc; }
// 4.3: Décrémentation if ( (v_fil>Consigne)) { OutPWM-=StepCyc; if (OutPWM<=0.0) OutPWM+=StepCyc; }
//5. Génération de la commande PWM analogWrite(Out, (unsigned int)OutPWM); v_fil_old= v_fil;