Accueil du site

[Plan du site] Vous êtes ici :: Robotix ~ Accueil ~ Les tutoriels ~ Programmation ~ Programmation d'un pic sous MicroC ~ Moteurs pas à pas

Moteurs pas à pas

Avatar de : Harry
  • Auteur : Harry
  • Date de création : le 03/08/08 à 15h45
  • Dernière modification : le 13/10/09 à 20h12
Page précédente Sommaire Page suivante

Voici un exemple de code de contrôle d'un moteur pas à pas. Vous trouverez une explication sur certains moteurs ici.
Moteur pas à pas qui tourne en même temps que tourne une roue codeuse :

Code C
  1. // --------------------------------------------
  2. // Liste des ports utilisés pour gérer le robot
  3. // --------------------------------------------
  4. // CONTacteurs
  5. #define CONT PORTB.F2
  6. // Roues codeuses gauche et droite
  7. #define RCG1 PORTB.F0
  8. #define RCG2 PORTB.F3
  9. #define RCD1 PORTB.F1
  10. #define RCD2 PORTB.F4
  11.  
  12. // Vitesse du moteur de la roue Gauche (VG) et Vitesse du moteur de la roue Droite (VD) [VITESSE ==> FREQUENCE] <=> à gérer avec le PWM et la fréquence d'envoi des données
  13. #define VG CCPR1L                  // 1 bit
  14. #define VD CCPR2L                  // 1 bit
  15. #define SENSG1 PORTD.F0            // 1 bit : 1 si vers l'avant 0 vers l'arrière sauf si SENSG1 = SENSG2 ==> STOP
  16. #define SENSG2 PORTD.F1            // 1 bit : 1 si vers l'arrière 0 vers l'avant sauf si SENSG1 = SENSG2 ==> STOP
  17. #define SENSD1 PORTD.F2            // 1 bit : 1 si vers l'avant 0 vers l'arrière sauf si SENSG1 = SENSG2 ==> STOP
  18. #define SENSD2 PORTD.F3            // 1 bit : 1 si vers l'arrière 0 vers l'avant sauf si SENSG1 = SENSG2 ==> STOP
  19.  
  20. // Vitesse de la Courroie (VC) avant :                                                  [VITESSE ==> FREQUENCE] <=> à gérer avec la fréquence d'envoi des données
  21. #define VC PORTC.F4                // 1 bit
  22. #define SENSC1 PORTD.F4            // 1 bit
  23. #define SENSC2 PORTD.F5            // 1 bit
  24. // Vitesse de la Porte (VP) arrière :                                                   [VITESSE ==> FREQUENCE] <=> à gérer avec la fréquence d'envoi des données
  25. #define VP PORTC.F6                // 1 bit
  26. #define SENSP1 PORTD.F6            // 1 bit
  27. #define SENSP2 PORTD.F7            // 1 bit
  28.  
  29.  
  30.  
  31. // --------------------------
  32. // Définition des objectifs :
  33. // --------------------------
  34.  
  35. // -------------------------
  36. // Définition des constantes
  37. // -------------------------
  38.  
  39.  
  40. typedef enum Sens {AVANT,ARRIERE} Sens;
  41.  
  42. // --------------------------
  43. // Définition des variables :
  44. // --------------------------
  45. char t;
  46. Sens SRCG; // Sens Roue Codeuse Gauche
  47. char NbPasCG; // Nombre de pas de roue codeuse gauche
  48.  
  49.  
  50.  
  51. //==============================================================================
  52. //==============================================================================
  53. //==============================================================================
  54.  
  55.  
  56.  
  57. // *****************************
  58. // Liste des fonctions utilisées
  59. // *****************************
  60.  
  61.  
  62. //==============================================================================
  63.  
  64.  
  65.  
  66. //==============================================================================
  67. //==============================================================================
  68. //==============================================================================
  69.  
  70.  
  71. // Fonction qui permet de gérer le temps
  72. // Nécessite :
  73. void Temp(void)
  74. {
  75.   //if (INTCON.F2) // Gestion du temps : [0 ==> 100000] temppetit ==> x100000 ==> [0 ==> 100000] tempmoyen ==> x100000 ==> [0 ==> taille(double)] tempgros
  76.   {
  77.     t = t + 1;
  78.     //TMR0L  = 0;
  79.   }
  80. }
  81.  
  82.  
  83.  
  84. //==============================================================================
  85.  
  86.  
  87. // Fonction qui permet de changer l'état du PORTD à chaque fois qu'il y a une interruption
  88. // Nécessite :
  89. void CodeurG(void)
  90. {
  91.   if (RCG2 == 1)
  92.   {
  93.     SRCG = AVANT;
  94.     NbPasCG++;
  95.   }
  96.   else
  97.   {
  98.     SRCG = ARRIERE;
  99.     NbPasCG--;
  100.   }
  101. }
  102.  
  103.  
  104.  
  105. //==============================================================================
  106.  
  107.  
  108. // Fonction qui permet de gérer les interruptions
  109. // Nécessite : Temp()
  110. void interrupt(void)
  111. {
  112.   if (INTCON.F2 == 1)
  113.   {
  114.     Temp();
  115.     INTCON.F2 = 0;
  116.   }
  117.   if (INTCON.F1 == 1)
  118.   {
  119.     CodeurG();
  120.     INTCON.F0 = 0;
  121.   }
  122.  
  123.   INTCON = 0b10110000;     // Réinitialise les options d'interruptions
  124. }
  125.  
  126.  
  127. //==============================================================================
  128. //==============================================================================
  129. //==============================================================================
  130.  
  131.  
  132. // ===================
  133. // Programme principal
  134. // ===================
  135.  
  136. void main(void)
  137. {
  138.   // -----------------------------
  139.   // Liste des variables utilisées
  140.   // -----------------------------
  141.  
  142.  
  143.   // ---------------------------------------------------------------------
  144.   // Définition des ports pour les interruptions sur le PORTB et le timer0
  145.   // ---------------------------------------------------------------------
  146.   T0CON = 0b10000100;        // Utiliser le TMR0 en 16 bits et prescaler de TMR0 initialisé à 1/16
  147.   //TMR0L = 0b00011110;        // Les interruptions s'effectueront toutes les : 1 s (si on est sur 16 bits)
  148.   //TMR0H = 0b00000000;        // Uniquement sur 16 bits
  149.   INTCON = 0b10110000;       // Autoriser les interruptions, celles de TMRO et INT0 (B.0)
  150.   ADCON1 = 0b00001111;       // Utiliser les 4 premiers bits du port B en mode analogic [= analogique en anglais] uniquement (et non pas en digital = numérique en anglais)
  151.  
  152.   /*
  153.   // ---------------------------------------------------------------------
  154.   // Configuration du PWM à 4 kHz (hmmm plus en fait) Vitesse maximale 125
  155.   // ---------------------------------------------------------------------
  156.   PR2 = 0b00111111 ;
  157.   T2CON = 0b00000101 ;
  158.   CCP1CON = 0b00001100 ;
  159.   CCP2CON = 0b00111100 ;
  160.   */
  161.  
  162.   // ---------------------
  163.   // Initialisation du pic
  164.   // ---------------------
  165.   TRISA = 0;
  166.   TRISB = 0b11111111;
  167.   TRISC = 0;
  168.   TRISD = 0;
  169.   TRISE = 0;
  170.   PORTA = 0;
  171.   PORTB = 0;
  172.   PORTC = 0;
  173.   PORTD = 0;
  174.   PORTE = 0;
  175.   t = 0;
  176.  
  177.   // ************************
  178.   // DEFINITION DES OBJECTIFS
  179.   // ************************
  180.  
  181.   while(1)
  182.   {
  183.     PORTD = t;
  184.     PORTC = NbPasCG;
  185.     if (SRCG == AVANT)
  186.     {
  187.       PORTA.F4 = 0;
  188.     }
  189.     else
  190.     {
  191.       PORTA.F4 = 1;
  192.     }
  193.   }
  194. }
  195.  


