roberto8303 Inserito: 12 giugno 2015 Segnala Share Inserito: 12 giugno 2015 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 More sharing options...
walterword Inserita: 12 giugno 2015 Segnala Share Inserita: 12 giugno 2015 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 More sharing options...
Darlington Inserita: 12 giugno 2015 Segnala Share Inserita: 12 giugno 2015 Su arduino non ci sono i timer hardware? Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 12 giugno 2015 Autore Segnala Share Inserita: 12 giugno 2015 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 More sharing options...
Darlington Inserita: 12 giugno 2015 Segnala Share Inserita: 12 giugno 2015 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 More sharing options...
roberto8303 Inserita: 12 giugno 2015 Autore Segnala Share Inserita: 12 giugno 2015 Infatti hai ragione ho usato micros e non cambia molto, lo faro con il timer... Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 12 giugno 2015 Segnala Share Inserita: 12 giugno 2015 (modificato) 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: 12 giugno 2015 da walterword Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 12 giugno 2015 Autore Segnala Share Inserita: 12 giugno 2015 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 More sharing options...
walterword Inserita: 12 giugno 2015 Segnala Share Inserita: 12 giugno 2015 (modificato) 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: 12 giugno 2015 da walterword Link al commento Condividi su altri siti More sharing options...
Darlington Inserita: 12 giugno 2015 Segnala Share Inserita: 12 giugno 2015 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 More sharing options...
walterword Inserita: 12 giugno 2015 Segnala Share Inserita: 12 giugno 2015 (modificato) 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: 12 giugno 2015 da walterword Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 13 giugno 2015 Segnala Share Inserita: 13 giugno 2015 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 More sharing options...
walterword Inserita: 13 giugno 2015 Segnala Share Inserita: 13 giugno 2015 siamo tutti in attesa di questa chicca ..... ...che spero non arrivi a natale Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 13 giugno 2015 Segnala Share Inserita: 13 giugno 2015 /* 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 More sharing options...
roberto8303 Inserita: 13 giugno 2015 Autore Segnala Share Inserita: 13 giugno 2015 https://www.pjrc.com/teensy/td_libs_FreqCount.html ottimo Livio qui c è la libreria Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 13 giugno 2015 Autore Segnala Share Inserita: 13 giugno 2015 #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 More sharing options...
walterword Inserita: 13 giugno 2015 Segnala Share Inserita: 13 giugno 2015 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 More sharing options...
Livio Orsini Inserita: 13 giugno 2015 Segnala Share Inserita: 13 giugno 2015 (modificato) 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: 13 giugno 2015 da Livio Orsini Link al commento Condividi su altri siti More sharing options...
gabri-z Inserita: 13 giugno 2015 Segnala Share Inserita: 13 giugno 2015 Inviato Oggi, 11:02 siamo tutti in attesa di questa chicca ..... ...che spero non arrivi a natale Inviato Oggi, 11:40 xxx Altro che Natale , quando vuole ..... Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 13 giugno 2015 Autore Segnala Share Inserita: 13 giugno 2015 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 Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 13 giugno 2015 Segnala Share Inserita: 13 giugno 2015 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 More sharing options...
walterword Inserita: 13 giugno 2015 Segnala Share Inserita: 13 giugno 2015 (modificato) 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 Modificato: 13 giugno 2015 da walterword Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 14 giugno 2015 Segnala Share Inserita: 14 giugno 2015 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora