Per risolvere questo problema adottiamo una soluzione meccanica/elettronica già applicata con successo al telescopio Schmidt dell'Osservatorio di Bassano Bresciano.
Insieme dei pezzi meccanici del gruppo motore riduttore
Nella progettazione del gruppo motore riduttore è stato inserito sull'albero un disco con una piccola fessura ed una forcella ottica che sente il passaggio della fessura nel giro del motore.
Particolare della forcella ottica
Particolare del disco con fessura
Per effettuare la correzione occorre rilevare sperimentalmente il valore dell'errore e metterlo in relazione con la fase della rotazione del motore rilevata dal segnale della forcella ottica.
L'errore più essere ben approssimato con una sinusoide della quale occorre calcolare ampiezza e sfasamento.
Errore rilevato per telescopio Schmidt
All'oggetto StepAxis è stato aggiunto una funzione che riceve ingresso l'ampiezza e la fase della sinusoide. Con questi valori è compilata una tabella di 3200 elemento con il numero di passi di compensazione dell' errore per ogni punto della rotazione.
/*---------------------------------------------------------------------------
enable/disable PEC
---------------------------------------------------------------------------*/
void StepAxis::PEC( bool Enable, int Amplitude, int Phase, int StepOneRotation)
{
double CurrPhase; // current Phase
double CurrAmplitude; // current Amplitude;
int Offset; // sin offset fo soft start
int i;
PECEnable = Enable; // store enable
PECStepOneRotation = StepOneRotation; // store StepOneRotation
if ( PECEnable == true ) // other actions only when enabled
{
PECSyncDone = false; // sync need to be renew
if ( StepOneRotation > STEPEXIS_MAX_PEC_TABLE ) // clamp for maximum steps
StepOneRotation = STEPEXIS_MAX_PEC_TABLE;
CurrPhase = Phase + (double)i*360.0/(double)StepOneRotation; // current phase in degree
CurrPhase /= 180.0/M_PI;
CurrAmplitude = sin(CurrPhase) * (double)Amplitude;
// table computing
for ( i=0; i<StepOneRotation; i++ )
{
CurrPhase = Phase + (double)i*360.0/(double)StepOneRotation; // current phase in degree
CurrPhase /= 180.0/M_PI;
CurrAmplitude = sin(CurrPhase) * (double)Amplitude;
if ( i == 0 )
Offset = CurrAmplitude;
PECTable[i] = CurrAmplitude - Offset;
}
}
}
Nella gestione del movimento è rilevata la posizione in cui arriva il segnale dalla forcella ottica e memorizzato il valore dell'encoder virtuale nella variabile (PECSyncPhase).
// detect strobe rising when PEC enabled and positioning is finished
if ( PECStrobe == true && PECOldStrobe == false && PECEnable == true && Phase == PHASE_STOPPED )
{
PECSyncPhase = Encoder; // store sync value from encoder
PECSyncDone = true; // PEC syncronization is done
}
PECOldStrobe = PECStrobe;
A questo punto la correzione dell'errore diventa un gioco da ragazzi. E' ricavato PECIndex come modulo sulla distanza tra il setpoint di posizione che si intende impostare (Temp3) e la posizione individuata dalla forcella ottica (PECSyncPhase). Il modulo è fatto sul numero di passi per un giro di rotazione (PECStepOneRotation). Il valore di PECIndex sarà in questo caso sempre compreso tra 0 e 3199.
Con questo valore si consulta la tabella e si ricava il valore di correzione (PECValue) e lo si aggiunge al set point di posizione stesso.
if ( TrackingEnable == true && PECEnable == true && PECSyncDone == true )
{
PECIndex = (Temp3 - PECSyncPhase) % PECStepOneRotation;
PECValue = PECTable[PECIndex];
Temp3 += PECValue;
}
ApplySetpoints( Temp3, VelocitySetpoint );
Questa tenica applicata al telescopio Schmidt ha portato a questo risultato
Alla sinistra un ingrandimento di una foto ad un campo stellare senza controllo PEC abilitato, a destra lo stesso campo con controllo PEC abilitato
Questa versione di software si può scaricare all'indirizzo
http://www.osservatoriobassano.org/TCS2015/SoftV05.zip
http://www.osservatoriobassano.org/TCS2015/SoftV05.zip
Nessun commento:
Posta un commento