Servo Driver
© by Vittorio CrapellaSERVO DRIVER
SERVO DRIVER
Lo schema qui sotto raffigurato é nato per risolvere il seguente problema:
- Mediante un potenziometro poter azionare un SERVO del tipo usato nei tradizionali radiocomandi per aeromodellismo.
- Realizzare cioè un circuito in grado di generare impulsi con dutly-cycle adeguati secondo lo standar dei classici SERVO.
Regolare T2 per la sua minima resistenza cioè cursore verso (max) centrale di T3
Regolare T3 per avere sul suo centrale o sul pin 5 la tensione di circa 4,4 / 4,42 V
In queste condizioni Regolare T1 per avere l'impulso positivo di 2 mS (T1 circa a 440 Ohm)
Girando T2 verso il minimo l'impulso positivo deve diventare di 1 mS e al massimo 2 mS
___________________________________________________________
CONTROLLO DIREZIONE SERVOCOMANDATO
CONTROLLO DIREZIONE SERVOCOMANDATO
Da una richiesta via E-Mail:
"..Mi servirebbe un circuito che mi indica con 2 led il senso di direzione di un servocomando (quelli per automodellismo), il circuito deve essere alimentato a 5 V..."
POSSIBILE SOLUZIONE
PROGRAMMA:
.title "SERVO" ;indicatore di direzione per servo
.vers "ST62T10"
; 8 Mhz ; 24/07/2000 by Vittorio Crapella
lsb1 .def 084h ;valore di servo a riposo
msb1 .def 085h
lsb .def 086h ;valore di servo in movimento
msb .def 087h
.org 0880h
;*** Setta la porta B
ldi port_b,00000000b ;TUTTI INPUT
ldi pdir_b,00000000b
ldi popt_b,00000000b
;*** Setta la porta A
ldi port_a,00000000b ;3 out
ldi pdir_a,00000111b
ldi popt_a,00000111b
;PROGRAMMA PRINCIPALE
main
ldi wdog,255
call delay
clr x
clr y
iniz ldi wdog,255
jrr 0,port_b,iniz ;resta qui fino ad inizio impulso positivo
cont ldi wdog,255
jrr 0,port_b,fine ;se ingresso va a zero salta
inc x ;altrimenti valuta tempo alto servo
jrnz cont
inc y
jrnz cont
fine ld a,x ;mette valori servo default
ld lsb1,a
ld a,y
ld msb1,a
ctrl ldi wdog,255 ;aspetta che l'impulso vada alto
jrr 0,port_b,ctrl
clr x
clr y
misura ldi wdog,255
jrr 0,port_b,zero ;se ingresso va a zero salta
inc x ;altrimenti valuta tempo alto servo
jrnz misura
inc y
jrnz misura
zero ld a,y
cp a,msb1 ;msb1 contiene partenza defoult servo
jrz verx ;se permane uguale verifica x
jp verall ;altrimenti deve valutare dove si muove
verx ld a,x
cp a,lsb1
jrnz vax ;essendo diverso valuta di quanto
jp nill ;non si muove dalla partenza e tiene spento
vax jrnc suba ;a é > di x pertanto va a sottrarre
jp menx ;altrimenti x > di a
suba sub a,lsb1
cpia cpi a,1 ;verifica se é diverso almeno di 1
jrc nill ;é praticamente uguale e salta
jp verall ;é oltre 1 pertanto va valutato se on/off
nill ldi a,00000100b ;spegne rosso e giallo, accende verde
ld port_a,a
jp rita
menx ld a,lsb1
sub a,x
jp cpia
verall ld a,y
cp a,msb
jrz oltre ;=
jrnc piu_ ;>
jp meno ;<
piu_ jp piu
oltre ld a,x
cp a,lsb1
jrnz vai2
jp ctrl
vai2 jrc min
sub a,lsb1
cpi a,2
jrnc piu
jp rita
piu ldi a,00000001b ;accende giallo
ld port_a,a
jp aspet
min ld a,lsb1
sub a,x
cpi a,2
jrnc meno
jp rita
meno ldi a,00000010b ;accende rosso
ld port_a,a
aspet ld a,y
ld msb,a
ld a,x
ld lsb,a
rita call delay
jp ctrl
delay ldi x,2 ;perde tempo circa 20 mS
ldiy ldi wdog,255
ldi y,255
decy dec y
jrnz decy
dec x
jrnz ldiy
ret