Sorry, dass ich mich jetzt erst melde, aber ich hatte sehr viel zu tun! *blödes G8*
Mittlerweile habe ich mir nicht so viele Gedanken um die Befestigung des Sensors gemacht, sondern viel mehr um das Programm selbst! Zu einem PID-Regler habe ich aber noch ein paar Fragen, vielleicht kann mir die ja jemand hier beantworten?
1. Sollte ich die PID-Wert berechnung in der Hautpschleife dauernd machen lassen, oder nur immer, wenn wieder der Sensor ausgelesen wird (also nach ta)??
2. Wie kann ich beide Motoren zum Synchronlauf "zwingen"? Also wie ich einen Motor auf einer const. Geschwindigkeit halte, das ist mir jetzt klar (auch wenn ich mir nicht sicher bin, ob ichs richtig umgesetzt habe).
3. Muss der Wert KPID_buffer (in meinem Beispiel) zum alten PWM-Wert addiert werden, also:
oder sollen die beiden miteinander multipliziert werden, also:Code:pwm1a = pwm1a + kpid_buffer
oder soll der PWM-Wert durch den KPID_buffer wert ersetzt werden, also:Code:pwm1a = pwm1a * kpid_buffer
Ich persönlich tendiere ja dazu, die Werte zu addieren, aber 100%ig sicher bin ich mir da nicht!Code:pwm1a = kpid_buffer
hier mal mein derzeitiger Code:
Natürlich kommen die Prints raus, wenns mal funktioniertCode:$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
Derzeit habe ich einfach einen Motor mit einem Holzzylinder auf der Achse (welcher halb weiß und halb schwarz ist) über einen CNY70 mittels Tape geklebt, nur Probeweise. Die Auswertung der fiktiven Drehzahl funzt sehr gut, da ich den CNY70 mittels einem 74HC14N (Schmitttrigger) auswerte.
Bitte nehmt die Werte für Kp, Ki und Kd nicht so ernst, sind nur testweise!
Meine eigentlich Frage ist einfach nur, ob die Programmstruktur hier stimmt, also die ganzen multi- und additionen im Hauptteil?!
Gruß
Chris






Zitieren

Lesezeichen