Hallo Leute,
für mein derzeitiges Projekt (https://www.roboternetz.de/phpBB2/viewtopic.php?t=50525) brauche ich einen PID-Regler. Natürlich habe ich schon einen Code, aber ich glaube, dass ich ein paar Fehler gemacht habe. Mein Anliegen ist, ob ihr mal meinen Code euch anschauen könntet und mir dann sagen könntet, obs so passt oder ob irgendwo grobe fehler enthalten sind! Bitte nicht die Reglerconstanten beachten, das sind nur Probewerte, da ich das ganze nicht am Roboter, sondern an einem normalen Motor probiere. Und es wäre toll, wenn ihr mir sagen könntet, wie ich damit 2 Motoren zum synchronlauf "zwingen" kann. Hier nun der Code:
Vielen Dank schonmal!Code:$regfile = "m32def.dat" $crystal = 16000000 $hwstack = 150 $swstack = 150 $framesize = 150 $baud = 19200 Config Portc.0 = Output Portc.0 = 0 Config Pind.2 = Input Config Portd.4 = Output Config Portd.5 = Output Config Portb.0 = Output Config Portb.1 = Output Portb.0 = 1 Portb.1 = 0 Portd.2 = 1 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 = 64 Timer2 = 6 On Timer2 Isr_von_timer2 Enable Timer2 Config Int0 = Rising On Int0 Isr_von_int0 Enable Int0 Dim Abtastrate_flag As Byte Dim Drehzahl_links As Word '3 '10 '70 Const Kp = 1.2 '0.5 Const Ki = 0 '0.6 Const Kd = 0 Dim Esum As Single Dim E As Single Dim Ta As Single Dim Ealt As Single Dim Soll As Word Dim Ist As Word Dim Kp_buffer As Single Dim Ki_buffer As Single Dim Kd_buffer As Single Dim Kpid_buffer As Single 'Dim Y As Word Dim Y As Integer Ta = 0.1 'ta = 0.1 --> 10 mal pro sek abtasten Soll = 250 Print "Let's go" Print Wait 1 Portc.0 = 1 Pwm1a = 400 Enable Interrupts Waitms 500 Do E = Soll - Ist 'Esum = Esum * 0.95 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 'Pwm1a = Pwm1a * Kpid_buffer 'Y = Kpid_buffer If Kpid_buffer <= 0 Then Y = Abs(kpid_buffer) Pwm1a = Pwm1a - Y Elseif Kpid_buffer >= 32000 Then Y = 32000 Pwm1a = Pwm1a + Y Else Y = Kpid_buffer Pwm1a = Pwm1a + Y End If 'Pwm1a = Pwm1a + Y 'Pwm1a = Pwm1a + Kpid_buffer ' Print "Ist = " ; Ist Print "Soll = " ; Soll Print "PWM1A = " ; Pwm1a Print "kp_buffer = " ; Kp_buffer Print "ki_buffer = " ; Ki_buffer Print "kd_buffer = " ; Kd_buffer Print "kpid_buffer = " ; Kpid_buffer Print "Y = " ; Y Print ' Loop End Isr_von_timer2: Timer2 = 6 Incr Abtastrate_flag If Abtastrate_flag = 100 Then Abtastrate_flag = 0 Ist = Drehzahl_links Drehzahl_links = 0 End If Return Isr_von_int0: Incr Drehzahl_links Return
Gruß
Chris







Zitieren

Lesezeichen