Contagiri Amp_mode - IMPLEMENTAZIONE SOFTWARE
Ecco
lo skecth per Arduino Nano per realizzare il contagiri
digitale in amp_mode. Alcune
costanti del
programma fanno riferimento alle caratteristiche del motore e al
circuito di condizionamento.che
dovranno essere inserite nel codice al fine di avere una stima più
accurata
possibile dei giri in funzione del motore usato.
I
parametri da inserire sono:
-
RPM_max = Numero massimo
giri da recuperare dai dati di targa del motore;
-
VDC_max = tensione
massima all'ingresso del partitore;
-
I valori dei resistori R1
e R2 per determinare il
fattore di
partizione p.
Il
display visualizzerà nella prima rifa il valore degli RPM stimati
mentre
nella seconda riga visualizzerà in sequenza la Tensione VAC (
uscirà del sensore) VDC (tensione ingresso partitore) e VIN ( tensione
ingresso Arduino). Queste tensioni possono essere escluse dalla
visualizzazione commentando le relative righe.
/*PROGRAMMA DIG_RMP MODALITA' AMPIEZZA ( AMP_MODE)
Versione 1.0 del 27/07/2020
AUTORE: MICROST
Misura dei giri motore di una lavatrice misurando l'ampiezza del segnael in uscita al sensore tachimetrico
Lo schema di riferimento e' vsionabile al seguente link: https://www.microst.it/Progetti/dig_rpm_3.htm
Nella prima riga del display e' visualizzato il valore degli RPM mentre nella seconda riga
in sequenza VIN, VDC, VAC ( vedi schema per il significtao delle sigle).
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const byte ADDRESS = 0x27; // indirizzo di base per interfaccia I2c
const long RPM_max = 13000; //numero di giri massimi ( vedi targa motore)
const long VDC_max = 41.2; // tensione uscita ingresso partitore per RPM_MAX
const long R1 = 72000, R2 = 10000; // resitori nel partitore resistivo 1000*(1+R1/R2)
const long p = (1+R1/R2);
const long Krpm = p*RPM_max/VDC_max;
long meas=0, rpm=0, Vin, VAC, VDC;
LiquidCrystal_I2C lcd(0x27, 16, 2);
;
void setup() {
// Set pin functions & enable internal pull-up resistors
// 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
}
// Acquisisce il valore di tensione dal pin A0 per 500 volte prendendone il massimo ( variabile Vin_max)
// e valuta il valore dei RPM = RPM_max* Vin_max /1023
void loop() {
Vin=0;
for (int i=0; i<500; i++) {
meas= analogRead(A0);
if (meas > Vin) { Vin = meas;} // prende il valore massimo dell'ampiezza di Vin
}
delay(500); // questo valore può essere cambiato per cambiare la frequenza della misura
if ( Vin >=4) {rpm= Krpm* Vin *5 /1023;} else rpm=0; // filtra il rumore per bassissimo valore di VIN= 4/1023*5=20mV
lcd.setCursor (0,0);
lcd.print("RPM = ");
lcd.print(rpm);
lcd.print(" ");
// se non vuoi visualizzre la seconda riga commenta con // le righe seguenti fino al commento fine seconda riga
lcd.setCursor (0,1);
lcd.print(Vin * 5.00 /1023); // visualizza il valore stimato della tensione VIN all'ingresso del ADC
VDC=p*(Vin * 5.00 /1023);
lcd.setCursor (5,1);
lcd.print(p*(Vin * 5.00 /1023));
lcd.setCursor (11,1);
lcd.print((VDC+1.2)/1.414); // visualizza il valore efficace stimato della tensione VAC sul sensore
// fine seconda riga//
}