Vitesse du Moteur pas à pas contrôlé par la roue codeuse

Code C
  1.  
  2. // Roues codeuses gauche et droite
  3. #define RCG1 PORTB.F0
  4. #define RCG2 PORTB.F3
  5. #define RCD1 PORTB.F1
  6. #define RCD2 PORTB.F4
  7.  
  8. typedef enum Sens {AVANT,ARRIERE} Sens;
  9.  
  10. char t;
  11. Sens SRCG; // Sens Roue Codeuse Gauche
  12. char NbPasCG; // Nombre de pas de roue codeuse gauche
  13.  
  14. int pas;
  15.  
  16.  
  17. // Fonction qui permet de gérer le temps
  18. // Nécessite :
  19. void Temp(void)
  20. {
  21.   //if (INTCON.F2) // Gestion du temps : [0 ==> 100000] temppetit ==> x100000 ==> [0 ==> 100000] tempmoyen ==> x100000 ==> [0 ==> taille(double)] tempgros
  22.   {
  23.     t = t + 1;
  24.     //TMR0L  = 0;
  25.   }
  26. }
  27.  
  28.  
  29.  
  30. //==============================================================================
  31.  
  32.  
  33. // Fonction qui permet de changer l'état du PORTD à chaque fois qu'il y a une interruption
  34. // Nécessite :
  35. void CodeurG(void)
  36. {
  37.   if (RCG2 == 1)
  38.   {
  39.     SRCG = AVANT;
  40.     NbPasCG++;
  41.   }
  42.   else
  43.   {
  44.     SRCG = ARRIERE;
  45.     NbPasCG--;
  46.   }
  47. }
  48.  
  49.  
  50.  
  51. //==============================================================================
  52.  
  53.  
  54. // Fonction qui permet de gérer les interruptions
  55. // Nécessite : Temp()
  56. void interrupt(void)
  57. {
  58.   if (INTCON.F2 == 1)
  59.   {
  60.     Temp();
  61.     INTCON.F2 = 0;
  62.   }
  63.   if (INTCON.F1 == 1)
  64.   {
  65.     CodeurG();
  66.     INTCON.F0 = 0;
  67.   }
  68.  
  69.   INTCON = 0b10110000;     // Réinitialise les options d'interruptions
  70. }
  71.  
  72.  
  73. void wait_ms(int x)
  74. {
  75.   int i;
  76.   for(i=0;i<=x;i++)
  77.   {
  78.     delay_ms(1);
  79.   }
  80. }
  81.  
  82.  
  83. void majEtat(void)
  84. {
  85.      int etat = pas%4;
  86.      if (etat<0) etat += 4;
  87.      if ( etat == 0 )
  88.         PORTD = 0b00101000;
  89.      else if ( etat == 1 )
  90.         PORTD = 0b00000101;
  91.      else if ( etat == 2 )
  92.         PORTD = 0b00000011;
  93.      else // etat = 4
  94.         PORTD = 0b00011000;
  95. }
  96.  
  97.  
  98. void main (void)
  99. {
  100.   int x, Vmax, Vmin, Da, Dc, Df, SAVE, V, S; // Distance de : Acceleration, constante, freinage
  101.  
  102.   // ---------------------------------------------------------------------
  103.   // Définition des ports pour les interruptions sur le PORTB et le timer0
  104.   // ---------------------------------------------------------------------
  105.   T0CON = 0b10000100;        // Utiliser le TMR0 en 16 bits et prescaler de TMR0 initialisé à 1/16
  106.   //TMR0L = 0b00011110;        // Les interruptions s'effectueront toutes les : 1 s (si on est sur 16 bits)
  107.   //TMR0H = 0b00000000;        // Uniquement sur 16 bits
  108.   INTCON = 0b10110000;       // Autoriser les interruptions, celles de TMRO et INT0 (B.0)
  109.   ADCON1 = 0b00001111;       // Utiliser les 4 premiers bits du port B en mode analogic [= analogique en anglais] uniquement (et non pas en digital = numérique en anglais)
  110.  
  111.   /*
  112.   // ---------------------------------------------------------------------
  113.   // Configuration du PWM à 4 kHz (hmmm plus en fait) Vitesse maximale 125
  114.   // ---------------------------------------------------------------------
  115.   PR2 = 0b00111111 ;
  116.   T2CON = 0b00000101 ;
  117.   CCP1CON = 0b00001100 ;
  118.   CCP2CON = 0b00111100 ;
  119.   */
  120.  
  121.   // ---------------------
  122.   // Initialisation du pic
  123.   // ---------------------
  124.   TRISA = 0;
  125.   TRISB = 0b11111111;
  126.   TRISC = 0;
  127.   TRISD = 0;
  128.   TRISE = 0;
  129.   PORTA = 0;
  130.   PORTB = 0;
  131.   PORTC = 0;
  132.   PORTD = 0;
  133.   PORTE = 0;
  134.   t = 0;
  135.   pas = 0;
  136.   Vmax = 5;
  137.   V = 30;
  138.   Vmin = 80;
  139.   Da = 100;
  140.   Df = 100;
  141.   Dc = 200;
  142.   SAVE = NbPasCG;
  143.   S = 1;
  144.  
  145.   while(1)
  146.   {
  147.     if (S == 1)
  148.     {
  149.       if(NbPasCG > SAVE)
  150.       {
  151.         if(V>Vmax)
  152.         {
  153.           V--;
  154.         }
  155.       }
  156.       else if (NbPasCG < SAVE)
  157.       {
  158.         if(V<Vmin)
  159.         {
  160.           V++;
  161.         }
  162.         else
  163.         {
  164.           S = -1;
  165.           V = Vmin-1;
  166.         }
  167.       }
  168.       pas++;
  169.     }
  170.     else
  171.     {
  172.       if(NbPasCG < SAVE)
  173.       {
  174.         if(V>Vmax)
  175.         {
  176.           V--;
  177.         }
  178.       }
  179.       else if (NbPasCG > SAVE)
  180.       {
  181.         if(V<Vmin)
  182.         {
  183.           V++;
  184.         }
  185.         else
  186.         {
  187.           S = 1;
  188.           V = Vmin-1;
  189.         }
  190.       }
  191.       pas--;
  192.     }
  193.     SAVE = NbPasCG;
  194.     wait_ms(V);
  195.     majEtat();
  196.   }
  197. }
  198.  

Avec un peu de recherche sur la datasheet et en pensant au composant LM621, vous devriez arriver à vos fins avec un peu de recherche sur le net (je manque vraiment de temps pour terminer convenablement le tutoriel).

Page précédente Sommaire Page suivante
© 2009 Robotix.fr - Tout droits réservés - Contact - Remonter - Nintendo - Feedburner