mercoledì 30 settembre 2015

Tracking e puntamento con lo stesso motore

Nuovo passo nello sviluppo del software,:ho aggiunto la gestione del tracking con lo stesso motore che esegue il puntamento dell’ascensione retta. Il tutto si basa sul principio che la rotazione siderea avviene in 86164 secondi (23 ore, 56 minuti, 4 secondi) anziché 86400 (24 ore ). Il rapporto tra i due tempi è 1.002737908. Dato che il motore di ascensione retta permette la rotazione di 360° dell’asse con 3456000 impulsi, per compensare la rotazione della Terra al motore di ascensione retta devono essere dati 3456000 * 1.002737908 = 3465462 impulsi addizionali nel giro di 24 ore. Tale valore è memorizzato nella variabile SidealSteps.

L’implementazione nel codice è avvenuta intervenendo in due diversi ambiti.

1) Ogni 10 millisecondi è incrementata la variabile SkyTrackingTime del valore 10 in modo da tenere un conteggio dei millisecondi dalla accensione del sistema. Con questo valore è eseguta la proporzione tra i millisecondi trascorsi e quelli totali in un giorno:
 
SkyTrackingStep = (SkyTrackingTime * SidealSteps) / 86400000

Il valore SkyTrackingStep è sommato alla coordinata correntemente puntata. In questo modo nel caso di motore di ascensione fermo (tracking disabilitato) la coordinata puntata dal telescopio s’incrementa di 24 ore di ascensione retta ogni giorno siderale.

2) Se il tracking è abilitato, una volta completato un puntamento è mantenuto un conteggio di millisecondi trascorsi (variabile MotorTrackingTime) incrementato ogni 10 millisecondi. Con questo valore è eseguta la proporzione tra i millisecondi trascorsi e quelli totali in un giorno:
 
MotorTrackingStep = (MotorTrackingTime * SidealSteps) / 86400000

Il valore MotorTrackingStep è quindi sottratto a setpoint di posizione per il motore di scensione retta in questo modo ogni volta che la formula produce un incremento di 1 del valore il motore indietreggia di un passo alla frequenza di 40.1095 Hz.

La combinazione delle due azioni fa si che in caso di tracking attivo il telescopio si muove con la giusta velocità e la coordinata puntata risulta invariata.



In questo video è possibile vedere il motore di ascensione retta:
  • il motore esegue il tracking muovendosi a 1/16 di passo a circa 40Hz
  • il motore si muove a 1/16 di passo sino ad un punto di sincronismo in cui è possibile cambiare il passo
  • cambia la movimentazione in passi interi
  • accelera la velocità da 200hz a 500hz
  • mantiene la velocità sino nel pressi della coordinata finale
  • decelera da 500hz a 200hz
  • cambia la movimentazione a 1/16 di passo
  • esegue il posizionamento finale di precisione
  • il motore riprende il tracking 
Questa versione di software si può scaricare all'indirizzo


giovedì 17 settembre 2015

Terzo passo: posizionamento con regolazione della velocità

Terza versione provvisoria del software.

Dopo la pausa estiva ho ripreso il lavoro implementando il puntamento con la gestione completa degli assi di ascensione retta e di declinazione. Il movimento ora avviene con la possibilità di selezionare la velocità massima, tale  velocità è raggiunta con una rampa di accelerazione. La stessa rampa è usata durante la decelerazione. E' gestito il cambio dinamico del passo da intero a 1/16 di passo.
Il cuore della è l’oggetto StepAxis (in linguaggio C++) che permette di muovere un motore passo passo come un asse di telescopio. Sono istanziati due di questi oggetti, uno per l’ascensione retta ed uno per la declinazione. La gestione prevede in varie situazioni delle attese temporali, queste sono realizzate senza introdurre ritardi (tipo funzione Delay), ma con una serie di macchine a stati. Così l’esecuzione risulta essere veloce senza bloccare le altre operazioni svolte dalla CPU

Lo schema mostra le parti più rilevanti del software nell'oggetto StepAxis.

