Advertisement
Guest User

Untitled

a guest
May 26th, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.66 KB | None | 0 0
  1. #include "SERVO.h"
  2. #include "c8051F020.h"
  3.  
  4. #define SYSCLK 22118400
  5.  
  6. /**
  7.  * Variables du Servomoteur:
  8.  */
  9.  
  10. // Pin du Servomoteur:
  11. sbit SERVO_pin = P1 ^ 3;
  12.  
  13. // Paramètres de la position du Servomoteur:
  14. unsigned int SERVO_t_pos_min = 700;   // Durée de l'impulsion pour 0°
  15. unsigned int SERVO_t_pos_max = 2400;  // Durée de l'impulsion pour 180°
  16. unsigned int SERVO_alpha;             // Durée d'impulsion par degré d'angle
  17.  
  18. // Calcul de la position:
  19. unsigned int timer_load, timer_count, timer_pulse;
  20.  
  21. // Enregistrement de la position:
  22. char SERVO_position = 0;
  23.  
  24. // Compte le nombre d'interruptions:
  25. int SERVO_i = 0;
  26.  
  27. // Temps en ms, avant que le servo soit correctement positionné:
  28. unsigned int SERVO_wait_pos = 0;
  29. char SERVO_response = 'H';
  30.  
  31. /**
  32.  * Initialisation pour utiliser un servomoteur
  33.  * Registres modifiés: P1MDOUT ()
  34.  */
  35. void SERVO_init() {
  36.   // Activation de la sortie en Push-Pull:
  37.   P1MDOUT |= 1 << 3;
  38.  
  39.   // Configuration du Timer 3:
  40.   TIMER3_config();
  41.  
  42.   // Durée d'impulsion par degré d'angle:
  43.   SERVO_alpha = (SERVO_t_pos_max - SERVO_t_pos_min) / 180;
  44.  
  45.   // Position d'origine:
  46.   SERVO_pos(0);
  47.  
  48.   // Pour ne pas envoyer de message:
  49.   SERVO_wait_pos = 0;
  50. }
  51.  
  52. /**
  53.  * Configuration du Timer 3
  54.  * Registres modifiés: EIP2 (PT3), EIE2 (ET3), TMR3CN (TF3,T3M,TR3)
  55.  */
  56. void TIMER3_config() {
  57.   // Activation des interruptions:
  58.   EIP2 |= 1;            // Priorité élevée: PT3 = 1
  59.   EIE2 |= 1;            // Enable: ET3 = 1
  60.   TMR3CN &= ~(1 << 7);  // RAZ Flag: TF3 = 0
  61.  
  62.   // Utilise SYSCLK:
  63.   TMR3CN |= 1 << 1;  // T3M = 1
  64.  
  65.   // Activation du Timer 3:
  66.   TMR3CN |= (1 << 2);  // TR3 = 1
  67. }
  68.  
  69. /**
  70.  * Fonction qui doit s'exécuter toutes les ms,
  71.  * pour prévenir lorsque le servo s'est bien positionné
  72.  * @return {bit} 0: rien, 'H' ou 'V': servo positionné
  73.  */
  74. char SERVO_update() {
  75.   if (SERVO_wait_pos > 0) {
  76.     SERVO_wait_pos--;
  77.     if (SERVO_wait_pos == 0) return SERVO_response;
  78.   }
  79.   return 0;
  80. }
  81.  
  82. /**
  83.  * Active le Servomoteur
  84.  */
  85. void SERVO_on() {
  86.   // Active l'interruption du Timer 3:
  87.   EIE2 |= 1;  // Enable: ET3 = 1
  88. }
  89.  
  90. /**
  91.  * Désactive le Servomoteur
  92.  */
  93. void SERVO_off() {
  94.   // Désactive l'interruption du Timer 3:
  95.   EIE2 &= ~1;  // Disable: ET3 = 0
  96.  
  97.   // Sortie à l'état bas:
  98.   SERVO_pin = 0;
  99. }
  100.  
  101. /**
  102.  * Fonction d'interruption du Timer 3
  103.  * Etat haut 1 fois sur 10 déclenchements
  104.  * Registre modifié: TMR3CN (TF3)
  105.  */
  106. void SERVO_interrupt() interrupt 14 {
  107.   // RAZ du flag:
  108.   TMR3CN &= ~(1 << 7);
  109.  
  110.   // Etat haut:
  111.   if (SERVO_i == 10) {
  112.     SERVO_pin = 1;
  113.     SERVO_i = 0;
  114.   }
  115.  
  116.   // Sinon, Etat bas:
  117.   else
  118.     SERVO_pin = 0;
  119.  
  120.   SERVO_i++;
  121. }
  122.  
  123. /**
  124.  * Modifie la position du servomoteur
  125.  * @param {unsigned int} pos : position du servomoteur (entre -90° et 90°)
  126.  * Registres modifiés: TMR3RLL, TMR3RLH
  127.  */
  128. void SERVO_pos(char p) {
  129.   // Adaptation de l'angle:
  130.   unsigned char pos = 180 - (p + 90);  // [0°,180°]
  131.  
  132.   // Vérification de l'angle:
  133.   if (pos > 180) pos = 180;
  134.   if (pos < 0) pos = 0;
  135.  
  136.   // Durée de l'impulsion nécessaire pour l'angle:
  137.   timer_pulse = SERVO_t_pos_min + (pos * SERVO_alpha);
  138.  
  139.   // Conversion en nombre de coups d'horloge:
  140.   timer_count = timer_pulse * 0.000001 * SYSCLK;
  141.  
  142.   // Valeur de reload du Timer 3:
  143.   timer_load = 65535 - timer_count;
  144.  
  145.   // Chargement du Timer 3:
  146.   TMR3RLL = timer_load & 0x00FF;
  147.   TMR3RLH = timer_load >> 8;
  148.  
  149.   // Enregistre la nouvelle position du servo:
  150.   SERVO_position = pos;
  151. }
  152.  
  153. void SERVO_showResponse(char c) {
  154.     // Enregistre le servo correctement placé:
  155.     SERVO_response = c;
  156.    
  157.     // Envoie un message dans $n ms, indiquant que le servo s'est bien positionné:
  158.   SERVO_wait_pos = 800;  // $n ms
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement