Pages: [1] 2   Go Down
Author Topic: precisione arduino  (Read 2635 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

salve a tutti....
nei miei numerosi esperimenti, mi domandavo... ma che precisione ha arduino [in particolare millis()]?
ho provato a fare un piccolo sketch per simulare un orologio

Code:
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 7);

unsigned int secondi = 0;
  unsigned int minuti = 0;
  unsigned int ore = 0;
  unsigned int temp = 0;
void setup() {
 
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  temp=millis();
 
}

void loop() {
  secondi=millis()-temp;
  secondi=secondi/1000;
  if (secondi >= 60)  {minuti++; secondi=0; temp=millis();}
  if (minuti >= 60)  {ore++; minuti=0;}
  if (ore >= 24)  {ore=0;}
 
  // print the number of seconds since reset:
  lcd.clear();
  lcd.print(ore);
  lcd.print(":");
  lcd.print(minuti);
  lcd.print(":"); 
  lcd.print(secondi);
 
  delay(500);
}

l' ho fatto andare per un ora attaccato a un carica-usb (quindi non dovrebbero esserci quegli effetti di rallentamento dovuti all' uso con l' usb del pc)  e il risultato è che DOPO UN ORA, HA PERSO GIA' 5 SECONDI..... uso arduino 2009 è normale? è il quarzo che è rovinato o di scarsa qualità?
Logged

Parma
Offline Offline
Edison Member
*
Karma: 20
Posts: 2361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

L'atmega328 usa un risuonatore ceramico, il quarzo è per il chip di comunicazione con la seriale
Secondo me è normale un ritardo del genere..
Logged

Dueville (VI)
Offline Offline
Edison Member
*
Karma: 28
Posts: 1745
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

dovresti usare un RTC  smiley-mr-green
Logged

Arduino UNO r3, Arduino MEGA 1280, adafruit motor shield, bluetooth module, enc28j60 shield.
Ultimi acquisti: un sacco di componenti elettronici, ATTEN AT 8586

Offline Offline
Sr. Member
****
Karma: 2
Posts: 328
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

nell'arduino 2009 non c'è un risonatore, ma un quarzo....nella UNO c'è il risonatore...
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok... quindi è normale un ritardo del genere...
voi dite che in arduino UNO c'è un risonatore ceramico...questo vuol dire che è più preciso?
PS:questo vuol dire che quando faccio diventare stand-alone arduino UNO non è come il 2009 che basta che ci metto il quarzo e i 2 condensatori, ma ci devo mettere qualcos' altro?domando questo perchè l' atmega è sempre quello mi pare


PPS: avete qualche link per farmi capire meglio cosa sono questi RTC? sono degli integrati che fanno da orologio ma hanno una precisione più alta? come li interfaccio con arduino? costano tanto?
« Last Edit: August 03, 2012, 06:26:53 am by jacock » Logged

Offline Offline
Edison Member
*
Karma: 28
Posts: 2031
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Costano poco,facili da interfacciare e ti danno maggiore precisione!
http://www.ebay.com/itm/New-I2C-RTC-DS1307-AT24C32-Real-Time-Clock-Module-For-Arduino-Uno-AVR-ARM-PIC-/280929023906?pt=LH_DefaultDomain_0&hash=item4168acb7a2
trovi molti esempi di codice e librerie in giro smiley-wink
Logged

"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok... grazie mille....
mi bastava sapere che non fosse magari il mio codice poco snello a fargli fare il ritardo
Logged

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok... grazie mille....
mi bastava sapere che non fosse magari il mio codice poco snello a fargli fare il ritardo

Secondo me quello contribuisce non poco!
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9183
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

l' ho fatto andare per un ora attaccato a un carica-usb (quindi non dovrebbero esserci quegli effetti di rallentamento dovuti all' uso con l' usb del pc)  e il risultato è che DOPO UN ORA, HA PERSO GIA' 5 SECONDI..... uso arduino 2009 è normale? è il quarzo che è rovinato o di scarsa qualità?

Mettendo da parte per un attimo le considerazioni sulla reale precisione del quarzo/risuonatore montato sulla 2009/UNO, si va da +/- 50 ppm fino a +/-250 ppm (ovvero un errore reale compreso tra +/- 2 minuti/mese e +/- 10 minuti/mese), il vero problema è che la millis non è 1 ms esatto.

In Wiring.c viene definita in questo modo:

Code:
// the prescaler is set so that timer0 ticks every 64 clock cycles, and the
// the overflow handler is called every 256 ticks.
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256))

Ovvero il Timer0 è settato con un prescaler 1:64 in modo da ottenere un count ogni 4us, dato che la millis funziona contando gli overflow abbiamo 256*4 = 1024 us per ogni count della millis e non 1000 come porta a pensare il nome della funzione.
Tradotto in tempi, ipotizzando che il quarzo sia da 16 MHz precisi, vuol dire che quando la millis segna 1024 ms in realtà sono passati solo 1000 ms.


Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 527
Posts: 12345
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

l' ho fatto andare per un ora attaccato a un carica-usb (quindi non dovrebbero esserci quegli effetti di rallentamento dovuti all' uso con l' usb del pc)  e il risultato è che DOPO UN ORA, HA PERSO GIA' 5 SECONDI..... uso arduino 2009 è normale? è il quarzo che è rovinato o di scarsa qualità?

Mettendo da parte per un attimo le considerazioni sulla reale precisione del quarzo/risuonatore montato sulla 2009/UNO, si va da +/- 50 ppm fino a +/-250 ppm (ovvero un errore reale compreso tra +/- 2 minuti/mese e +/- 10 minuti/mese), il vero problema è che la millis non è 1 ms esatto.