Due sono le funzioni ad alto livello che l’oggetto dispone per il posizionamento del motore:
Goto.  Riceve in ingresso la coordinata da raggiungere e la velocità massima da utilizzare (in percentuale sulla massima possibile). Converte la coordinata da Ore/minuti/secondi (o gradi/minuti/secondi) in passi di motore. Converte la velocità massima in step al tempo di campionamento. La funzione termina rapidamente lasciando le informazioni all’interno dell’oggetto insieme il comando di esecuzione del movimento. Quando la funzione esce il movimento non è ancora iniziato
Stop. La funzione termina rapidamente lasciando il comando di stop con rampa di decelerazione  all’interno dell’oggetto. Quando la funzione esce lo stop non è ancora iniziato.
Le altre funzioni coinvolte nella movimentazione sono:
MoveManagement. E' chiamata rigorosamente una volta ogni 1/100 di secondo. Il suo campito è di gestire la generazione della traiettoria di posizionamento. Riceve in ingresso: la velocità di partenza, l’accelerazione, la velocità massima e la posizione da raggiungere. Con questi parametri, tramite una macchina a stati costruisce un profilo trapezoidale con rampa di accelerazione, velocità di crociera e rampa di decelerazione. La rampa di decelerazione inizia quando lo spazio residuo del movimento è quello corretto per terminare la decelerazione sulla posizione finale. Il movimento inizia applicando immediatamente la velocità di 200 hz in modo da superare di getto le frequenze di risonanza tipiche del motori passo passo. Quando è ricevuto un comando di stop la rampa di decelerazione inizia immediatamente.
ApplySetpoints. E' chiamata esclusivamente da MoveManagement. Riceve in ingresso i setpoint di posizione e velocità da applicare ai motori.  Quando la velocità è superiore ad un certo valore essa viene usata in modo esclusivo per la determinazione della frequenza di clock (controllo di velocità). Quando la velocità è inferiore, è utilizzato solo il set point di posizione (controllo di posizione). In caso di ascensione retta la funzione è in grado di cambiare dinamicamente lo step tra intero e 1/16. Tutte queste funzionalità sono realizzate tramite un’altra macchina a stati. In alcune commutazioni di segnali la macchina ha bisogno di tempi di attesa. In queste condizioni è attivato un segnale di attesa che raccolto dalla funzione MoveManagement che sospende la generazione del profilo di posizionamento. Così facendo si evita accumulo di errore tra la posizione richiesta e quella effettiva.
OutputForDriver. E' la più critica. E’ chiamata all’interno dell’interrupt temporizzato che scatta ogni 100 us. Lo scopo è quello di creare il segnale di clock regolare con jitter pressoché nullo. I motori passo passo sono piuttosto permalosi e non sopportano segnali di clock irregolari o brusche variazioni di velocità, specie alle alte velocità. La funzione riceve in ingresso : il numero di impulsi che devono essere emessi, la distanza temporale tra un impulso ed il successivo e di quanto varia il conteggio ad ogni colpo di clock (nel caso di cambio tra passo intero e 1/16). La funzione restituisce il valore di conteggio encoder (simulato) relativo alla posizione del motore e l’indicazione di emissione impulsi di clock termina. All’interno è attiva una ulteriore macchina a stati.


In questo video è possibile vedere il software Polypus ce gira su PC, connesso al sistema TCS105. In partenza il telescopio e puntato sulla stella Belatrix, eseguendo in puntamento sulla stella Betelgeuse si può vedere:

  • il motore di ascensione retta che si muove a 1/16 di passo sino ad un punto di sincronismo in cui è possibile cambiare il passo
  • cambia la movimentazione in passi interi
  • accelera la velocità da 200hz a 500hz
  • mantiene la velocità sino nel pressi della coordinata finale
  • decelera da 500hz a 200hz
  • cambia la movimentazione a 1/16 di passo
  • esegue il posizionamento finale di precisione
Questa versione di software si può scaricare all'indirizzo
http://www.osservatoriobassano.org/TCS2015/SoftV03.zip