Vai al contenuto
PLC Forum


Misuratore Rpm


roberto8303

Messaggi consigliati

come da titolo posto questo codice di arduino

const unsigned long unsecondo= 1000;
unsigned long ritardo = 0;
volatile unsigned long impulsi= 0;
void setup()
{
Serial.begin(9600);
attachInterrupt(0, isr, FALLING);
}
void isr()
{
impulsi++;
}
void loop()
{
if((millis() - ritardo) >= unsecondo)
{
unsigned long RPM = (impulsi*60);
Serial.print(RPM);
Serial.println(" RPM");
impulsi= 0;
ritardo= millis();
}
}
il codice è funzionante ma è piu preciso utilizzare un timer con scadenza un secondo o millis è influenzato dal ritardo del ciclo scansione?
Link al commento
Condividi su altri siti


dipende dalla temporizzazione che vuoi avere ....c'e 'anche in micros() che prende i microsecondi trascorsi anziche i millisecondi

Il fatto di usare interrupt a tempo non e' solo un fatto di tempo ma di precisione e sincronismo nelle regolazioni

Nel tuo caso se il codice e' solo quello che hai postao va bene anche cosi , tanto il ciclo di scansione e' bassissimo e sicuramente inferiore a un secondo , e anche a 1 millisecondo

Poi se e' solo una visualizzazione che calcola gli rpm va piu che bene

l'errore massimo che puoi avere e' +/- il tempo di ciclo di scansione .Pero' puoi aumentare la precisione facendo il calcolo ogni ciclo di scansione che lo conosci , col rischio di avere pochi impulsi del motore

Direi che un secondo va piu che bene , vedo ad ogni secondo trascorso fai il calcolo eed azzeri il contatore , puoi anche aggiugere una media calcolata ogni 10 sec o 15 sec

Link al commento
Condividi su altri siti

si ci sono i timer hardware, walter ora ho alimentato il pin 2 con un generatore di onda quadra con 100 hz ed ottengo una lettura di 6000 6100rpm quindi non so se questi 100 rpm sono dovuti al programma o al generatore... ma siccome ho controllato con l oscilloscopio e la frequenza sembra abbastanza stabile penso sia proprio il programma, posso provare con micros per vedere se migliora... altrimenti provero con il timer con scadenza un secondo.

Link al commento
Condividi su altri siti

Se la base dei tempi è cruciale, invece di usare i ritardi, usa appunto i timer hardware: essendo esterni alla cpu, non vengono influenzati dal resto del programma, e quindi sono molto più precisi.

Link al commento
Condividi su altri siti

il fatto che ti dia 6100 invece di 6000 puo' essere legato al sincronismo del calcolo pero' e' strano perche' se verifichi il tempo ciclo di arduino e' sicuramente inferiore al tempo di campionamento , chiamiamolo cosi .

Se avevi un generatore di funzioni , pero ' se con l'oscilloscopio dici che il segnale e' stabile ....considera che nel frattempo che fai i calcoli e che azzeri il cotnatore potrebbe arrivarti un segnale di conteggio

Nel senso che se ti arriva un segnale di conteggio e dopo vai ad azzerarlo lo perdi ....

Prova a fare il calcolo nel interrupt dove conti , tenendo in considerazione il tmepo ciclo ....dalle prove che avevo fatto sui tempi , la serial.print , la digital read ect mangiano parecchio tempo e sono asincrone

La serial.print a 9600 si mangia addirittura 90 mS .... prova a memorizzare i dati in un array e stampali una votla sola alla fine

comunque il dato non discosta molto dalla realtà ,se fai una media vedrai che lo prendi in pieno

Per farla breve il calcolo lo devi fare in un interrupt timer anche per questioni di priorità ed evitare di perdere impulsi o di contarli in eccedenza

Poi facci sapere

Modificato: da walterword
Link al commento
Condividi su altri siti

Ah capito sai cosa posso provare ad aumentare a 115200la velocita della comunicazione seriale e vedere come va...poi provo a spostare i conti nell interrupt come mi auggerisci

