Dividere il segnale di Clock di Arduino

Ciao a tutti, dovrei realizzare un oscillatore a onda quadra con duty cycle 50% con tensione 5V per pilotare dei passo passo a velocità costante. La frequenza richiesta è piuttosto bassa e si dovrebbe avvicinare il più possibile a 24,14Hz.
Pensavo, se possibile, di usare il Clock di 16MHz di Arduino e dividerlo per il numero intero 662800.
Vi chiedo se è una cosa fattibile e, in caso favorevole, se mi potete dare qualche input in merito, oppure se mi potete suggerire qualche soluzione per avere il segnale ad onda quadra richiesto.
Grazie molte
Ezio

Farlo via software?

void loop()
{
    if (micros() - t >= 41425)
    {
        t += 41425;
        ...fa qualcosa 24,14 volte al secondo...
    }
}

Grazie mille, è una buona idea su cui lavorare
Ezio

Oppure
https://www.arduinoslovakia.eu/application/timer-calculator

unsigned long t;

void setup()
{pinMode(0, OUTPUT);}

void loop()
{
if(micros()-t>20711)
  {
  t=micros();
  PORTD^=0x01;  
  }
}

Produce un segnale a 24,14059Hz su D0.
Naturalmente devi considerare la tolleranza del quarzo o risuonatore di Arduino. Eventualmente, la frequenza del quarzo può essere corretta con un compensatore.

if(micros()-t>20711)
  {
  t+=20711;
  PORTD^=0x01;  
  }
}

È più preciso.

Sì, ne avevamo parlato. Non risente del piccolo ritardo introdotto dall'if. Comunque, in questo caso, il valore teorico non può coincidere esattamente con quello desiderato, perché 16MHz non è divisibile per 24Hz:
16M=2^4 *1M; 24=2^3 *3.

unsigned long t;

void setup()
{pinMode(0, OUTPUT);}

void loop()
{
if(micros()-t>20711)
  {
  t+=20711;
  PORTD^=0x01; 
  }
}

zioetzi:
La frequenza richiesta è piuttosto bassa e si dovrebbe avvicinare il più possibile a 24,14Hz.
Pensavo, se possibile, di usare il Clock di 16MHz di Arduino e dividerlo per il numero intero 662800.

Spiega bene il tuo problema, che forse ti stai incartando:
per un lavoro del genere un 555 potrebbe andare, senza arduino
oppure una catena di divisori, insomma: il tuo problema è prettamente di elettronica combinatoria (se non decisamente analogica) cosa te ne fai di Arduino?

Devo pilotare una piccola montatura equatoriale di un telescopio.
L'asse di ascensione retta deve avere un periodo di rotazione di 86164 secondi.
Tenuto conto delle riduzioni:

  • corona dentata/vite senza fine 130:1
  • trasmissione a mezzo di pulegge e cinghia dentata 5:1

considerato che il motore ha 200passi/giro con funzionamento a microstep 1/16

necessito di una frequenza di clock il più vicino possibile a 24,14Hz

Tempo fa (ahimè, molto tempo fa...) avevo costruito, per una funzione simile, un'oscillatore quarzato seguito da dei divisori per ottenere la frequenza voluta, ma considerato il basso costo di una scheda Arduino trovo decisamente più pratico utilizzarne una solo per generare il segnale di clock anche perché, modificando il codice, posso cambiare la frequenza per ottenere delle correzioni di velocità al fine di compensare eventuali errori di stazionamento della montatura equatoriale in caso di osservazioni mordi e fuggi...

Ezio

Allora, con il software puoi anche fare aggiustamenti finissimi: se 99 li prendo e uno lo scarto, ottengo una riduzione dell'1%, cioè 0,24 Hz su 24 :slight_smile:

Datman:
Sì, ne avevamo parlato. Non risente del piccolo ritardo introdotto dall'if.

Perdona una domanda: non riesco a capire perché un codice è più preciso dell'altro se in entrambi è presente l'istruzione if... dove sbaglio?

Grazie ancora per l'aiuto
Ezio

