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.
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.
- 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
http://www.osservatoriobassano.org/TCS2015/SoftV03.zip
Nessun commento:
Posta un commento