Contrôleur Moteur pas à pas écrit en C Pour caméra slider

Contenu du snippet

/***************************************************************/
/****** Contrôleur de moteur pas à pas pour Caméra Slider ******/
/**** Utilisation du microcontrôleur PIC16F877 De microchip ****/
/** Horloge cadencé à 4MHZ, Choix de l'horloge interne au PIC **/
/*********       Compilateur: Mikroc Pro for PIC      **********/



// Déclaration de 2 tableaux de valeurs à écrire dans la Rom du PIC
// Les séquences binaires permettront de faire avancer le moteur pas à pas
// dans un sens comme dans l'autre


#define       Total_Touch        kp == 49 || kp == 50 || kp == 51 || kp == 65 || kp == 52 || kp == 53 || kp == 54 || kp == 66 || kp == 55|| kp == 56 || kp == 57 || kp == 42 || kp == 48||  kp == 35||  kp == 68
#define       Reset_Zero         PORTB.F0
#define       Entrer             PORTB.F1






const unsigned short Sequence_Pas_Entier[10] = {0x01, 0x04, 0x02, 0x08};         // Séquence direction droite  pas entier

const unsigned short Sequence_Demi_Pas[10] =   {0x01, 0x05, 0x04, 0x06,          // Séquence direction droite  demi pas
                                                0x02, 0x0A, 0x08, 0x09
                                               };



// Déclaration des variables globales

unsigned char kp;
unsigned char Cnt_pas = 10;
unsigned char Cnt_Vitesse = 10;
unsigned char Pas[4];
unsigned char Vitesse[4];
unsigned int i =  0;
unsigned int j= 0;
long position_x;
int  Convert_Pas;
int  Convert_Vitesse;
unsigned int count_pas = 0;
unsigned char flag = 0;
unsigned int k;

char  keypadPort at PORTD;



// Attribution des pattes correspondants aux microcontrôleurs et connectées à l'afficheur LCD

sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;



unsigned int txt[10];                               // Stocke les données dans un tableau de buffer de taille 10
unsigned int txt00[10];
unsigned char txt0[] = "Stepper Motor";

char txt11[] ="C";
char txt22[] ="r";
char txt33[] ="e";
char txt44[] ="a";
char txt55[] ="t";
char txt66[] ="e";
char txt88[] ="d";
char txt77[] =" ";
char txt99[] = "b";
char txt10[] ="y";
char txt14[] = " ";
char txt17[] =" ";
char txt12[] =".";
char txt13[] =" ";

unsigned char txt2[] = "Nbre pas:";
unsigned char txt3[] = "Vitesse :";
unsigned char txt4[] = "Position x:";
unsigned char txt5[] = "Pas Voulu:";
unsigned char txt6[] = "Pas Reel :";



// Prototype des fonctions utilisées

void Init_PIC(void);
void Init_LCD(void);
void Move_Moteur_Droite( unsigned int nbre_pas, unsigned int temps);
void Move_Moteur_Gauche(void);
void Affiche_Intro_LCD(void);
void Clavier_LCD(void);
void retour_zero(void);
void Delai(unsigned int);
void Conversion_Tab_Entier(void);
void Move_Delay(void);
void Move_Ecriture(void);
void Arret_Urgence(void);
void Effacer(void);


void main()
{

    Init_PIC();                          // Initialisation du PIC
    Lcd_Init();                          // Initialisation du LCD
    Keypad_Init();                       // Initialisation du Keypad
    Lcd_Cmd(_LCD_CLEAR);                 // Nettoyer l'afficheur
    Lcd_Cmd(_LCD_CURSOR_OFF);

    Lcd_Out(1, 3, txt0);
    delay_ms(500);

    Move_Ecriture();

    delay_ms(1000);
    Lcd_Cmd(_LCD_CLEAR);

    Lcd_Out(1, 1, txt2);
    Lcd_Out(2, 1, txt3);


    while(1)
    {

        Clavier_LCD();
        Arret_Urgence();

    }

}


// Fonction contenant les registres du PIC et leurs initialisations

