5/5 (1 avis)
Snippet vu 11 093 fois - Téléchargée 19 fois
/***************************************************************/ /****** 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 }
16 mars 2017 à 11:51
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.