//X25Compte-tours_SwitecX25_060620 //Pour moteur X25/27 168 avec butée //Derivé du code pour Alpine GTA de Gerard Alquier #include //Voir https://guy.carpenter.id.au/gaugette/2012/02/16/using-the-switecx25-library/ //Les appels specifiques:motor1.zero(),motor1.setPosition(i), motor1.update() //motor1.update() declenche la rotation de l'axe vers la position demandée. A executer le plus souvent possible int Ncyl = 4;// Nombre de cylindres en 4 temps, diviser par 2 pour 2 temps int afficMax = 2000;// En t/mn, affichage maxi du cadran.7000 par exemple ou 2000 pour un reglage carbu int stepCT = 0; // Position (nombre de pas) de moteur pas à pas int oldCT = 0; // Ancienne Position (nombre de pas) de moteur pas à pas const byte entCT = 2; // Pin pour entrée signal compte tour, D2 volatile byte freq = LOW; volatile float time = 0; // Délai entre deux impulsions (période) volatile float time_last = 0; // Délai précédent unsigned long LastImp = 0; // Temps pour la dernière impulsion reçue int DelaiLastImp = 500; // Délai d'attente sans impulsion pour définir moteur arrété unsigned long rpm; // Vitesse moteur en t/mn SwitecX25 motor1(315 * 3, 10, 11, 12, 13); // Declaration de motor1, 315 degrès maxi, 3 pas par degré //Connecté sur D10,..13 //************************Les fonctions************************ void compt() // Interrupt-Service-Routine, Mesure la période, délai entre deux impulsions { time = (micros() - time_last); // Délai entre deux impulsions time_last = micros(); LastImp = millis (); //Heure de passage en ms pour detecter l'arret du moteur } //********************** void initial() // Test moteur: balayage total du cadran au démarrage et retour à 0 { motor1.zero(); // Remise à zéro du moteur Pas à pas for (int i = 0; i <= 945; i++) // Balaye toute la plage d'affichage, peut monter à 945 soit 315° { motor1.setPosition(i); motor1.update(); delay (1); } } //********************************** void RPM() // Calcul de la vitesse en trs/mn { rpm = (120000000 / Ncyl) / time ; //modifié pour 2 impulsions par tour dans 4 cylindres rpm = constrain (rpm, 0, afficMax); // limite les valeurs de rpm (t/mn) entre 0 et afficMax } //******************************* void setup() { pinMode(entCT, INPUT); // Définition de la broche en entrée CT attachInterrupt(0, compt, RISING); // D2, 'entrée en interruption - front montant, l'ISR est: compt() initial(); // Initialisation du moteur (vérification fonctionnement) } //******************************** void loop() { if ((millis() - LastImp) < DelaiLastImp) // Si le delai depuis la dernière impulsion est assez faible, le moteur tourne { RPM(); } else { rpm = 0; //Sinon, delai trop long, le moteur est à l'arret } stepCT = map (rpm, 0, afficMax, 0, 315 * 3); // Transforme les t/mn en pas de moteur. Pour affiMax t/mn afficher 315° stepCT = int((oldCT * 0.9) + (stepCT * 0.1));//Lissage motor1.setPosition(stepCT); //¨Prepare l'affichage oldCT = stepCT; motor1.update(); //Affiche: fait tourner l'axe vers la position stepCT }