Ciao a tutti, sono nuovo nel forum ed ho iniziato ad usare Arduino da poco, tuttavia sono a corto di tempo e necessiterei di qualche delucidazione.
Ho fatto una ricerca tra i vari contagiri RPM ma non riesco a trovare una risposta all'idea del software adeguata.
Tanto per iniziare, ho realizzato il seguente circuito: Michael McKGyver McKinley / Arduino_Tachometer
l'ho testato con il codice presente sotto e funziona, tuttavia non riesce a mantenere un numero costante di giri, ma ha un errore abbastanza alto( a 2500 giri, varia +/- di circa 100 giri).
Invece di contare il numero di impulsi in un certo intervallo, ritengo sia più preciso misurare il tempo trascorso tra due impulsi, ed ho provato ad utilizzare il pulseIn.
Inserendo il seguente sketch e testando con un fan F6015B12LY (9 pale, max 3000 giri/min), la durata tra un segnale ad un'altro è assurda (+1000000 us suppongo); inoltre non riesce a leggere i giri/min.
Lo sketch è il seguente, cos'è che sto sbagliando?
è sensato inoltre dire che contando gli la durata tra due impulsi, la misura dovrebbe essere più precisa?
//Pulsein code for rpm counting
//Define Variables
const float pi = 3.14;
unsigned long holes__angle = pi/2;
unsigned long duration; //
unsigned long rad_sec; //
unsigned long rpm; //
unsigned long timeout = 10000000; //
int ledPin = 2; // LED connected to digital pin (changes state with each tic of code wheel)
int statusPin = 13; // LED connected to digital pin (changes state with each tic of code wheel)
void setup()
{
Serial.begin(115200);
Serial.println("CLEARDATA"); //clean excel spreadsheet
Serial.println("LABEL,Time,Duration,RPM"); //clean excel spreadsheet
pinMode(statusPin, OUTPUT); //
pinMode(ledPin, INPUT); //
}
void loop()
{
duration=pulseIn(ledPin,HIGH,timeout);
rad_sec=(holes__angle*1000000)/duration;
rpm=(rad_sec*60)/(2*pi);
Serial.print("DATA,TIME,");Serial.print(duration);Serial.println(rpm);
}