- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: PID-Regler mit PWM - Frage

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578

    PID-Regler mit PWM - Frage

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Da ist schon mal ein Pronzipielles Problem: mit dem Zählen der Impulse hat man eine nur relativ geringe Auflösung. Bei der Geringen Auflösung ist ein Differenzieren für eine PID Regler besonders schlecht. Wenn der Sollwert bei 10 sein soll, hat man bei funktionieren der Regelung für die Differenz wohl nur Werte von -1,0 oder 1 und damit alles andere als einen stetigen Regler.

    Wenn möglich sollte man besser per ICP die Zeit messen wann an der Lichtschranke Flanken auftreten. So hat man wesentlich mehr Informationen. Wenn die Pulse nicht zu schnell kommen könnte es auch noch in basic gehen. Dann kann man sich immer noch entscheiden ob man die Geschwindigkeit oder die Position nachregeln will. Wenn man die Postion nachregelt, kommt man schon mit nur einem PD Regler aus. Das ganze wird dann ein Speziallfall eines Teilweise digitalen PLLs.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hallo Besserwessi,

    danke für deine Antwort!
    Ich habe bei einer Servo-Rad umdrehung ca. 200 impulse, da ich ein "zwischenzahnrad" ablese
    Aber bei ICP brauche ich doch pro Rad einen "richtigen" timer, also beim mega32 den Timer1. dann bräuchte ich zwei mega32 für zwei Räder?!?!

    Ich möchte die Geschwindigkeit nachregeln!

    Gruß
    Chris

  4. #4
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Auch wenn man 2 Kanäle haben will, braucht an zur Zeitmessung nicht unbedingt 2 Timer. Es wäre aber gut wenn man 2 ICP Einheiten hätte, was der Mega32 aber auch nicht hat. Der Timer wird ja einfach durchlaufen. Man kann sich aber helfen indem man die Zeitmessung in Software macht : Das Lichtschrankensignal erzeugt einen Interrupt, und man ließt dann im Interrupt den Zählerstand aus. Die Genauigkeit ist zwar nicht so gut wie mit ICP, sollte aber noch ausreichend sein. Die Zeiten sollten dann ja in der Größenordnung 10 ms liegen - für den µC schon eine relativ lange zeit. Wenn man will kann man für den einen Kanal ja ICP nutzen, muß es aber nicht.

    Die Zeit für eine Periode und damit die Geschwindigkeit kriegt man dann aus der Differenz aufeinander folgender Zeiten.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Und was ist, wenn ich einen Timeroverflow zwischen zwei Impulsen habe?

    Gruß
    Chris

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von Bammel
    Registriert seit
    11.12.2004
    Ort
    Bremen
    Alter
    36
    Beiträge
    1.400
    hallo,

    ich habe es gerade mit hilfe von willa und oberallgeier (danke nochmal an dieser stelle) für meinen roboter eine geschwindigkeitsregelung auf die beine gestellen. das ganze ist ein PI-Regler und erfolgt in mm/s nun habe ich mit erfolg eine steigung von 70% in einer geschwindigkeit von 150mm/s rauf und runterfahren können. ohne regler kam der bot nicht rauf und raste runter! mehr zum algo werde ich morgen abend berichten! nun ist es zeit ins bett zu gehen.

    gruß und gute nacht vom bammel

  7. #7
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Der Timerüberlauf ist kein Problem, solage zwischen 2 Interrupts höchstens 1 Überlauf auftreten kann. Wenn man bei einem 16 Bit Timer mit Word Variablen (16 Bit) rechnet und Überläufe ignoriert kommt das richtige Ergebnis raus.

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von Bammel
    Registriert seit
    11.12.2004
    Ort
    Bremen
    Alter
    36
    Beiträge
    1.400
    so hier hab ich eine erklärung niedergeschreiben

    https://www.roboternetz.de/phpBB2/ze...=474658#474658

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    habs mir gerade durchgelesen ... bin sehr begeistert von dem Video
    aber drei fragen habe ich noch dazu:
    1. welchen wert hast du für ta? 0.00005?
    2. kannst du mir das mit excel erklären oder soll ich willa fragen?
    3. wenn der robi aber z.b. berab fährt, dann ist der benötigte pwm-wert zum wegfarhen kleiner!?! führt dies nicht zu problemen?

    Gruß
    Chris

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von Bammel
    Registriert seit
    11.12.2004
    Ort
    Bremen
    Alter
    36
    Beiträge
    1.400
    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
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken formelbildung.jpg  

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen