Servo Driver

© by Vittorio Crapella

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

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