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:
Code:
pwm1a = pwm1a + kpid_buffer
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 = kpid_buffer
Ich persönlich tendiere ja dazu, die Werte zu addieren, aber 100%ig sicher bin ich mir da nicht!
hier mal mein derzeitiger Code:
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
Natürlich kommen die Prints raus, wenns mal funktioniert 
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
Lesezeichen