Go Down

Topic: Dividere il segnale di Clock di Arduino (Read 948 times) previous topic - next topic

zioetzi

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

Claudio_FF

#1
Aug 05, 2019, 11:08 pm Last Edit: Aug 05, 2019, 11:08 pm by Claudio_FF
Farlo via software?
Code: [Select]
void loop()
{
    if (micros() - t >= 41425)
    {
        t += 41425;
        ...fa qualcosa 24,14 volte al secondo...
    }
}
* * * * Una domanda ben posta è già mezza risposta * * * *

zioetzi

Grazie mille, è una buona idea su cui lavorare
Ezio


Datman

#4
Aug 06, 2019, 02:01 pm Last Edit: Aug 06, 2019, 02:12 pm by Datman
Code: [Select]
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.
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Claudio_FF

Code: [Select]
if(micros()-t>20711)
  {
  t+=20711;
  PORTD^=0x01;  
  }
}

È più preciso.
* * * * Una domanda ben posta è già mezza risposta * * * *

Datman

#6
Aug 06, 2019, 06:13 pm Last Edit: Aug 06, 2019, 06:15 pm by Datman
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.

Code: [Select]
unsigned long t;

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

void loop()
{
if(micros()-t>20711)
  {
  t+=20711;
  PORTD^=0x01;
  }
}
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Standardoil

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?
Non presurrò più la buona fede di chi:
NON indenta, USA la classe String o NON esegue le ricerche
E di chi non risponde alle domande Tante volte è stato segnalato che è sbagliato, quindi NON sono in buona fede
Non bado a studenti, che copino altrove

zioetzi

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

Datman

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 :-)
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

zioetzi

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

gpb01

#11
Aug 06, 2019, 10:08 pm Last Edit: Aug 07, 2019, 06:22 am by gpb01
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
Search is Your friend ... or I am Your enemy !

Datman

#12
Aug 06, 2019, 10:10 pm Last Edit: Aug 06, 2019, 10:15 pm by Datman
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.
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Datman

#13
Aug 06, 2019, 10:21 pm Last Edit: Aug 06, 2019, 10:22 pm by 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?
Chi ha fatto un frequenzimetro con un PIC, ad esempio, ha usato i timer, mentre con Arduino sul vede solo fatto con pulseIn...

Grazie! :-)
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

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
Non presurrò più la buona fede di chi:
NON indenta, USA la classe String o NON esegue le ricerche
E di chi non risponde alle domande Tante volte è stato segnalato che è sbagliato, quindi NON sono in buona fede
Non bado a studenti, che copino altrove

Go Up