Salve a tutti, e da qualche mese che cerco di realizzare una centralina che possa gestire un motore monocilindrico (e in futuro bicilindrico) per quel che riguarda la parte di anticipo scintilla.
Mi sono guardato intorno ma ho capito che non c'è niente di meglio di questo, peccato che io non riesca a farlo funzionare.
http://forum.arduino.cc/index.php?topic=157511.0
Vi racconto un po' le varie fasi della mia esperienza:
Ho realizzato il circuitino che viene riportato in terza pagina, e funziona bene.
http://forum.arduino.cc/index.php?action=dlattach;topic=157511.0;attach=50427
Per provare il sensore ad effetto hall montato sul circuito ho usato un listato che ho pescato in rete e fa il suo dovere.
A seguire ho fatto il test del mosfet sul circuito, pilotandolo con un semplice sketch di quelli che fanno lampeggiare il led al pin 13 dell'Arduino UNO, abbassando drasticamente i delay.
In pratica funziona tutto singolarmente, ma quando carico questo, non mi va nulla. Cosa fare?
#include <StopWatch.h>
const byte led1 = 13; // cilindri 1 e 4
const byte led2 = 12; // cilindri 2 e 3
const byte pin2 = 2; // interrupt startt
const byte pin3 = 3; // interrupt stopp
volatile int statestartt = HIGH; // stato normale startt
volatile int statestopp=HIGH; // stato normale stopp
StopWatch sw_micros(StopWatch::MICROS); // timer durata dente
StopWatch sw_micros1(StopWatch::MICROS); // timer attesa 1 e 4
StopWatch sw_micros2(StopWatch::MICROS); // timer attesa 2 e 3
int time = 0; //valore durata dente microsecondi
int ritardo = 90; //gradi ritardo da fine dente
int tritardo1 = 0; //valore durata ritardo in microsecondi 1 e 4
int tritardo2 = 0; //valore durata ritardo in microsecondi 2 e 3
int rpm = 0; //numero giri
int gradidente = 40; //ampiezza dente in gradi
void setup() {
Serial.begin(9600); //comunicazione seriale
pinMode(led1, OUTPUT); //bobina 1 e 4
pinMode(led2, OUTPUT); //bobina2 e 3
pinMode(pin2, INPUT_PULLUP);
pinMode(pin3, INPUT_PULLUP);
attachInterrupt(0, startt, FALLING); //interrupt in inizio dente
attachInterrupt(1, stopp, RISING); //interrupt fine dente
}
void loop()
{
//se il dente è iniziato
if(statestartt == LOW){
sw_micros.start();//inizia a contare durata dente
statestartt=HIGH;// reimposta startt
}
//se il dente è finito
if(statestopp == LOW) {
time=sw_micros.elapsed(); //memorizza durata dente
sw_micros1.start(); //inizia a contare da fine dente per 1 e 4
sw_micros2.start(); //inizia a contare da fine dente per 2 e 3
Serial.println(time); //stampa durata dente
statestopp = HIGH; //reimposta stopp
sw_micros.reset(); //azzera timer durata dente
tritardo1=(time/gradidente)*ritardo; //calcola durata ritardo in microsecondi per 1 e 4
tritardo2=(time/gradidente)*(ritardo+180); //calcola durata ritardo in microsecondi per 2 e 3
rpm=60000000/((time/gradidente)*360); //calcolo rpm
Serial.println(rpm); //stampo rpm
}
//se il tempo che è passato dalla fine del dente è maggiore della durata del ritardo
if(sw_micros1.elapsed() > tritardo1){
sw_micros1.reset(); //azzera timer ritardo
digitalWrite(led1, HIGH); //accendi led
delayMicroseconds(500);
digitalWrite(led1, LOW); //spegni led
}
//se il tempo che è passato dalla fine del dente è maggiore della durata del ritardo
if(sw_micros2.elapsed()>tritardo2){
sw_micros2.reset(); //azzera timer ritardo
digitalWrite(led2, HIGH); //accendi led
delayMicroseconds(500);
digitalWrite(led2, LOW); //spegni led
}
} // End Loop
void startt()//interrupt startt
{
statestartt = !statestartt; //inverti startt
}
void stopp()//interrupt stopp
{
statestopp = !statestopp; //inverti stopp
}