CONTAGIRI DIGITALE PER MOTORI DI LAVATRICE - 7



ITALIANO   ENGLISH    ESPAÑOL

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);
     }

}