void Init_PIC(void)
{

    TRISB = 1;
    PORTB = 0;
    TRISE = 1;
    TRISC = 0;                  // Configuration du PortC en sortie
    PORTC = 0;                  // Mise à zéro de toutes les pattes du PortC

    INTCON.INTE = 1;            // Autorisation des interruptions du au changement de patte RB0
    INTCON.RBIE = 1;            // Autorisation des interruptions du au changement des pattes RB4/RB7
    INTCON.GIE = 1;             // Autorisation globale des interruptions
    INTCON.INTEDG = 1;          // Interruption active sur front Montant (Signal logique passant de 0 à 1)

    Sound_Init(&PORTC, 4);
    
}


// Fais tourner le moteur de gauche à droite en mode demi_pas

void Move_Moteur_Droite(unsigned int Nbre_Pas, unsigned int temps)
{

    unsigned char i;
    unsigned char j;

    for(j = 0; j < Nbre_Pas/8; j++)                                 // Nbre_pas est un paramètre entré par l'utilisateur non connu à l'avance
    {

        for(i = 0; i < 8; i++)                                      // On tourne dans le tableau afin d'exécuter la bonne séquence qui correspond au demi pas
        {

            PORTC = Sequence_Demi_Pas[i];                           // On copie les valeurs sur le PORTC
            Delai(temps);
            count_pas++;                                     // On attends un certain délai, paramètre rentré par l'utilisateu
            intToStr(Count_pas, txt00);
            Lcd_Out(2, 11, txt00);

        }


        if(count_pas >= Convert_Pas)
        {
            count_pas = 0;
            break;
        }

    }

}


// Fonction permettant de gérer le clavier numérique

void Clavier_LCD()
{

    kp = 0;                                   // Reset key code variable

    do

        kp = Keypad_Key_Click();             // Store key code in kp variable

    while (!kp);

    switch (kp)
    {

    case  1:                                 // Si kp == 1  kp vaudra 49 ce qui correspond en ASCII au chiffre 1
        kp = 49;
        break; // 1

    case  2:
        kp = 50;
        break; // 2

    case  3:
        kp = 51;
        break; // 3

    case  4:
        kp = 65;
        break; // A

    case  5:
        kp = 52;
        break; // 4

    case  6:
        kp = 53;
        break; // 5

    case  7:
        kp = 54;
        break; // 6

    case  8:
        kp = 66;
        break; // B

    case  9:
        kp = 55;
        break; // 7

    case 10:
        kp = 56;
        break; // 8

    case 11:
        kp = 57;
        break; // 9

    case 12:
        kp = 67;
        break; // C

    case 13:
        kp = 42;
        break; // *

    case 14:
        kp = 48;
        break; // 0

    case 15:
        kp = 35;
        break; // #

    case 16:
        kp = 68;
        break; // D

    }

    if ( Total_Touch )                                 // A chaque appui sur une touche
    {

        Sound_Play(980, 100);
        Cnt_Pas++;                                    // On incrémente de 1 ligne pour décaler l'écriture du chiffre vers la droite du LCD
        Pas[i] = kp;                                    // On enregistre les chiffres rentrés par l'utilisateur
        Lcd_Chr(1, Cnt_Pas, Pas[i]);                  // On l'affiche sur le LCD
        i++;                                          // On incrémente i
        //if(i==6)    i = 0;


        if (cnt_pas >=14 )                            // Si Cnt_pas dépasse ou égale 15, on passe à la ligne suivante
        {
            if   ( Total_Touch )                      // Idem que précédemment
            {

                Cnt_Vitesse++;
                Vitesse[j]=kp;
                Lcd_Chr(1, Cnt_Pas, ' ');
                Lcd_Chr(2, Cnt_Vitesse, Vitesse[j]);
                j++;
                if(j==3)     j=0;

                if(Cnt_Vitesse >= 13)
                {

                    Lcd_Cmd(_LCD_CLEAR);
                    Lcd_Cmd(_LCD_CURSOR_OFF);
                    Lcd_Out(1, 1, txt5);
                    Lcd_Out(2, 1, txt6);

                    Conversion_Tab_Entier();
                    intToStr(Convert_pas, txt00);
                    Lcd_Out(1, 11, txt00);
                    delay_ms(500);
                    Move_Moteur_Droite(Convert_Pas, Convert_Vitesse) ;
                    Cnt_Vitesse = 10;
                    delay_ms(2000);
                    retour_zero();

                    Lcd_Cmd(_LCD_CLEAR);
                    Lcd_Out(1, 1, txt2);
                    Lcd_Out(2, 1, txt3);
                }
            }
        }
    }
    
}


void retour_zero()
{

    unsigned char i;

    for(k = convert_pas/8; k >= 0 ; k--)
    {


        PORTC = 0x09;
        delay_ms(150);
        count_pas--;
        intToStr(Count_pas, txt00);
        Lcd_Out(2, 11, txt00);
        
        PORTC = 0x08;
        delay_ms(150);
        count_pas--;
        intToStr(Count_pas, txt00);
        Lcd_Out(2, 11, txt00);
        
        PORTC = 0x0A;
        delay_ms(150);
        count_pas--;
        intToStr(Count_pas, txt00);
        Lcd_Out(2, 11, txt00);
        
        PORTC = 0x02;
        delay_ms(150);
        count_pas--;
        intToStr(Count_pas, txt00);
        Lcd_Out(2, 11, txt00);
        
        PORTC = 0x06;
        delay_ms(150);
        count_pas--;
        intToStr(Count_pas, txt00);
        Lcd_Out(2, 11, txt00);
        
        PORTC = 0x04;
        delay_ms(150);
        count_pas--;
        intToStr(Count_pas, txt00);
        Lcd_Out(2, 11, txt00);
        
        PORTC = 0x05;
        delay_ms(150);
        count_pas--;
        intToStr(Count_pas, txt00);
        Lcd_Out(2, 11, txt00);
        
        PORTC = 0x01;
        delay_ms(150);
        count_pas--;
        intToStr(Count_pas, txt00);
        Lcd_Out(2, 11, txt00);


        if( Count_pas <=0 )  break;
        


    }
    


}


// Création d'une fonction software permettant de compter le temps en ms

void  Delai(unsigned int temps)
{

    unsigned int i;
    unsigned int j;

    for(i = 0; i < temps; i++)
    {

        for(j = 0; j < 60 ; j++)
        {

            nop();

        }
    }
}


// On convertit les valeurs enregistrées dans les tableaux en nombres pour être passés en paramètres plus tard

void  Conversion_Tab_Entier()
{

    Convert_Pas = (100 * (Pas[0] - 48))  + (10 * ( Pas[1] - 48))  + (Pas[2] - 48) ;

    Convert_Vitesse = (100 * (Vitesse[0] - 48 ))  +  (10 * (Vitesse[1] - 48))  +  (Vitesse[2] - 48) ;

}


void Interrupt()
{

    if (INTCON.INTF == 1)
    {
        flag == 1;
        INTCON.INTF = 0;
    }

}



void Arret_Urgence(){

if( flag == 1){

    retour_zero();
    flag = 0;

}
}



void Effacer()
{

    if (Entrer == 1)
    {
    
        for(cnt_pas=10; cnt_pas <=14; cnt_pas++)
        {
          
            Lcd_Chr(1, cnt_pas, ' ');
        }
        
        Cnt_pas = 10;

    }

}



void Move_Delay()
{

    Sound_Play(120, 55);
    Delay_ms(80);
    
}


void Move_Ecriture()
{

    Lcd_Out(2,2,txt11);                 // Write text in second row
    Move_Delay();
    Lcd_Out(2,3,txt22);                 // Write text in second row
    Move_Delay();
    Lcd_Out(2,4,txt33);                // Write text in second row
    Move_Delay();
    Lcd_Out(2,5,txt44);                // Write text in second row
    Move_Delay();
    Lcd_Out(2,6,txt55);                // Write text in second row
    Move_Delay();
    Lcd_Out(2,7,txt66);                // Write text in second row
    Move_Delay();
    Lcd_Out(2,8,txt88);                 // Write text in second row

    Move_Delay();
    Lcd_Out(2,9,txt77);                 // Write text in second row

    Move_Delay();
    Lcd_Out(2,10,txt99);                // Write text in second row
    Move_Delay();
    Lcd_Out(2,11,txt10);                // Write text in second row
    Move_DelaY();
    Lcd_Out(2,12,txt77);                // Write text in second row
    Move_Delay();
    Lcd_Out(2,13,txt17);                // Write text in sec
    Move_Delay();
    Lcd_Out(2,14,txt12);                // Write text in sec
    Move_Delay();
    Lcd_Out(2,15,txt13);                // Write text in sec

}

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.