Link al commento
Condividi su altri siti

io uso sempre 115200 sulla seriale , i tempi si abbassano da 90ms a 2 ms

Puoi anche sganciare l'interrupt con deattach prima di fare i calcoli .Pero prova a fare i calcoli nell'interrupt

Modificato: da walterword
Link al commento
Condividi su altri siti

raga, se ci sono i timer hardware è inutile ricorrere a mille magheggi per usare a tutti i costi i ritardi, il cui scopo non è mai stato quello di fornire temporizzazioni precise... poi fate come credete :)

Link al commento
Condividi su altri siti

stiamo ragionando e supponendo .....il fatto di mettere il timer per avere l'interrupt e fare il conteggio non e' risolutivo

Secondo me è molto piu utile sganciare l'interrupt con il deattach e poi fare i calcoli e dopo riattivare l'interrupt e questo lo devi fare anche se usi il timer per fare i calcoli ...I mean quando entri nel timer per calcolare la velocità devi sganciare comunque l'interrupt sul segnale che conta ;) altrimenti conti per nulla o in piu , visto che il problema e' un contaggio superiore di quello che dovrebbe essere ...sganciare l'interrupt sul conteggio serve per risincronizzare il conteggio

Modificato: da walterword
Link al commento
Condividi su altri siti

Roberto non si fa così per fare un contatore preciso con Arduino.

Ci sono già librerie adatte per usare il contatori di Arduini come misuratori di frequenza e di periodo.

Se oggi trovo il tempo ti mettoi riferimenti ed un esempio.

Io l'ho provato e funziona con la precisione dell'oscillatore quarzato della scheda.

Link al commento
Condividi su altri siti

/* Programma di prova per display LCD
   con interfaccia I2C da PCF8574.
   Simisura la frequenza di un segnale
   sul pin di ingresso del timer1
   Variante di Livio S. Orsini 19 - 12 -2014*/
#include <Wire.h> 
#include <PCF8574_HD44780_I2C.h>
#include <FreqCount.h>

// Indirizzo 0x27, 16 caratteri, 2 linee
PCF8574_HD44780_I2C lcd(0x27,16,2); //Libreiria Testato

unsigned long  rifvel = 0;
unsigned long  rifvel2 = 0;
int cnt1 = 1;
int inByte = 0;
int freq = 0;
bool stat = LOW;

void setup()
{
  FreqCount.begin(1000);
  lcd.init();           // LCD Initialization              
  lcd.backlight();      // Backlight ON
  lcd.clear();          // Clear the display
  
  lcd.setCursor(0,0);   // Set the cursor to col 0, row 0
  lcd.print("Ciao");   // Print the first word
  lcd.setCursor(6,1);   // Set the cursor to col 0, row 1
  lcd.print("Livio!");  // Print the second word
  lcd.setCursor(0,0);   // Set the cursor to col 0, row 0
  lcd.print("Frequenza in Hz ");   // Print the first word
  lcd.setCursor(0,1);   // Set the cursor to col 0, row 0
  lcd.print("Vel. 2 = 0000000");   // Print the first word
  Serial.begin(9600);
}
void loop()
{
    if (FreqCount.available()) 
 {
       unsigned long count = FreqCount.read();
       lcd.setCursor(9,1);   // Set the cursor to col 1, row 9
       lcd.print("       "); // Pulisci il dato
       lcd.setCursor(9,1);   // Set the cursor to col 1, row 9
       lcd.print(count);     // Scrivi valore di frequenza
  }

}

La libreria FreqCount è reperibile sul webb; nel caso non la trovaste cercherò di caricarla io.

Invece del display LCD si può buttare l'uscita sulla seriale.

Il parametro di FreqCount.begin(1000) è il valore della base tempi espressa in ms.

Link al commento
Condividi su altri siti

#include <FreqCount.h>
void setup() {
Serial.begin(115200);
FreqCount.begin(1000);
}
void loop() {
if (FreqCount.available()) {
unsigned long count = FreqCount.read();
Serial.print(count);
Serial.print(" ");
Serial.print("RPM");
Serial.print(" ");
Serial.println(count*60);
}
}
eccolo qua funziona bene, ma nel caso in cui ho un disco diametro 200mm e sopra questo disco sul diametro esterno ho un perno di 8mm che ruota a 3000rpm con un sensore proximity di 10mm riesco a leggere i conteggi? o devo avere un segnale per forza on per tot periodo e off per tot periodo come l onda quadra?che sto generando adesso per prova..
Link al commento
Condividi su altri siti

avrei preferito un qualcosa fatto in casa ....comn le librerie bisogna sempre stare attenti ....comunque se il programma consiste nel contare gli rpm va bene

Link al commento
Condividi su altri siti

Roberto non ho ben capito cosa vuoi fare.

Io l'ho provato sino ad una frequenza di circa 1 Mz con onda rettanfolare.

Il segnale prima di entrare nel pin 11 di arduino viene condizionato da uno squadratore fatto con un 74HC14, che un invertitore con schmit trigger.

Devi vedere all'oscilloscopio che segnale esce dal tuo sensore. Soprattuto è necessario che tu lo "pulisca" da evntuali ringings ed oscillazioni che potrebbero causare false letture.

avrei preferito un qualcosa fatto in casa ...

Walter se hai bisogno di una vite da 3mA cosa fai? la compri dal ferramenta o compri la filiera, il trafilato e te la filetti?

Io non riscaldo nemmeno l'acqua, se ho la possiiblità di averla già calda. ;)

Le prove si fanno proprio per evitare sorprese.

Comunque nessuno ti vieta di riscirverti tutti i drivers a basso livello o quasi.

In fin dei conti si tratta solo di leggere al volo un contatore a tempo fisso e di azzerarne il conteggio.

Lo feci per i PIC scrivendolo in "C". Per Atmel non è molto differente, solo che avendolo trovato bello e pronto non mi son rotto i maroni a rifarlo.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Inviato Oggi, 11:02

siamo tutti in attesa di questa chicca ..... :smile: ...che spero non arrivi a natale :P

Inviato Oggi, 11:40

xxx

Altro che Natale , quando vuole ..... :thumb_yello:

Link al commento
Condividi su altri siti

livio ti mostro uno schizzo che ho fatto al volo, devo sapere se puo leggere l impulso che arriva dal sensore ad ogni rivoluzione quindi si ha un piccolo livello on e poi il resto del disco tutto off

606397785c9709c945d18015847678f1.JPG

Link al commento
Condividi su altri siti

Ti conviene visualizzare l'impulso all'oscilloscopio per verificarne la forma, specialmente alla massima velocità,

Io comunque uno squadratore fatto con un schmit trigger o con un monostabile lo metterei.

Link al commento
Condividi su altri siti

bravo Livio ....no no tranquillo che anche io uso quello che c'e' se posso .

Intendevo dire che la libreria con la parte hw sarebbe buona per leggere un encoder o no ? Oppure leggere gli impulsi , senza hw , di un generatore di onde quadre.....

Vale solo per il timer 1 di arduino uno immagino ....

Assomiglia un po alla scheda encoder pizza-micro :whistling:

Modificato: da walterword
Link al commento
Condividi su altri siti

Per leggere un encoder hai bisogno di 2 contatori, uno per avanti e l'altro per indietro; necessiti anche di un discriminatore di senso di rotazione esterno per selezionare il contatore. Prorpio come quello del "pizza". Poi via Sw estrai la quota sottraendo i conteggi indietro da quelli avanti, o viceversa.

Stavo ipotizzando di fare una prova con Arduino Mega che ha più contatori da 16 bits.

Io l'ho provato, quel programmino, con un oscillatore esterno fino a circa 1 MHz con base tempi di 1". In parallelo effettuavo la misura con un altro contatore fatto con un PIC e le misure erano praticamente coincidenti.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...