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
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.