CONTAGIRI FREQ_MODE: IMPLEMENTAZIONE SOFTWARE
Ecco lo sketch per Arduino Nano per realizzare
il contagiri
digitale in freq_mode. Alcune
costanti del
programma fanno riferimento alle caratteristiche del motore che
dovranno essere inserite al fine di avere una stima più accurata
possibile dei giri in funzione del motore usato. Il parametro da
inserire e' il numero N
degli avvolgimenti dello statore. ( nel codice N = 8).
Il
segnale proveniente dal circuito di condizionamento è applicato al pin
D2 a cui e' associato un interrupt quando si verifica un fronte
di salita. Questi eventi sono contati nell'ambito di una finestra
temporale di 1ms. Il display visualizzerà nella prima riga il valore
istantaneo dei numeri di giri seguito dal valore medio ( variabile favg
definisce il numero di letture per la media - default favg=5).
Nella seconda riga (che si può anche non
visualizzare commentando le righe del codice relative) visualizza la
frequenza FIN del segnale in
ingresso.
/*PROGRAMMA DIG_RMP MODALITA' FREQUENZA ( FREQ_MODE)
Versione 1.0 del 27/07/2020
AUTORE: MICROST
Misura dei giri motore di un motore di lavatrice leggendo la frequenza del segnale in uscita al sensore tachimetrico
Lo schema di riferimento e' visionabile al seguente link: https://www.microst.it/Progetti/dig_rpm_6.htm
Nella prima riga del display e' visualizzato il valore degli RPM istantanei seguito da quello medio
Nella seconda riga e' visualizzato la misura FIN della frequenza del segnale in ingresso.
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const byte ADDRESS = 0x27;
int N=8; // numero di impulsi per giro
const byte SENSOR = 2; // pin 2 (int0) ingresso per segnale frequenza
float rev=0,FREQ;
long rpm,rpm2=0;
int oldtime=0;
int times,cnt ;
int favg=5; // numero di campioni per eseguire la media
LiquidCrystal_I2C lcd(0x27, 16, 2);
void isr() //interrupt service routine
{
detachInterrupt(digitalPinToInterrupt(2));
rev++;
delayMicroseconds(5);
attachInterrupt(digitalPinToInterrupt(2),isr,RISING);
}
void setup() {
// Set pin functions & enable internal pull-up resistors
pinMode(SENSOR, INPUT_PULLUP);
// Initialize LCD
Wire.begin (); // attiva la routine della comunicazione I2C
lcd.begin(16, 2); // attiva la routine della display I2C
lcd.backlight(); // accende la luce di backligth
lcd.clear(); // pulisce il display
lcd.setCursor (0,0); // sposta il cursore nella posizione ( C=0, R=0)
lcd.print(" CONTAGIRI "); // scrive la stringa sul display
lcd.setCursor (1,1); // sposta il cursore nella posizione ( C=1, R=1)
lcd.print(" DIGITALE "); // scrive la stringa sul display
delay (2000); // aspetta un tempodi 1000ms = 1s
lcd.clear(); // pulisce il display
lcd.setCursor (0,0); // sposta il cursore nella posizione ( C=0, R=0)
lcd.print(" MICROST"); // scrive la stringa sul display
lcd.setCursor (1,1); // sposta il cursore nella posizione ( C=1, R=1)
lcd.print("www.microst.it"); // scrive la stringa sul display
delay (1000); // aspetta un tempodi 1000ms = 1s
lcd.clear(); // pulisce il display
attachInterrupt(digitalPinToInterrupt(2),isr,RISING); //attaching the interrupt
}
void loop() {
times=millis()-oldtime; //finds the time
if (times >= 1000) {
oldtime=millis(); //saves the current time
detachInterrupt(digitalPinToInterrupt(2)); //detaches the interrupt
rpm=(rev/times)*60*1000/N; //calculates rpm
FREQ=1000*rev/times;
rev=0;
cnt=cnt+1;
rpm2=rpm+rpm2;
lcd.setCursor(0, 0);
lcd.print("RPM= ");
lcd.print(rpm); //scrive il valore istantaneo
lcd.print("/");
if (cnt==favg) {lcd.print(rpm2/favg); lcd.print(" "); rpm2=0; cnt=0;} // plotta il valore medio
lcd.setCursor(0, 1);
lcd.print("FIN= ");
lcd.print(FREQ);
lcd.print(" Hz ");
//}
attachInterrupt(digitalPinToInterrupt(2),isr,RISING);
}
}