Utilizzando un timer a 16 bit ed impostando il prescaler a 64, con un valore di preload di 55180 si ottiene un periodo di 41424µsec. Mettendo come valori di preload 55179 si ottiene invece un periodo di 41428µsec. Direi che il primo valore di preload (55180) permette di ottenere una maggiore precisione con comunque un errore (la frequenza reale sarà di 24.1406 Hz dando per scontato che il l'oscillatore di base generi esattamente 16MHz ... che non è affatto detto).

Non dimeticate che, anche usando micros(), la sua precisione è comunque di +/- 4µsec e che quindi comunque ci sarà l'introduzione di un errore.

Guglielmo

Perché facendo la somma si ha un incremento esatto. Ad esempio: 100; 100+100=200; 200+100=300. micros() dovrà arrivare la prima volta a 100, poi a 200, poi a 300.

Nell'altro modo, invece, si fa un "azzeramento" periodico a cui si somma qualche istante e l'incremento sarà 100 più qualche istante.

Caro Guglielmo, potresti farci un po' di lezioncine con esempi pratici ed esperimenti per imparare a usare i timer, cosa che si è sempre fatta con i PIC ma quasi nessuno ha mai usato con Arduino?
Chi ha fatto un frequenzimetro con un PIC, ad esempio, ha usato i timer, mentre con Arduino sul vede solo fatto con pulseIn...

Grazie! :slight_smile:

Per lo OP
Bel lavoro, ma perché non hai pensato a una fonte di frequenza ultrastabile?
So di chi prende come riferimento la frequenza dei trasmettitori AM RAI
Molto stabili, quasi il massimo ottenibile
Oppure la portante del DCF77
Precisa come la media dei 5 orologi atomici più precisi d'Europa

zioetzi:
non riesco a capire perché un codice è più preciso dell'altro se in entrambi è presente l'istruzione if... dove sbaglio?

La valutazione dell'if può avvenire con un certo ritardo rispetto al momento esatto dello scadere del periodo, ipotizziamo 10µs per vari motivi, se noi facciamo partire un nuovo conteggio dal momento attuale (in ritardo di 10µs), abbiamo appena introdotto un errore che si accumula ad ogni scadenza aumentando sempre di più.

Se invece spostiamo solo il paletto di riconoscimento avanti di un periodo esatto, è vero che comunque possiamo riconoscere la scadenza con un certo ritardo, ma non lo accumuliamo, per cui il periodo rimane preciso. In ogni caso la precisione dell'oscillatore ceramico di Arduino comporta qualche secondo di errore all'ora... diverso sarebbe se avesse un vero quarzo.

Datman:
Caro Guglielmo, potresti farci un po' di lezioncine con esempi pratici ed esperimenti per imparare a usare i timer, cosa che si è sempre fatta con i PIC ma quasi nessuno ha mai usato con Arduino?

Intanto allego un bel documento che scrisse il nostro leo72 nel lontano 2013 in occasione di un incontro che si tenne a Bassano del Grappa.

Poi dai anche un'occhiata al buon "generatore di codice" che ha linkato brunello nel post #3.

Guglielmo

Timer.pdf (747 KB)

C'è molta carne al fuoco. Grazie mille, mi avete dato vari spunti su cui lavorare.

Standardoil:
Per lo OP
Bel lavoro, ma perché non hai pensato a una fonte di frequenza ultrastabile?
So di chi prende come riferimento la frequenza dei trasmettitori AM RAI
Molto stabili, quasi il massimo ottenibile
Oppure la portante del DCF77
Precisa come la media dei 5 orologi atomici più precisi d'Europa

Questa soluzione sarebbe interessante, sicuramente eccessiva per la montatura piccola, ma forse ideale per la più grande. Ti confesso, però, che non avrei la minima idea su come fare...

Ezio

Eh, ma ottenere 24,14 Hz...
Con un modulo GPS, allora, che dalla Cina paghi meno di 10€ (ma che pazienza che ci vuole... 4 mesi ci ha messo!), puoi ottenere qualunque frequenza a passi di 1Hz da 1Hz a 15MHz! :slight_smile:

Non ho fretta per terminare la montatura più grande, ma questa cosa mi stuzzica.
Potresti indicarmi il tipo di scheda (anche tramite messaggio privato qualora fosse contro il regolamento postare link di prodotti) ed eventualmente qualche tutorial?
Nel caso della montatura maggiore cambiano completamente le riduzioni meccaniche, pertanto la frequenza sarà per forza diversa dai 24,14Hz.

Ezio