Forum: FPGA, VHDL & Co. SERVO Ansterung


von Benedict (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem mit einem Servo.
Ich soll mit einem Mikrontroller und einem Servo (bzw 2) eine 
automatische Spiegelsteuerung mit Memoryfunktion relalisieren.

Über 2 (bzw. 4) Tasetr wird die Position des Spiegels eingestellt. 
Anschließend kann diese über eine Speichertaste gespeichert werden. Wenn 
ich den Servo nun an eine andere Stelle fahre und die gespeicherte 
Position aufrufe rast der Servo in die Stellung.
Mein Problem ist und dass der Servo in der gleichen Geschwindigkeit an 
die Stelle fährt wie wenn ich ihn manuell fahre.
Vielleicht könnt ihr mir da helfen.

;----------------------------------------------------------------------- 
-
;Initialisierungsteil für allgemeine Konstanten
;----------------------------------------------------------------------- 
-
Periode_low     EQU 0E0H  ;legt die Periodendauer fest 20ms
Periode_high    EQU 0B1H  ;45536 = 0B1E0H
PWMANL      EQU 024H     ;Compare Wert 2ms => 18 ms
PWMANH          EQU 0FAH  ;Compare Wert F830H


CSEG AT 0H                ;Legt absolute Codesegmentadresse auf 0h
jmp INIT

;----------------------------------------------------------------------- 
-
;Interrupt-Vektoren
;----------------------------------------------------------------------- 
-
ORG 000BH
call SPRUNG1
reti

;----------------------------------------------------------------------- 
-
;Initialisierungsteil für On-Chip Peripherie
;----------------------------------------------------------------------- 
-
ORG 100H                    ;Programmstart bei 100H

INIT:
mov TMOD,#00000001B    ;Timer 0 Initialisierung 16-Bit
mov IEN0,#10010010B    ;Interrupt Freigabe

mov  T2CON,#00010001B     ;Timer2 Einstellung:Timer mit f=f(osz)/12
                          ;Mode 0 ->Reload bei Ueberlauf
mov CCEN,#00001000B        ;Compare Mode des CC1 freigeben

mov CRCL,#Periode_low     ;Low Byte von Compare Reload Capture
mov CRCH,#Periode_high    ;High Byte von Compare Reload Capture

mov CCH1,#PWMANH    ;Pulsweitenmodulation Anfangswert
mov CCL1,#PWMANL

setb TR0      ;Timer0 läuft los

;----------------------------------------------------------------------- 
-
;Programmschleife
;----------------------------------------------------------------------- 
-



PWM:
jmp PWM

SPRUNG1:
jnb P1.7,ABFRAGE
jmp ISRTIMER0




ABFRAGE:
mov R2,#08h
mov R5,#02h



mov A,CCL1

SCHLEIFE:

cjne A,3, zaehlen

jmp ENDE

zaehlen:
jc hoch

dec CCL1
dec A

jmp INNER


hoch:
inc CCL1
inc A


jmp INNER

INNER:
djnz R2, SCHLEIFE


ENDE:





mov A,CCH1



cjne A,4, zaehleng

jmp RUNDE

zaehleng:
jc hochg

dec CCH1
dec A

jmp RUNDE


hochg:
inc CCH1
inc A


jmp RUNDE

RUNDE:
mov R6,#0F0h

RUNDE1:
mov R7,#0A5h
Runde2:

djnz R7, RUNDE2
djnz R6, RUNDE1
djnz R5, RUNDE

jmp ABFRAGE


ENDE1:

;mov CCL1,R3
;mov CCH1,R4

ISRTIMER0:
jb P1.2,TASTE3      ;T2 abwaerts nicht betätigt
clr C
mov A,CCL1      ;Inhalt von CCL1
subb A,#16      ;oberes Nibble um 1 erniedrigen
mov CCL1,A      ;Neuer Comparewert LB
jnc TASTE3      ;High-Byte wird nicht verändert
mov A,CCH1      ;Inhalt von CCH1
dec A        ;Inhalt um 1 erniedrigen
mov CCH1,A      ;Neuer Comparewert HB

TASTE3:
jb P1.3,ISRENDE      ;T3 aufwaerts nicht betätigt

clr C
mov A,CCL1      ;Inhalt von CCL1
add A,#16      ;oberes Nibble um 1 erniedrigen
mov CCL1,A      ;Neuer Comparewert LB
jnc ISRENDE      ;High-Byte wird nicht verändert
mov A,CCH1      ;Inhalt von CCH1
inc A        ;Inhalt um 1 erniedrigen
mov CCH1,A      ;Neuer Comparewert HB





ISRENDE:


jnb P1.5,Speichern
ret

Speichern:

mov R3,CCL1
mov R4,CCH1


ret


end



Kommentare sidn ab un zu fehlerhaft.

Danke schon mal im vorraus


Gruß

Benedict

von Null (Gast)


Lesenswert?

Die Regelgeschwindigkeit des Servos haengt mit einem internen 
Regelalgorithmus zusammen. Es gibt 2 Wege.
1) Selbst die Rampe vom Alten zum neuen Wert rechnen und so ausgeben
2) Widerstand als Strombegrenzung in die Speisung

von Rolf Magnus (Gast)


Lesenswert?

> 2) Widerstand als Strombegrenzung in die Speisung

Scheint mir eher ungünstig. Damit wird die Sache lastabhängig, und die 
Elektronik funktioniert vermutlich beim Bewegen nicht mehr richtig, weil 
die Spannung zu weit absackt. Das hängt dann auch noch davon ab, welche 
Servos man einsetzt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.