In Wiring.c viene definita in questo modo:

Code:
// the prescaler is set so that timer0 ticks every 64 clock cycles, and the
// the overflow handler is called every 256 ticks.
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256))

Ovvero il Timer0 è settato con un prescaler 1:64 in modo da ottenere un count ogni 4us, dato che la millis funziona contando gli overflow abbiamo 256*4 = 1024 us per ogni count della millis e non 1000 come porta a pensare il nome della funzione.
Tradotto in tempi, ipotizzando che il quarzo sia da 16 MHz precisi, vuol dire che quando la millis segna 1024 ms in realtà sono passati solo 1000 ms.
chissà se di questa particolarità ha tenuto conto Leo nel suo SWrtc (o RTCsw, ora non ricordo bene...)?
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6993
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Leo usa una sua routine per calcolare l'overflow del timer, non quello integrato nel codice di Arduino quindi soffre meno (anzi non soffre proprio) di questo problema.
Il problema è che si vuole aumentare la precisione l'unica cosa è passare ai quarti termo-compensati... ma costano.
20mhz 0,2ppm --> http://it.rs-online.com/web/p/oscillatori/7293338/
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

salve a tutti....


l' ho fatto andare per un ora attaccato a un carica-usb (quindi non dovrebbero esserci quegli effetti di rallentamento dovuti all' uso con l' usb del pc)  e il risultato è che DOPO UN ORA, HA PERSO GIA' 5 SECONDI..... uso arduino 2009 è normale? è il quarzo che è rovinato o di scarsa qualità?

5 secondi all'ora  sono una mostruosita per qualsiasi quarzo  di solito ci si mettono vicino dei condensatori  variabili di qualche pf e si "ritocca" la frequenza  del quarzo alla temperatura operativa,  al max un quarzo deve spostarsi di 1 secondo a giorno

altro sistema per mantenere la precisione in maniera incredibile e quella di mantenere il quarzo a una temeratura elevata stabile es 50 gradi  con un termostato
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Forum Administrator
Offline Offline
God Member
*****
Karma: 52
Posts: 639
I find plain exciting
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao

Quarzo o risuonatore c'entrano fino ad un certo punto.
La funzione millis lavora con un interrupt che viene generato dal timer di cui ha già detto astrobeed.
Può darsi che questo interrupt non venga eseguito sempre (ci sono funzioni che disabilitano gli interrupt e altre funzioni basate su interrupt che potrebbero influire, tipo la seriale)

Se si vuole precisione bisogna usare un RTC

m
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao

Quarzo o risuonatore c'entrano fino ad un certo punto.
La funzione millis lavora con un interrupt che viene generato dal timer di cui ha già detto astrobeed.
Può darsi che questo interrupt non venga eseguito sempre (ci sono funzioni che disabilitano gli interrupt e altre funzioni basate su interrupt che potrebbero influire, tipo la seriale)

Se si vuole precisione bisogna usare un RTC

m

Mamma mia che onore... massimo in persona che scrive in un mio topic  smiley-surprise smiley-surprise smiley-surprise smiley-surprise

l' ho fatto andare per un ora attaccato a un carica-usb (quindi non dovrebbero esserci quegli effetti di rallentamento dovuti all' uso con l' usb del pc)  e il risultato è che DOPO UN ORA, HA PERSO GIA' 5 SECONDI..... uso arduino 2009 è normale? è il quarzo che è rovinato o di scarsa qualità?

Mettendo da parte per un attimo le considerazioni sulla reale precisione del quarzo/risuonatore montato sulla 2009/UNO, si va da +/- 50 ppm fino a +/-250 ppm (ovvero un errore reale compreso tra +/- 2 minuti/mese e +/- 10 minuti/mese), il vero problema è che la millis non è 1 ms esatto.

In Wiring.c viene definita in questo modo:

Code:
// the prescaler is set so that timer0 ticks every 64 clock cycles, and the
// the overflow handler is called every 256 ticks.
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256))

Ovvero il Timer0 è settato con un prescaler 1:64 in modo da ottenere un count ogni 4us, dato che la millis funziona contando gli overflow abbiamo 256*4 = 1024 us per ogni count della millis e non 1000 come porta a pensare il nome della funzione.
Tradotto in tempi, ipotizzando che il quarzo sia da 16 MHz precisi, vuol dire che quando la millis segna 1024 ms in realtà sono passati solo 1000 ms.




ok... ma c'è un modo per contare 1000ms precisi, senza incappare in millis che ogni 1024 ne conta uno (ovviamente tenendo come accettabili gli errori +/- del quarzo ecc, che comunque se uno deve realizzare un timer ecc di magari 10 minuti o 1h non gliene frega niente se perde anche 10 secondi a mese)
forse con micros???? (che però va a zero dopo 70h sempre secondo il reference...)


EDIT:
Secondo me quello contribuisce non poco!

dato che scrivi questo, per imparare a scrivere codice in modo migliore, potresti dirmi come l' avresti fatto te????
« Last Edit: August 06, 2012, 02:37:13 pm by jacock » Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9183
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok... ma c'è un modo per contare 1000ms precisi, senza incappare in millis che ogni 1024 ne conta uno

Dov'è il problema ?
Devi solo moltiplicare il valore di millis per 1024 per sapere i secondi reali.
Logged

Pages: [1] 2   Go Up
Jump to: