claudiusmarius

PWMCamionSeeeduino001

Apr 24th, 2022
1,367
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.46 KB | None | 0 0
  1.  
  2.  
  3.  
  4.   //******************************************************************************************************************************************************************************
  5.   // Le 24/04/2022 fonctionne, à noter toutefois un pic trés bref de vitesse lors du passage de neutre à V1
  6.   // Le ValueDac donne une information analogique en tension destinée à jouer sur le volume sonore du bruitage moteur
  7.   // NE PLUS TOUCHER
  8.   //******************************************************************************************************************************************************************************
  9.  
  10.  
  11.   #include "wiring_analog_extras.h"                                                                                       // Librairie permettant de passer à 20Khz la fréquence PWM
  12.  
  13.   #define BrocheEntreePWM 1                                                                                               // Broche (2) PB3 entrée impulsion PWM
  14.  
  15.   #define BrocheSens1 8                                                                                                   // Broche (6) PB1 de la commande 1 du sens du moteur
  16.   #define BrocheSens2 9                                                                                                   // Broche (7) PB2 de la commande 2 du sens du moteur
  17.   #define BrochePWMMoteur 7                                                                                               // Broche (5) PB0 de la commande PWM du moteur
  18.   #define BrochePresence 2                                                                                                // Broche (3) PB4 pour signaler la présence du module moteur au module principal
  19.   #define BrocheDAC A0
  20.   #define BrochePWMMoteurInverse 6   // Broche créée de part la nécessité de rajouter un interface à transistor pour adapter le 3.3V Seeeduino  vers le L298N
  21.  
  22.   int accelerationMoteur = 0;  
  23.   int selectBoite = 0;                                                                                                    // Variable contenant la position courante de la boite de vitesses
  24.   int ValueDAC;                                                                                                           // Variable du signal DAC
  25.  
  26.   int V1Min = 125;
  27.   int V1MinAR = 135;
  28.   int V1Max = 170;
  29.   int V1MaxAR = 150;
  30.   int V2Min = 170;
  31.   int V2Max = 255;
  32.  
  33.   unsigned long dureeImpulsion = 0;                                                                                       // Valeur de l'impulsion lue sur la broche d'entrée PWM
  34.  
  35.  
  36.   void setup()
  37.   {
  38.   analogReadResolution(10);                                                                                               // Spécification résolution à utiliser pour la lecture ANA
  39.   analogWriteResolution(10);
  40.   analogWrite(BrocheDAC, 0);
  41.  
  42.   pinMode(BrocheEntreePWM, INPUT_PULLUP);                                                                               // Configuration de la broche en entrée
  43.   pinMode(BrocheSens1, OUTPUT);                                                                                         // Configuration des ports en Sorties
  44.   pinMode(BrocheSens2, OUTPUT);
  45.   pinMode(BrochePWMMoteur, OUTPUT);
  46.  
  47.   pinMode(BrochePWMMoteurInverse, OUTPUT);                                                                              // Broche pour signal complémentaire à celui de BrochePWMMoteur
  48.  
  49.   pinMode(BrochePresence, OUTPUT);
  50.  
  51.   digitalWrite(BrochePresence, HIGH);                                                                                   // Signale la présence de ce module au module principal
  52.   digitalWrite(BrocheSens1, LOW);                                                                                       // Initialisation des relais du moteur
  53.   digitalWrite(BrocheSens2, LOW);
  54.   digitalWrite(BrochePWMMoteur, 0);                                                                                     // Initialisation de la PWM du moteur
  55.   digitalWrite(BrochePWMMoteurInverse, 255);                                                                            // Idem ci-dessus mais inversé
  56.   delay (1000);
  57.  
  58.   }
  59.  
  60.   void loop()
  61.   {
  62.  
  63.   //*************************************************************************************************************************************************************************
  64.   noInterrupts();
  65.   dureeImpulsion = pulseIn(BrocheEntreePWM, HIGH); // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Lecture de la durée d'impulsion du signal PWM envoyé par le module principal
  66.   interrupts();
  67.   if (dureeImpulsion > 2032) {dureeImpulsion = 2032;}                                                                   // Borne la durée d'impulsion
  68.  
  69.   //*************************************************************************************************************************************************************************
  70.   if (dureeImpulsion >= 23 && dureeImpulsion <= 53 && selectBoite != 0) // ++++++++++++++++++++++++++++++++++++++++++++ // Sélection Boite = Stop
  71.   {
  72.  
  73.   selectBoite = 0;                                                                                                     // Mémorise la position de la boite de vitesses
  74.   accelerationMoteur = 0;
  75.   digitalWrite(BrocheSens1, HIGH);                                                                                     // Positionne l'inverseur pour un freinage
  76.   digitalWrite(BrocheSens2, HIGH);
  77.                                                                                    
  78.   analogWrite(BrocheDAC, 0);
  79.   analogWrite20kHz(BrochePWMMoteur, 0);
  80.   analogWrite20kHz(BrochePWMMoteurInverse, 255 - 0);                                                                    // Complément de BrochePWMMoteur
  81.   }
  82.   else if (dureeImpulsion >= 180 && dureeImpulsion <= 210 && selectBoite != 20) // ------------------------------------ // Sélection Boite = Neutre
  83.   {
  84.  
  85.   delay (50);
  86.   selectBoite = 20;                                                                                                     // Mémorise la position de la boite de vitesses
  87.    
  88.   accelerationMoteur = 0;
  89.   analogWrite(BrocheDAC, 0);
  90.   analogWrite20kHz(BrochePWMMoteur, 0);                                                                                 // PWM Moteur = 0
  91.   analogWrite20kHz(BrochePWMMoteurInverse, 255 - 0);
  92.  
  93.    
  94.   digitalWrite(BrocheSens1, LOW);                                                                                       // Positionne l'inverseur au repos
  95.   digitalWrite(BrocheSens2, LOW);
  96.   delay (100);
  97.   }
  98.  
  99.   else if (dureeImpulsion >= 340 && dureeImpulsion <= 370 && selectBoite != 30) // ------------------------------------ // Sélection Boite = Vitesse 1
  100.   {
  101.   accelerationMoteur = 0;
  102.   delay (50);
  103.   selectBoite = 30;                                                                                                     // Mémorise la position de la boite de vitesses
  104.   delay (100);
  105.   analogWrite(BrocheDAC, 0);
  106.   analogWrite20kHz(BrochePWMMoteur, 0);                                                                                  // PWM Moteur = 0
  107.   analogWrite20kHz(BrochePWMMoteurInverse, 255 - 0);
  108.  
  109.    
  110.   digitalWrite(BrocheSens1, HIGH);                                                                                       // Positionne l'inverseur pour une marche avant
  111.   digitalWrite(BrocheSens2, LOW);
  112.   }
  113.   else if (dureeImpulsion >= 500 && dureeImpulsion <= 530 && selectBoite != 40) // ------------------------------------ // Sélection Boite = Vitesse 2
  114.   {
  115.   selectBoite = 40;                                                                                                     // Mémorise la position de la boite de vitesses
  116.   analogWrite(BrocheDAC, 0);  
  117.   analogWrite20kHz(BrochePWMMoteur, 0);                                                                                 // PWM Moteur = 0
  118.   analogWrite20kHz(BrochePWMMoteurInverse, 255 - 0);
  119.  
  120.    
  121.   digitalWrite(BrocheSens1, HIGH);                                                                                      // Positionne l'inverseur pour une marche avant
  122.   digitalWrite(BrocheSens2, LOW);
  123.   }
  124.   else if (dureeImpulsion >= 660 && dureeImpulsion <= 700 && selectBoite != 50) // ------------------------------------ // Sélection Boite = Marche Arrière
  125.   {
  126.   selectBoite = 50;                                                                                                     // Mémorise la position de la boite de vitesses
  127.    
  128.   analogWrite(BrocheDAC, 0);
  129.   analogWrite20kHz(BrochePWMMoteur, 0);                                                                                 // PWM Moteur = 0
  130.   analogWrite20kHz(BrochePWMMoteurInverse, 255 - 0);
  131.   digitalWrite(BrocheSens1, LOW);                                                                                       // Positionne l'inverseur pour une marche arrière
  132.   digitalWrite(BrocheSens2, HIGH);
  133.   }
  134.  
  135.   //*************************************************************************************************************************************************************************
  136.   if (selectBoite == 30 || selectBoite == 40 || selectBoite == 50) // +++++++++++++++++++++++++++++++++++++++++++++++++ // Active ou désactive la PWM moteur
  137.   {
  138.   if (selectBoite == 30) // -----------------------------------------------------------------------------------------   / Accélération en Vitesse 1
  139.   {
  140.  
  141.   accelerationMoteur = map(dureeImpulsion, 943, 2032, V1Max,V1Min);                                                     // Convertit l'impulsion reçue en accélération de 118 à 150
  142.   ValueDAC = map(dureeImpulsion, 943, 2032, (V1Max*1023/255),(V1Min*1023/255));
  143.   analogWrite(BrocheDAC, ValueDAC);
  144.   if (accelerationMoteur <= V1Min) {accelerationMoteur = 0;}
  145.   analogWrite20kHz(BrochePWMMoteur, accelerationMoteur);                                                                // Active la PWM moteur en fonction de la valeur reçue
  146.   analogWrite20kHz(BrochePWMMoteurInverse, 255 - accelerationMoteur);
  147.   }
  148.   else if (selectBoite == 40) // ------------------------------------------------------------------------------------   // Accélération en Vitesse 2
  149.   {
  150.   accelerationMoteur = map(dureeImpulsion, 943, 2032, V2Max, V2Min);                                                    // Convertit l'impulsion reçue en accélération de 118 à 255
  151.   ValueDAC = map(dureeImpulsion, 943, 2032, (V2Max*1023/255),(V2Min*1023/255));
  152.   analogWrite(BrocheDAC, ValueDAC);
  153.   if (accelerationMoteur <= V2Min) {accelerationMoteur = 0;}
  154.   analogWrite20kHz(BrochePWMMoteur, accelerationMoteur);                                                                // Active la PWM moteur en fonction de la valeur reçue
  155.   analogWrite20kHz(BrochePWMMoteurInverse, 255 - accelerationMoteur);
  156.   }
  157.   else if (selectBoite == 50) // ------------------------------------------------------------------------------------   // Accélération en Marche Arrière
  158.   {
  159.   accelerationMoteur = map(dureeImpulsion, 943, 2032, V1MaxAR, V1MinAR);                                                // Convertit l'impulsion reçue en accélération de 126 à 150
  160.   ValueDAC = map(dureeImpulsion, 943, 2032, (V1MaxAR*1023/255),(V1MinAR*1023/255));
  161.   analogWrite(BrocheDAC, ValueDAC);
  162.   if (accelerationMoteur <= V1MinAR) {accelerationMoteur = 0;}
  163.   analogWrite20kHz(BrochePWMMoteur, accelerationMoteur);                                                                // Active la PWM moteur en fonction de la valeur reçue
  164.   analogWrite20kHz(BrochePWMMoteurInverse, 255 -accelerationMoteur);
  165.   }
  166.   }
  167.   }
Advertisement
Add Comment
Please, Sign In to add comment