Apprendre autrement.... Robot Opto-guidé
Chapitre 1. La problématique du robot opto-guidé
Chapitre 2. La mécanique
Chapitre 3. L'électronique
Chapitre 4. Les algorithmes de suivi de ligne et la programmation
4.1. Le suivi de ligne en tout-ou-rien
4.2. Le suivi de ligne en MLI simple
4.3. Le suivi de ligne en MLI double
4.4. Le suivi de ligne en quatre quadrants
Chapitre 5. Conclusion
Page d'accueilTable des matièresNiveau supérieurPage précédenteBas de la pagePage suivante

4.2. Le suivi de ligne en MLI simple

Une amélioration de l'algorithme "tout ou rien" consiste non pas à bloquer un moteur
mais à en faire varier sa vitesse en fonction de l'écart par rapport à la ligne.
Cette variation de vitesse peut être linéaire (a) ou non (b).

Toutes sortes de courbes peuvent être envisagées et se traduisent par un comportement différent du robot.

La variation de vitesse d'un moteur est obtenue en générant un signal à rapport cyclique variable
pour commander les transistors de puissance.
MLI : Modulation en Largeur d'Impulsion
(PWM : Pulse width Modulation)

Exemple de programme C  -  Commande en MLI simple

 

#pragma symbols code debug objectextend optimize(4)
#include <reg51.h>
#include <stdio.h>
// domliAA1.c
// Commande moteur MLI par transistors MOSFET

//Port P3
sbit MG=P3^0;
sbit MD=P3^1;
sbit FC=P3^2;
sbit LED=P3^3;

//variables
unsigned char mem1;
unsigned char mem2;
unsigned char mem3;
unsigned char mem4;
unsigned char ecart;
unsigned char capt;
unsigned int i;   
unsigned long j;

// Procédures d'interruptions
void MLID (void);        //timer0 pour le moteurD
void MLIG (void);        //timer1 pour le moteurG
void STOP (void);        // Int0

//Prog principal

void main (void)
{
    ET0=1;ET1=1;EX0=1;IT0=0;PX0=1;EA=1;
    TMOD=0x22;
    LED=1;
    mem2=0x70;   
    mem4=0x80;
    mem1=(255-mem2);
    mem3=(255-mem4);
    TH0=mem2;
    TH1=mem4;
    TR0=1;TR1=1;
    do
    {
        P1=0xFF;   
        capt = P1;
        switch (capt)    // codage de la position
        {
           case 0x7F : mem2 = 0xF0; mem4 = 0x00;LED=1;break;   
           case 0x3F : mem2 = 0xF0; mem4 = 0x10;LED=1;break;   
           case 0xBF : mem2 = 0xF0; mem4 = 0x20;LED=1;break;   
           case 0x9F : mem2 = 0xF0; mem4 = 0x40;LED=1;break;   
           case 0xDF : mem2 = 0xF0; mem4 = 0x80;LED=1;break;   
           case 0xCF : mem2 = 0xF0; mem4 = 0xA0;LED=1;break;   
           case 0xEF : mem2 = 0xF0; mem4 = 0xC0;LED=0;break;
           case 0xE7 : mem2 = 0xF0; mem4 = 0xF0;LED=0;break; //centre   
           case 0xF7 : mem2 = 0xC0; mem4 = 0xF0;LED=0;break;   
           case 0xF3 : mem2 = 0xA0; mem4 = 0xF0;LED=1;break;   
           case 0xFB : mem2 = 0x80; mem4 = 0xF0;LED=1;break;   
           case 0xF9 : mem2 = 0x40; mem4 = 0xF0;LED=1;break;
           case 0xFD : mem2 = 0x20; mem4 = 0xF0;LED=1;break;   
           case 0xFC : mem2 = 0x10; mem4 = 0xF0;LED=1;break;   
           case 0xFE : mem2 = 0x00; mem4 = 0xF0;LED=1;break;
        }
        mem1=(255-mem2);
        mem3=(255-mem4);   
    }
    while(1);
}

// *************************************************************************
void MLID (void) interrupt 1    //Mli moteur D
{
    MD=!MD;
    if (MD==0) TL0=mem4;   
    else TL0=mem3;
}
// **************************************************************************
void MLIG (void) interrupt 3    //Mli moteur G
{
    MG=!MG;
    if (MG==0) TL1=mem2;   
    else TL1=mem1;
}
// ****************************************************
void STOP (void) interrupt 0    //Arret
{
    MD=0;MG=0;LED=1;
    for (;;);
}

 
Page d'accueilTable des matièresNiveau supérieurPage précédenteHaut de la pagePage suivante