Bonjour,
Je veux me faire un compteur de rotation sur un axe, j'ai un capteur à effet hall, un aimant avec 6 pôles et un ESP32-S2
Je lui donne ceci avec arduino 1.8.19
/*
* esp Capteur Hall
* 3.3V 1
* Gnd 2
* 4 3 10k 3.3v
*
* 15 led interne
*
*/
#define pinSensor 4
const byte PulsesPerRevolution = 6; // Définit le nombre d'impulsions à chaque révolution.
const unsigned long ZeroTimeout = 200000; // For high response time, a good value would be 100000.
// For reading very low RPM, a good value would be 300000.
volatile unsigned long LastTimeWeMeasured; // Stocke la dernière fois que nous avons mesuré une impulsion afin que nous puissions calculer la période.
volatile unsigned long PeriodBetweenPulses = ZeroTimeout+1000; // Stocke la période entre les impulsions en microsecondes.
// Il a un grand nombre donc il ne commence pas par 0 qui serait interprété comme une fréquence élevée.
volatile unsigned long PeriodAverage = ZeroTimeout+1000; // Stocke la période entre les impulsions en microsecondes au total, si nous prenons plusieurs impulsions.
// Il a un grand nombre donc il ne commence pas par 0 qui serait interprété comme une fréquence élevée.
unsigned long FrequencyRaw; // Fréquence calculée, basée sur la période. Cela a beaucoup de décimales supplémentaires
unsigned long FrequencyReal; // Frequency without decimals.
unsigned long RPM; // RPM brut sans aucun traitement.
unsigned int PulseCounter = 1; // nb de ticks prises afin que nous puissions faire la moyenne de plusieurs impulsions avant de calculer la période.
unsigned long PeriodSum; //Stocke la somme de toutes les périodes pour faire la moyenne.
unsigned long LastTimeCycleMeasure = LastTimeWeMeasured;
unsigned long CurrentMicros = micros();
unsigned int AmountOfReadings = 1;
unsigned int ZeroDebouncingExtra;
const int pinLed=15;
bool ledOut=0;
void setup()
{ delay(5000);
Serial.begin(115200);
Serial.println("========================");
Serial.println(__FILE__);
attachInterrupt(digitalPinToInterrupt(pinSensor), Pulse_Event, RISING);
delay(1000); // être suffisamment élevé pour les premiers cycles.
pinMode(pinSensor, INPUT);
pinMode(pinLed, OUTPUT); }
void loop()
{ LastTimeCycleMeasure = LastTimeWeMeasured; // Store the LastTimeWeMeasured in a variable.
CurrentMicros = micros(); // Store the micros() in a variable.
if(CurrentMicros < LastTimeCycleMeasure)
{ LastTimeCycleMeasure = CurrentMicros; } // Calculate the frequency:
FrequencyRaw = 10000000000 / PeriodAverage; // Calculate the frequency using the period between pulses
if(PeriodBetweenPulses > ZeroTimeout - ZeroDebouncingExtra || CurrentMicros - LastTimeCycleMeasure > ZeroTimeout - ZeroDebouncingExtra)
{ FrequencyRaw = 0; // Set frequency as 0.
ZeroDebouncingExtra = 2000; } // Changez un peu le seuil pour qu'il ne rebondisse pas.
else { ZeroDebouncingExtra = 0; }
FrequencyReal = FrequencyRaw / 10000; // Obtient la fréquence sans décimales.
RPM = FrequencyRaw / PulsesPerRevolution * 60; // Frequency divided by amount of pulses per revolution multiply by
RPM = RPM / 10000; // Remove the decimals.
Serial.print("\tRPM: ");
Serial.println(RPM);
ledOut = ! ledOut,
digitalWrite(pinLed,ledOut);}
void Pulse_Event()
{ PeriodBetweenPulses = micros() - LastTimeWeMeasured;
LastTimeWeMeasured = micros();
if (PulseCounter >= AmountOfReadings)
{ PeriodAverage = PeriodSum / AmountOfReadings;
PulseCounter = 1;
PeriodSum = PeriodBetweenPulses;
int RemapedAmountOfReadings = map(PeriodBetweenPulses, 40000, 5000, 1, 10);
RemapedAmountOfReadings = constrain(RemapedAmountOfReadings, 1, 10);
AmountOfReadings = RemapedAmountOfReadings; }
else
{ PulseCounter++;
PeriodSum = PeriodSum + PeriodBetweenPulses; } }
L'esp32S2 en mode internal USB a besoin d'un certain temps pour que windows le reconnaisse donc que le moniteur série soit possible
Si le capteur est branché au démarrage l'ESP reboote éternellement et je ne peux rien voir
Si le capteur n'est pas branché au démarrage puis connecté tout fonctionne
Une explication de ceci ?
Cdlt
fr