PID-Regler mit PWM - Frage
Hallo Leute,
ich bins mal wieder :-)
ich habe jetzt einen Servo gehackt und habe ihm noch einen CNY70 eingebaut, welcher auf ein Zahnrad (schwarz und weiß angemalt) gerichtet ist. Ich steuere nur noch den Motor des Servos an, also ein ganz normaler Motor mit anschließender Übersetzung. Die impulse des CNY70 werden mit einem Schmitttrigger (74HC14N) "digitalisiert".
Hier mein Programm:
Code:
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 19200
$framesize = 80
$hwstack = 80
$swstack = 80
Config Int0 = Change
On Int0 Isr_von_int0
Enable Int0
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
Pwm1a = 0
Pwm1b = 0
Config Timer2 = Timer , Prescale = 1024
Timer2 = 178
On Timer2 Isr_von_timer2
Enable Timer2
Config Pind.2 = Input
Portd.2 = 0
Config Portb.0 = Output
Config Portb.1 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Portb.0 = 0
Portb.1 = 0
Const Kp = 0.9
Const Ki = 0.8
Const Kd = 0.86
Dim Cny_counter As Word
Dim Timer2_counter As Byte
Dim Print_flag As Bit
Dim Esum As Single
Dim E As Single
Dim Ta As Single
Dim Ealt As Single
Dim Soll As Single
Dim Ist As Single
Dim Kp_buffer As Single
Dim Ki_buffer As Single
Dim Kd_buffer As Single
Dim Kpid_buffer As Single
Ta = 0.05
Soll = 20
Print "PID-Regler mit CNY70"
Print
Waitms 500
Portb.0 = 1
Portb.1 = 0
Enable Interrupts
Do
If Print_flag = 1 Then
Reset Print_flag
Print "Counter = " ; Ist
Print
End If
Loop
End
Isr_von_int0:
Incr Cny_counter
Return
Isr_von_timer2:
Timer2 = 178
Incr Timer2_counter
If Timer2_counter = 10 Then
Set Print_flag
Timer2_counter = 0
Ist = Cny_counter
Cny_counter = 0
Gosub Regulator
Soll = Soll + Kpid_buffer
Pwm1a = Soll
End If
Return
Regulator:
E = Soll - Ist
Esum = Esum + E
Kp_buffer = Kp * E
Ki_buffer = Ki * Ta
Ki_buffer = Ki_buffer * Esum
Kd_buffer = E - Ealt
Kd_buffer = Kd_buffer / Ta
Kd_buffer = Kd_buffer * Kd
Kpid_buffer = Kp_buffer + Ki_buffer
Kpid_buffer = Kpid_buffer + Kd_buffer
Ealt = E
Return
Jetzt zu meinem Problem:
ich steuere die Geschwindigkeit über PWM, allerdings lese ich aber die Anzahl der Impulse in einer gewissen zeit (ta) ein. Das führt i-wie zu Problemen. Wie muss ich das Programm verändern, damit die Regelung vernünftig funktioniert?
Vielen Dank
Gruß
Chris
Liste der Anhänge anzeigen (Anzahl: 1)
danke!
zu 1.: ta habe ich z.Z. garnicht berücksichtigt. muss man auch nicht umbedingt man kann auch direkt Ki mit Ta multiplizieren. willa und ich haben bei der ausarbeitung erstmal geschätze grobe werte eingetragen. die aber wie ich dann feststellte doch so erstmal gefühlsmäßig die besten sind.
zu 2.: bild im anhang! sollte zu meine beschreibung in meinem thread passen.
zu 3.: das siehst du richtig. bei mir fährt der roboter allerdings erst im leerlauf ab einem pwm-wert von 130 los. wenn er dann bergab fährt verringert er einfach den wert bis auf null bin ich nur gekommen wenn ich mit der hand die ketten extrem beschleunigt habe was allerdings im normalbetrieb nie vorkommen kann. wenn du im prinzip jedoch einen negativ pwm-wert bräuchtest könntest du entweder versuchen das ganze zu umgehen indem du eine kontroliert motorbremse durchführst (kurzschließen) oder "einfach" die drehrichtung der motoren umkehrst und gegensteuerst. mit der thematik beschäftigt oberallgeier sich gerade bei seinem miniD0. klings soweit ganz leicht soll aber doch recht kompliziert sein. daran würde ich an deiner stelle erstmal nicht denken.
gruß Bammel