Catégories
Algorithme Asservissement Asservissement Arduino automatique Projets électroniques

Projet Arduino: La Commande Incrémentale – Version 1 [TUTO]

Objectifs

  1. Savoir implémenter une boucle de régulation
  2. Savoir le principe de la Commande Incrémentale
  3. Savoir implémenter une moyenne glissante
  4. Savoir asservir un signal PWM

Applications

  1.  Asservissement de la vitesse
  2. Systèmes de régulation automatique
  3. Convertisseurs AC/DC, DC/AC, DC/DC, etc. Asservis
  4. Asservissement de la température, humidité, etc.
  5. Et , d’autres applications!

Principe de fonctionnement

Commande Incrémentale avec Arduino

Le mini projet consiste à mettre en pratique le principe de fonctionnement d’une commande incrémentale avec Arduino. On utilise dans l’exemple un bouclage unitaire d’un signal PWM. L’objectif du programme est de maintenir la tension DC à la borne de la charge constante en faisant varier le rapport cyclique du signal PWM. La consigne est définit par le programme. Le concept d’incrémentation consiste à faire incrémenter (ou décrémenter) le rapport cyclique jusqu’à l’obtention de la consigne. Le programme extrait la valeur moyenne du signal PWM avant de décider si on incrémente ou décrémenter la commande. La qualité du filtrage ainsi le pas d’incrémentation sont définit dans le programme.

Voir le tuto pour plus de détails techniques.

Notes sur le programme

Les paramètres du programme

#define Out         9

#define In          A0

#define Consigne    4.0       // Tension de la consigne

#define N           100       // Filtrage de l'entrée

#define Step        1E-3      // Erreur sur la consigne (Epsilon)

#define StepCyc     1E-1      // Pas d'incrémentation du Rapport Cyclique / Cycle

Initialisation

Le pin 9 est utilisé pour générer le signal PWM. Il est rebouclé dans le pin analogique A0. On initialise aussi le tableau avec le contenu de l’entrée A0. Le port série sera utilisé afin d’observer en temps réel la valeur moyenne, le rapport cyclique ainsi le signal PWM.

void setup() 
{
// Pinout
pinMode(Out, OUTPUT);
analogWrite(Out, 180);

// Init Vin
for (int i=0; i<N; i++) vinTab[i]=analogRead(A0);

// Affichage
Serial.begin(115200);
}

La boucle principale

Lecture de l’entrée A0

Vin_A0=analogRead(A0);

vinTab[I]=Vin_A0;

Mise à jour de l’indice

I=I+1;

if (I==N) I=0;

Filtrage: Calcul de la Moyenne Glissante

  for (int i=0; i<N; i++)
{
vin_volat=(float)vinTab[i]*5.0/1023.0;
somme+=vin_volat;
}
v_fil=(somme/(float)N);
somme=0.0;

Mise à jour de la sortie

Consigne Atteinte

  if ((v_fil>=Consigne -1.5*Step) && (v_fil<=Consigne +1.5*Step))  
return; // Ne rien faire!

Incrémentation

  if ((v_fil<Consigne))  
{
OutPWM+=StepCyc;
if (OutPWM>=255.0) OutPWM-=StepCyc;
}

Décrémentation

  if ( (v_fil>Consigne))  
{
OutPWM-=StepCyc;
if (OutPWM<=0.0) OutPWM+=StepCyc;
}

Génération de la commande PWM

analogWrite(Out, (unsigned int)OutPWM);

Affichage

Serial.print((float)Vin_A0*5.0/1023.0);

Serial.print(",");

Serial.print(Consigne);

Serial.print(",");

Serial.print(v_fil);

Serial.print(",");

Serial.println((float)OutPWM*5.0/255.0);

Programme complet

#define Out         9       
#define In A0

#define Consigne 4.0 // Tension de la consigne
#define N 100 // Filtrage de l'entrée
#define Step 1E-3 // Epsilon
#define StepCyc 1E-1 // Pas d'incrémentation du Rapport Cyclique / Cycle



float v_fil=0.0;
float somme =0.0;
float vin_volat=0.0;
int vinTab[N];
int Vin_A0=0;
int I=0;
float OutPWM=180.0;


void setup()
{
// Pinout
pinMode(Out, OUTPUT);
analogWrite(Out, 180);

// Init Vin
for (int i=0; i<N; i++) vinTab[i]=analogRead(A0);

// Affichage
Serial.begin(115200);
}

void loop()
{

// 1. Lecture de l'entrée A0
Vin_A0=analogRead(A0);
vinTab[I]=Vin_A0;

// 2. Mise à jour de l'indice
I=I+1;
if (I==N) I=0;

// 3. Filtrage: Calcul de la Moyenne Glissante
for (int i=0; i<N; i++)
{
vin_volat=(float)vinTab[i]*5.0/1023.0;
somme+=vin_volat;
}
v_fil=(somme/(float)N);
somme=0.0;

/*4. Mise à jour de la sortie */
// 4.1: Consigne Atteinte
if ((v_fil>=Consigne -1.5*Step) && (v_fil<=Consigne +1.5*Step))
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);


// 6. Affichage
Serial.print((float)Vin_A0*5.0/1023.0);
Serial.print(",");
Serial.print(Consigne);
Serial.print(",");
Serial.print(v_fil);
Serial.print(",");
Serial.println((float)OutPWM*5.0/255.0);
}

On verra  prochainement la version améliorée du code. N’oublie pas de laisser un commentaire, ça nous encourage pour continuer  à partager des projets 🙂

2 réponses sur « Projet Arduino: La Commande Incrémentale – Version 1 [TUTO] »

Laisser un commentaire