Buon giorno,
Sto cercando di realizzare un contagiri che, leggendo la variazione del campo magnetico generato dalla candela di un piccolo motore 2 tempi, riesca a capire il numero di giri al minuto attuale.
Per il momento mi basterebbe vedere il numero di giri attuale nel monitor seriale.
Il circuito è abbastanza semplice ed è basato su un sensore Hall A3144 che è posizionato vicino ad un filo di rame (quello da elettricisti per capirci) arrotolato sul cavo candela, in allegato lo schema elettrico.
Ho anche creato una "PCB" in modo molto artigianale con una basetta mille fori per poter avere il circuito più compatto e trasportabile.
Il problema è che dopo una decina di giri motore la seriale non comunica più nulla e devo scollegare e ricollegare arduino per far ripartire tutto.
Credo che sia dovuto ai disturbi che vengono generati dal dal filo, lontano dall'A314 di circa 1/2cm, per questo ho aggiunto un filtro passa bassa per poter cercare di diminuire i disturbi ad alta frequenza, anche se non sembra funzionare molto!
Sto utilizzando un Arduino uno per le prove ma punto di usare una scheda più veloce in futuro (per questo il segnale è connesso a 3.3v e non a 5v) e l'alimentazione della scheda è presa dal cavo USB.
Il codice è quello di seguito ma non credo sia quello l'incriminato!
//#define test
const byte interruptPin = 2;
volatile long deltaT = 0.0;
volatile long currentMicros = 0;
volatile long previousMicros = 0;
volatile bool updateDisplay =true;
unsigned long RPM = 0;
String RPM_Display;
short RPM_DisplayLength;
double currentMillis = 0;
double previousMillis = 0;
void setup() {
Serial.begin(9600);
pinMode(interruptPin, INPUT_PULLUP);
pinMode(13,OUTPUT);
attachInterrupt(digitalPinToInterrupt(interruptPin), sparkPulse, FALLING);
delay(1000);
}
void loop() {
currentMillis = millis();
if(currentMillis - previousMillis > 150){
previousMillis = currentMillis;
if(updateDisplay){
RPM = 60*1/(double(deltaT)/1000000);// formula: 60*(1/(delta t[s]))
RPM_Display = String(RPM);
RPM_DisplayLength = RPM_Display.length();
if(RPM_DisplayLength > 3){
RPM_Display = RPM_Display.substring(0, RPM_DisplayLength - 3) + "." + RPM_Display.substring(RPM_DisplayLength - 3);
}
RPM_Display = RPM_Display + " Rpm";
Serial.println(RPM_Display);
}
digitalWrite(13,updateDisplay);
updateDisplay = false;
}
#ifdef test
delayMicroseconds(1500);
sparkPulse();
#endif
}
void sparkPulse() {
currentMicros = micros();
deltaT = (currentMicros - previousMicros);
previousMicros = currentMicros;
updateDisplay = true;
}
Grazie mille per l'aiuto e scusate se ho scritto qualche "fesseria" non sono molto bravo con l'elettronica!