da
c1b8 » 16 nov 2013, 1:17
Anche meno, dovremmo avere uno sposizionamento rispetto al centro inferiore al grado.
Abbiamo visto come possiamo generare un Ton variabile per il nostro segnale PWM: basta variare il timer0.
Quando si verifica un interrupt portiamo alto il segnale di controllo del servo, impostiamo il valore del timer sul valore necessario ad ottenere un nuovo interrupt dopo il tempo Ton richiesto e usciamo dalla routine di interrupt.
Al successivo interrupt, quindi quando finisce il Ton, la routine di interrupt dovrà portare bassa il segnale di controllo ed impostare il timer al prossimo interrupt. Ma quando deve avvenire il prossimo interrupt?
Per rispondere a questa domanda dobbiamo considerare che:
1) la nostra routine deve gestire 2 servo e non 1
2) il segnale PWM non è composto solo dal Ton ma anche da un tempo Toff e Ton+Toff deve essere di 20ms per ogni servo
Una routine di interrupt è bene abbia una durata (tempo di esecuzione della routine) al massimo pari alla metà del tempo che intercorre tra un interrupt ed il successivo. Questo significa che non possimo generare degli interrupt ogni 8 o 10 us (valori bassi scelti a caso) in quanto la nostro routine durerà sicuramente di più.
Non possiamo cioè ipotizzare che al primo interrupt entrambi i segnali di controllo siano portati alti, che si verifichi un interrupt allo scadere del primo Ton ed uno allo scadere del secondo Ton. Potrebbe infatti essere che il primo Ton abbia durata 1000us ed il secondo una durata di 1008us. Sarebbero necessari 2 interrupt a distanza di 8us l'uno dall'altro e questo abbiamo detto che è impossibile.
Quello che possiamo fare è iniziare il periodo Ton del secondo servo quando termina il primo. In questo modo tra un interrupt ed il successivo c'è sicuramente tempo a sufficienza.
Supponendo quindi di avere il Ton1=1000us ed il Ton2=1008us avremo la routine che si comporta in questo modo:
- primo interrupt --> alto segnale servo1, basso segnale servo2, imposto timer per 1000us (Ton1)
- secondo interrupt --> basso segnale servo1, alto segnale servo2, imposto timer per 1008us (Ton2)
- terzo interrupt --> basso segnale servo1 e segnale servo2, imposto timer per arrivare a 20ms.
Ma come faccio a sapere come impostare il timer al terzo interrupt? La durata del Ton1 e del Ton2 sono diversi e variabili ed il tempo necessario a completare i 20ms per il servo1 è diverso dal tempo necessario a completare i 20ms del servo2.
Si rivolve in questo modo:
- primo interrupt --> alto segnale servo1, basso segnale servo2, imposto timer per 1000us (Ton1)
- secondo interrupt --> basso segnale servo1 e segnale servo2, imposto timer per avere un interrupt dopo 2500-Ton1 us. Ossia imposto il timer per 1500us
- terzo interrupt --> basso segnale servo1, alto segnale servo2, imposto timer per 1008us (Ton2)
- quarto interrupt --> basso segnale servo1 e segnale servo2, imposto timer per avere un interrupt dopo 2500-Ton2 us. Ossia imposto il timer per 1492us
- dal quinto al sedicesimo interrupt imposto il timer per avere 1250us al prossimo interrupt
In questo modo ogni 2 interrupt ho sempre un intervallo di 2500us, dopo 16 interrupt sono trascorsi esattamente 20ms ed il ciclo ricomincia.
Unica cosa da fare è valorizzare 2 variabili per ogni servo:
- la prima variabile contiene il valore da asseganre al timer per ottenere il tempo di Ton (ovvero per la posizione che voglio ottenere)
- la seconda variabile contiene il valore da assegnare al timer per raggiungere il tempo di 2500us, tempo calcolato come differenza tra 2500 ed il Ton presente nella prima variabile.
Queste 2 variabili per servo saranno calcolate e valorizzate con calma dal corpo principale del programma che controlla e decide di conseguenza la situazione dei pulsanti.
Ho fatto troppa confusione?
Fabio