Pages: 1 [2]   Go Down
Author Topic: Orologio siderale  (Read 2204 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Shannon Member
****
Karma: 132
Posts: 10497
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no, con la riduzione che dico io si può fare, solo che l'orologio ogni secondo "normale" muoverà la lancettadi 1.002739 secondi siderali.
Lesto, come dici tu non può funzionare. Ragiona un attimo.
Un secondo siderale è lungo 0,997261 secondi "legali". Nel modo che dici tu sposti in avanti la lancetta ma non hai il tempo allineato con la vera ora siderale.
Ti faccio un esempio:

00:00 siderali
00:00 "legali"

Dopo 1 secondo "legale", l'orario è:
00:01,002739
00:01

Ma la lancetta non sta sulla tacca di 1 secondo sull'orologio, ma poco avanti.

Invece a 00:01 siderali  io devo avere la lancetta sulla 1a tacca dei secondi dopo appunto 0,997261 secondi "legali".

Cioè, non è solo una questione di spostare le lancette, l'orario siderale è un'orario a tutti gli effetti che misura il tempo in modo diverso e quindi la sua durata è inferiore e come tale va calcolata.


ma quella differenza di 1.002739 non la vedi ad occhio nudo, ma l'ingranaggio fa in modo che l'errore non si accumuli.

certo se conti gli step della lancetta, ti accorgerai che ne mancano 3*60 + 56....

problema risolvibile giocando sulla VELOCITA' di rotazione. Se ottieni una velocità di rotazione fissa, puoi calcolare una riduzione per cui tutto torni. l'RTC serve solo una volta ogni tot ad allineare l'orario, intervendendo sulla velocità di rotazione
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pistoia (Italy)
Offline Offline
Newbie
*
Karma: 0
Posts: 8
Arduino for astronomy
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Come ripeto sono alle prime armi con Arduino, e siccome le idee suggerite sono parecchie, sono parecchio disorientato. Per questo vorrei porre un po' di paletti.
Partiamo dal risultato finale: uno stepper montato sulla lancetta dei secondi che fa un singolo passo ogni 0.997261 secondi. Il treno di ingranaggi che segue fa spostare la lancetta dei minuti e quella delle ore.
Quindi un controllore Arduino dello stepper e un'interfaccia programmabile che faccia fare 86400 passi in 86164 secondi reali allo stepper. Lo so perfettamente che non esistono stepper che fanno 86164 passi a giro, come mi diceva Lesto. Lo stepper farebbe i suoi 200 passi a giro (in 199.4522 secondi reali), ovvero 430.82 giri in 24 ore siderali.
Non so se l'interfaccia programmabile abbia al suo interno un clock in tempo reale, ma se si potesse controllare attraverso il PC, per esempio, basterebbe un programmino del genere:

mi esprimo tipo VB

for I =0 to 86400 step 0.997261 'secondi reali
' fa fare un passo allo stepper
next I

Si può ricavare qualcosa da questo?

Logged

Pistoia (Italy)
Offline Offline
Newbie
*
Karma: 0
Posts: 8
Arduino for astronomy
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Spero tanto che non mi abbiate abbandonato. Forse ho detto qualche castroneria imperdonabile? 
Parziale rettifica: il motore passo/passo ideale dovrebbe fare 6°/passo per avere lo spostamento di 1 secondo siderale ad ogni step del motore, ma anche se fa 1.8°/passo va bene ugualmente perché  esattamente ogni 3 secondi siderali farebbe 10 passi  e sarebbe anche meglio perché la lancetta dei secondi sembrerebbe ruotare in modo più fluido, a passettini di circa 1/3 di tacca. L'unica cosa che non ho la più pallida idea di come risolvere è quella di far fare uno step al motore ogni 0,2992863 secondi reali. Esiste una scheda di pilotaggio di un bipolare con la possibilità di programmarla in modo da ottenere un clock del genere?

Grazie mille.
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22936
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non ti abbiamo abbandonato ma di suggerimenti te ne abbiamo dati, sta a te ora trovare il sistema per risolvere il problema.
Di mio posso aggiungere che con il timer 1, che è un timer a 16 bit, potresti avere un sistema per avere un incremento dei secondi siderali ogni 0,99725754176s
Ciò porta ad una durata del giorno siderale di 86163,05s al posto di 86164s, quindi una differenza di 1 secondo/24h.

Basta che imposti il timer in modalità CTC con tetto massimo fissato da OCR1A a 8021 e prescaler a 1.
Difatti (16000000/2/1/(8021+1))=997,25754176 Hz. Intercetti la relativa ISR e dopo 1000 overflow puoi contare 1 secondo siderale.
Logged


0
Offline Offline
Shannon Member
****
Karma: 132
Posts: 10497
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

dunque, se vuoi usare un PC, fai attenzione: molti SO e vecchi sistemi operativi hanno dei timer precisi solo ad centesimo di secondo. (lo so perchè facendo della grafica al PC alle volte tra un'immagine e l'altra capita di dover far aspettare al Thread qualhe millesimo/centesimo di secondo e non si può.

La soluzione di leo è interessante, ma come dicevamo i timer tendono a sballare sul lungo termine (e per un timer lungo termine vuol dire decine di minuti), però ecco, un sistema leo + un RTC (che poi usi il PC come RTC è una tua scelta).

la cosa diventa un poco complessa, a solo lato matematico non programmazione.
tu avresti l'RTC (che poi sia il PC chissene), che ogni secondo invia un impulso. chiamiamolo RTC

quando ti arriva un impulso, salvi il valore di micros() in una variabile, lastRTC per esempio.
Quando l'utente preme su "start" salvi il valore attuale di micros() meno lastRTC (ovvero il numero di microsecondi di sfaso tra il secondo reale e il secondo siderale, chiamamiamola sfasoRTC), setti a 0 una variabile che conta i secondi RTC (chiamaiamola secRTC).

poi fai la durata di un secondo in micros (6.000.000) meno sfasoRTC e ottieni quanti microsecondi ci rimangono entro il prossimo interrupt RTC (chiamiamo missingRTC)

ora avreai precalcolato quanto microsecondi RTC equivalgolo and un microsecondio SID (siderale): 997.261 (SIDinRTC)

ora calcoli il numero di SID che devono trascorrere fino al prossimo interrupt RTC: missingRTC/SIDinRTC = missingSID

ora semplicemente fai un for da 0 a missingSID che incrementa uno step il motore (che saranno 86400) e poi si mette a nanna per SIDinRTC microsecondi.

poi a questo punto, finito il for, devi ricalcolare lo sfaso di missingRTC, però ora devo andare, vediamo se riesci a concludere da solo...

Ma in pratica tutto questo è un modo per usare l'RTC per rimanere allineati con i Timer.


ps. @leo: sul tuo github si discute per modificare la swRTC, sarebbe gradito un tuo intervento smiley
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22936
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La soluzione di leo è interessante, ma come dicevamo i timer tendono a sballare sul lungo termine (e per un timer lungo termine vuol dire decine di minuti), però ecco, un sistema leo + un RTC (che poi usi il PC come RTC è una tua scelta).
I timer sballano nella misura in cui è imprecisa la fonte di clock usata. Se parliamo dell'Arduino, c'è un risonatore ceramico che sappiamo è un tipo di generatore di frequenza nota per la sua inaccuratezza.
Se si usa un quarzo la precisione sale e di molto, per cui si può usare l'RTC esterno per calcolare la discrepanza fra l'orologio siderale e l'orologio in CET e, se non è di 3'56", applicare l'eventuale correzione.

ps. @leo: sul tuo github si discute per modificare la swRTC, sarebbe gradito un tuo intervento smiley
Ti scrivo...
Logged


Pages: 1 [2]   Go Up
Jump to: