daily pastebin goal
27%
SHARE
TWEET

Untitled

a guest Dec 13th, 2017 52 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #pragma chip PIC12F615  
  2.                    
  3. #pragma config=0b1111110011000100  // Configuration mot de configuration pour mettre l'horloge à 8MHz
  4.  
  5. //********* Alias *******
  6. #define ledRouge GPIO.5
  7. #define ledJaune GPIO.1
  8. #define ledVerte GPIO.0 // On définit des alias pour les pins GPIO des LED
  9. #define PWM GPIO.2
  10. #define alpha CCPR1L // On définit un alias pour le mot qui gère le rapport cyclique
  11.  
  12. char adc(); // Renvoie le mot binaire correspondant à l'entrée analogique
  13. void regulerAlpha(); // Sert à réguler alpha pour respecter le cahier des charges
  14.  
  15. void main(void)
  16. {  
  17.  
  18.     ANSEL=0b01011000; // Permet de spécifier des entrées comme analogiques
  19.     TRISIO=0b00011000; // Permet de spécifier les pins GPIO comme entrées ou sorties
  20.     OPTION=0b10000000; // Permet d'activer les pins GPIO et de régler les Timer0
  21.     OSCTUNE = 0b00000011; // Permet de modifier la fréquence de l'horloge. Très délicat
  22.    
  23.     //**********PWM **************************
  24.     PR2=50; // Valeur à laquelle le Timer2 s'interrompt
  25.     CCP1CON=0b00001111; // Permet de spécifier le Timer2 en mode PWM
  26.     alpha=20; // Spécifie le rapport du rapport cyclique, à multiplier par 2 pour le résulat réel
  27.     T2CON = 0b00000100; // Permet de régler l'activation du Timer2, son postscaler et prescaler
  28.     TMR2IF=0; // Flag d'interruption du Timer2, doit être à 0 avant le début de la PWM
  29.     TMR2=0x00; // Valeur du Timer2, compte à partir de là jusqu'à PR2
  30.    
  31.     //****Conversion sur AN3 avec Vref********
  32.     ADCON0=0b00001101; // Spécifie le format du mot binaire (gauche ou droite), le pin pour le voltage de référence
  33.     // le choix du channel de lecture, le bit de début et fin de conversion    et le bit d'activation du CAN
  34.    
  35.     while (1)           //boucle infinie
  36.     {
  37.         regulerAlpha(); // Régule infiniment
  38.     }
  39. }
  40.  
  41. char adc()
  42. {
  43.     ADCON0.1 = 1; // Lancement de la conversion
  44.     while(ADCON0.1); // Le bit reient à 0 quand la conversion est finie
  45.     char result = ADRESH; // On récupère les 8 bits de poids fort de la conversion
  46.    
  47.     return result; // On retourne la conversion
  48. }
  49.  
  50. void regulerAlpha(){ // Sert à réguler alpha
  51. // 173 (46V Vs), 194 (49V Vs), 83 (30V Vs)
  52.    
  53.     char tension = adc(); // On récupère la tension
  54.     unsigned char nouveauAlpha; // On prépare la variable qui sert à régler alpha
  55.    
  56.     if(tension > 194){ // Surtension (>48V à peu près)
  57.        
  58.         nouveauAlpha = 0; // alpha=0 on coupe tout et on allume toutes les LED
  59.         ledRouge = 1;
  60.         ledJaune = 1;
  61.         ledVerte = 1;
  62.        
  63.     }else if(tension < 3){ // tension très basse = court-circuit
  64.        
  65.         nouveauAlpha = ADRESL>>5; // On prend les 2 bits de poids faibles de la tension
  66.         // mais ils sont en bit de poids fort de ce mot, on les décale 5 fois à droite
  67.         // on obtient une valeur entre 0 et 6
  68.         nouveauAlpha = 5+nouveauAlpha; // on ajoute 5 car les tests ont montré qu'on peut décoller à partir de ça
  69.         // le nouvel alpha vaut entre 10% et 22%
  70.         ledVerte = 0;
  71.         ledJaune = 0;
  72.         ledRouge = 1; // Seule la LED rouge est allumée
  73.        
  74.     }else if(tension > 50 && tension < 83){ // Si entre 20V et 30V surcharge
  75.    
  76.         nouveauAlpha = 15; // On descend le alpha à 30%
  77.         ledVerte = 0;
  78.         ledJaune = 0;
  79.         ledRouge = 1; // LED rouge allumée
  80.        
  81.     }else{ // Fonctionnement normal, on régule
  82.    
  83.         nouveauAlpha = tension / 15;
  84.         nouveauAlpha = 51 - nouveauAlpha;
  85.         // alpha = 51 - (tension/15)
  86.  
  87.         if(nouveauAlpha > 40){
  88.             nouveauAlpha = 40; // On limite le rapport cyclique à 80%
  89.         }
  90.        
  91.         if(tension < 173 && tension > 194){ // Si la tension est dans les clous, LED verte allumée
  92.             ledVerte = 1;
  93.             ledJaune = 0;
  94.             ledRouge = 0;
  95.         }else if(tension > 83){ // Si elle est pas dans les clous, mais que la surcharge est acceptable, LED jaune
  96.             ledVerte = 0;
  97.             ledJaune = 1;
  98.             ledRouge = 0;
  99.         }
  100.        
  101.     }
  102.    
  103.     alpha = nouveauAlpha; // On assigne le nouvel alpha calculé
  104.    
  105. }
RAW Paste Data
Top