//Afficheur_courbe_d_avance_191216_imprime_N_et_Avance-Retard _sur_BT //ATTENTION!!!!!!****************La cible de PMH doit être noire sur fond clair****************** #define Etin 8 //Entrée de l'étincelle, bas si étincelle #define Pmh A3 //Entrée digitale capteur optique de Pmh,0 si noir, 1 si blanc #define Flash A4 //Sortie vers module Keyes de flash //#define Hall 6 //Entrée de capteur Hall simulant l'étincelle #include SoftwareSerial BT(10, 11); // RX,TX respectivement //Niveau bas si aimant present qq soit la face du capteur et la polarité de l'aimant int unsigned long Tbrut = 0; //T entre deux Pmh en µs, avant verif int unsigned long T = 0; //T entre deux Pmh en µs, confirmée int unsigned long Tcum = 0; int N = 0; //Regime moteur en t/mn int unsigned long D = 0; //Durée entre étincelle et Pmh en µs int unsigned long Dcum = 0;//cumul Nech de D int Nech = 5;//Pour calcul de D int unsigned long prec_H = 0; //Heure de premier front en µs; float Av = 0;//Avance en degrés int tFlash = 50; //Durée du flash en µs //**************************************************** void Lire_D()// D délai entre étincelle et Pmh { //while (digitalRead(Hall) == 1); //Attendre si signal haut, aimant = signal bas while (digitalRead(Etin) == 1); //Attendre etincelle prec_H = micros();//Etin arrive, noter l'heure while (digitalRead(Pmh) == 1); //Attendre la cible noire D = micros() - prec_H ; //Arrivée du Pmh // Serial.print("D = "); Serial.println(D); } //*********************************************** void Lire_T() { //Lire la preriode T entre deux passages de cible de Pmh, cible noire while (digitalRead(Pmh) == 1); //Blanc, attendre la cible noire prec_H = micros(); //Pmh, noter l'heure du front, debut de cible noire while (digitalRead(Pmh) == 0); //Attendre fin de cible noire while (digitalRead(Pmh) == 1); //Blanc,attendre la prochaine cible noire Tbrut = micros() - prec_H ; //Pmh suivant, Tattente = temps entre deux Pmh if (Tbrut >= 10000) { T = Tbrut; // OK, T validée //Flash de verification du calage du capteur de Pmh digitalWrite(Flash, 1); delayMicroseconds(tFlash); digitalWrite(Flash, 0); N = 60000000 / T; // en t/mn // Serial.print("T en mus = "); Serial.println(T); Serial.print("N t/mn = "); Serial.println(N); } // delay(1000); } void setup() //*********************************************** { Serial.begin(9600);//Sortie vers ecran seriel sur PC BT.begin(9600);//La liaison série soft D10 et D11!!!VERIFIER cette vitesse!! pinMode(Pmh, INPUT);//Helas la pullup ne fonctionne pas , il faut une R dans le collecteur du transistor pinMode(Etin, INPUT);//anode du thyristor = 0 quand étincelle //pinMode(Hall, INPUT_PULLUP); pinMode(Flash, OUTPUT); Serial.println("Afficheur de courbe d'avance"); BT.println("Afficheur de courbe d'avance"); // while (1) Lire_T(); } void loop() { //D'abord la periode T et N Tcum = 0; for (int i = 1; i <= Nech; i++) { Lire_T();//entre deux passages de cible de Pmh Tcum = Tcum + T; } T = Tcum / Nech;//Moyenne de Nech antillons //Ensuite le délai D entre étincelle et Pmh Dcum = 0; for (int i = 1; i <= Nech; i++) { Lire_D(); Dcum = Dcum + D; } D = Dcum / Nech;//Moyenne de Nech antillons Serial.print("N t/mn = "); Serial.print(N); Serial.print( " Av degres = "); BT.print("N t/mn = "); BT.print(N); BT.print( " Av degres = "); if ( D >= T / 2) { //Retard à l'allumage, car plus de 180° d'avance!!! D = T - D; //Donc corriger D Serial.print( " Retard "); BT.print( " Retard "); } Av = (float(360) / float(T) ) * float(D); //Calcul de l'avance en degrès Serial.println(Av); Serial.println(); BT.println(Av); BT.println();