guten tag zusammen in einem anderen thread habt ihr mir geholfen, meine motoren richtig anzusteuern! nun hoff ich dass ihr mir auch in dieser sache helfen könnt! ich versuch nun mal möglichst alle nötigen infos zu beschreiben bevor ich das problem erläutere! ziel: das ziel ist ein roboter mit zwei seperaten achsen hinten und einer freilaufenden kugel vorne. diesen will ich zum fahren bringen, und das möglichst genau! bedeutet: - gerade (als wirklich gerade!) (vorwärts und rückwärts) - kurven - exakt berechnete strecken (10cm nach vorne, 7cm zurück) - exakte winkel (90° drehung, 180°wende) aufbau mechanik: - getriebe an DC-Motor (ein bauteil) - dieses getriebe treibt eine achse an, an der eine lochscheibe (momentan mit 90x0,1mm strichen) befestigt ist - von dieser achse wird über eine kette die achse mit dem rad angetrieben - übersetzung von lochscheibenachse zu antriebsachse 3,5:1 aufbau elektronik: - µC is ein PIC16F877 - mit diesem steuer ich den Motortreiber L298 (1 treiber für 2 motoren) - motoren 4,5V - 15V I max. unter last 2,5A (last = festhalten) (treiber geht laut datenblatt nur bis 2 A mit, aber bis jetz gab es noch keine probleme, da die belastung nur kurzzeitig zu testzwecken so hoch ist) - die lochscheiben werden über jeweils eine gabellichtschranke ausgewertet soweit so gut! hardwaretechnisch sehe ich kein problem, aber ich lasse mich gern beraten! neue lochscheiben mit 32x0,3mm strichen sind bereits in arbeit, nur als alternative zu testzwecken! vorweg nun noch meine ideen zum programm: - die motoren sollen durch PWM in der geschwindigkeit geregelt werden - ich messe die zeit die von einem strich zum nächsten vergeht - ich gebe eine zeit vor - die zeiten werden verglichen - ist die gebrauchte zeit zu groß wird der duty cycle erhöht - ist die gebrauchte zeit zu klein wird der duty cycle verkleinert - evtl sollten auch die räder gegeneinander verschalten sein, so dass ich ein rad bremse, und das andere dadurch auch langsamer wird, sich quasi angleicht nun komm ich zu meinem eigentlichen anliegen: ich hab es bereits geschafft, dass ich eine zeit vorgebe und die räder schneller bzw langsamer laufen. gleichzeitig werden die motoren nachgeregelt wenn sie belastet werden (als beispiel: bremsen durch finger). in einem anderen programm hab ich es geschafft, dass die beiden motoren synchron laufen, also wenn einer gebremst wird (durch finger) wird der andere auch langsamer. beides in einem programm hab ich noch nicht geschafft. aber das ist nun nicht so schlimm. schlimmer ist, ------------------------------------------------------------------------ --------------------- ich bekomme die beiden motoren nicht gleichschnell und ich komm nicht dahinter an was es liegt ------------------------------------------------------------------------ --------------------- es ist kein so großer unterschied, aber er fährt eben nicht genau gerade. ich hab mich bereits mit vielen beiträgen über regler beschäftigt, aber ich kann all das gelesene nicht auf mich anwenden. ab jetz kommen die fragen! ;) grobe zusammenfassung von dem programm: _________________________________ if time_motor1 > vorgabe_time then duty_motor1 = 250 if time_motor1 < vorgabe_time then duty_motor1 = 50 if time_motor2 > vorgabe_time then duty_motor2 = 250 if time_motor2 < vorgabe_time then duty_motor2 = 50 _________________________________ das ist doch nun eine P-Regelung? auf diese weise pendelt sich der motor grob auf die vorgegebene geschwindigkeit ein! dies ist aber recht ungenau!? daran liegt auch evtl die kleine geschwindigkeitsdifferenz der beiden motoren! mir wurde anderweitig schon vorgeschlagen einen PI-Regler zu benutzen! laut http://www.rn-wissen.de/index.php/Regelungstechnik gibt es für die softwareregelung folgende formeln esum = esum + e y = Kp * e + Ki Ta esum e = sollwert - istwert esum = summe aller e y = stellgröße (bei mir eben pulsweite!?) Kp = verstärkungsfaktor proportional (damit komm ich nicht ganz zurecht) Ki = verstärkungsfaktor integrak (dito) Ta = abtastzeit (zeit in der die geschwindigkeit gemessen wird!? oder abstand zwischen zwei messungen!?) ich glaube ich habe schon grob verstanden was welche variable tut, aber irgendwie kann ich damit nichts sinnvolles anstellen. zusammenfassend *(habe nun ja doch recht viel geschrieben)* ich bräuchte jemand der mir erklärt, bzw nen schubser in die richtige richtung gibt, wie ich die motoren am besten regeln kann, bzw wie ich digital am besten einen PI-Regler aufbauen kann. PS: ich programmiere in JAL! aber ich glaube nicht dass mein problem an der sprache liegt, sondern eher an allgemeinem wissensdefizit! ich hoffe es kämpft sich jemand hier durch und stößt eine hilfreiche diskussion an! ;) danke für die mühe rappl
Florian Rappel schrieb: > ___________________________________ > if > time_motor1 > vorgabe_time then > > duty_motor1 = 250 > > if > time_motor1 < vorgabe_time then > > duty_motor1 = 50 > > if > time_motor2 > vorgabe_time then > > duty_motor2 = 250 > > if > time_motor2 < vorgabe_time then > > duty_motor2 = 50 > ___________________________________ > > das ist doch nun eine P-Regelung? auf diese weise pendelt sich der motor > grob auf die vorgegebene geschwindigkeit ein! Wenn ich das richtig verstanden habe, nicht wirklich. Du schaltest nur den Motor schnell genug zwischen '1.tem und 2.tem Gang' um, so dass ihm aufgrund der Massenträgheit gar nichts anderes übrig bleibt als den Rotor mit einer bestimmten Drehzahl zu drehen. Wenn du den Motor aber echt regeln willst, dann regelst du die Versorgungsspannung des Motors so ein, dass diese konstant ist UND diese die gewünschte Geschwindigkeit ergibt (bei konstanter Last) > mir wurde anderweitig schon vorgeschlagen einen PI-Regler zu benutzen! > laut Würde ich auch sagen. Der P Anteil stellt grob ein, der I Anteil regelt die noch vorhandene Reelabweichung aus. > http://www.rn-wissen.de/index.php/Regelungstechnik > gibt es für die softwareregelung folgende formeln > > esum = esum + e > y = Kp * e + Ki Ta esum > > e = sollwert - istwert > esum = summe aller e > y = stellgröße (bei mir eben pulsweite!?) > Kp = verstärkungsfaktor proportional (damit komm ich nicht ganz zurecht) > Ki = verstärkungsfaktor integrak (dito) > Ta = abtastzeit (zeit in der die geschwindigkeit gemessen wird!? oder > abstand zwischen zwei messungen!?) > > ich glaube ich habe schon grob verstanden was welche variable tut, aber > irgendwie kann ich damit nichts sinnvolles anstellen. Warum nicht? Du brauchst eine Funktion, die in regelmässigen Abständen aufgerufen wird. Dort stellst du den Istwert fest. Zusammen mit dem Istwert ergibt sich daraus der Fehler e. Mit diesem Werten beschickst du die obige Gleichung und kriegst damit einen Wert, den du an das Stellglied gibst. Daraufhin reagiert der Motor und wenn du das nächste mal in diese Funktion kommst hast du einen anderen Istwert, aus dem sich ein neuer Fehler durch Vergleich mit dem Sollwert ergibt, was nach Durchlaufen der Formeln zu einem neuen y führt, welches wieder an das Stellglied geht. etc. etc.
Ich habe bei einem ähnlichen Problem Soll- und Istwert verglichen, die Differenz gebildet, entschieden ob mehr oder weniger Geschwindigkeit benötigt wird und dann nicht eine Konstante addiert oder subtrahiert, sondern die Differenz herangezogen. Je größer die Abweichung war, umso mehr oder weniger wurde der PWM-Ausgang korrigiert. Bei mir ging es damals darum, einen belasteten (mit veränderlicher Last) Gleichstrommotor auf 1000 rpm zu halten. Und laut Skope hat das bis auf 1 bis 2 rpm gepasst. Michael
Michael W. schrieb: > Ich habe bei einem ähnlichen Problem Soll- und Istwert verglichen, die > Differenz gebildet, entschieden ob mehr oder weniger Geschwindigkeit > benötigt wird und dann nicht eine Konstante addiert oder subtrahiert, > sondern die Differenz herangezogen. Je größer die Abweichung war, umso > mehr oder weniger wurde der PWM-Ausgang korrigiert. Genau das macht der P Anteil im PI-Regler > e = sollwert - istwert > y = Kp * e Du hast sicherlich auch nicht einfach die Differenz direkt hergenommen, sondern diese mit einem Faktor gewichtet, den du experimentell ermittelt hast.
okay, theoretisch hört sich dass logisch an! aber wie kann ich den für mich geeignetsten Ki oder Kp berechnen? kann ich den üebrhaupt berechnen? oder muss ich den ausprobieren?
Florian Rappel schrieb: > okay, theoretisch hört sich dass logisch an! > aber wie kann ich den für mich geeignetsten Ki oder Kp berechnen? kann > ich den üebrhaupt berechnen? oder muss ich den ausprobieren? Man könnte sie berechnen, wenn man alle Parameter der kompletten Regelstrecke kennt. In der Praxis kennt man die aber nicht. Zuerst Ki auf 0 (und damit effektiv abschalten). Kp solange erhöhen, bis die Regelung zu schwingen anfängt. Dann wieder etwas zurücknehmen und Ki dazugeben. Aber in dem von dir benutzten Link auf RN gibt es doch ein Kapitel zur 'Dimensionierung des Reglers'
gut, danke, dass werde ich nun mal in angriff nehmen! aber der wert von Ta, wie soll ich den festlegen? die zeit die vergeht von einer berechnung von e bis zur nächsten!? aber nun nochmal allgemein ne frage! liegt es dann wohl wirklich an der ungenauen regelung, dass meine räder verschieden drehen? weil die mechanik ist wirklich professionel gemacht! (zahnräder auf CNC-Maschine gefräst, lochscheiben gelasert, ...) und ich hab nun halt lange gerätselt und rumgesucht, ob es an mechanik oder programm liegt! der sinn der regelung ist ja eventuelle hardware unterschiede auszugleichen!?
Florian Rappel schrieb: > gut, danke, dass werde ich nun mal in angriff nehmen! aber der wert von > Ta, wie soll ich den festlegen? die zeit die vergeht von einer > berechnung von e bis zur nächsten!? Ja. Aber da Kp und Ki dimensionslose Werte sind, kannst du für Ta auch einfach 1 annehmen. Der wirkliche Ta-Wert (Zeit zwischen 2 Aufrufen der Regelschleife) geht dann einfach in das Ki ein. > aber nun nochmal allgemein ne frage! liegt es dann wohl wirklich an der > ungenauen regelung, dass meine räder verschieden drehen? Das kann viele Ursachen haben. Als allererstes fällt mir dazu ein, dass es wohl keine 2 Motoren gibt, die wirklich exakt gleich laufen. Deine Räder werden auch nicht exakt den gleichen Durchmesser haben, etc.
Hi Florian, dass beide Motoren gleich schnell laufen, wirst du niemals erreichen. Den Fehler bei gleicher PWM und unterschiedliche Geschwindigkeit wird mit der Qualität der Motoren abnehmen, aber sich niemals auf 0 korrigieren lassen. Zusätzlich kommen die Fehler bedingt durch die Mechanik deines Aufbaus hinzu (wieder mehr Toleranz). Zum Einstellen hab ich bisher immer entweder nach Ziegler/Nichols oder Takahashi gerichtet, half bei meiner Diplomarbeit ganz gut (Blockkommutierung & Hallsensoren bei BLDC Motoren lassen leider nie eine 100% Regelung zu). Einfach mal danach googlen, gibt hervoragende Uni Skripte zur Regelungstechnik und Ziegler/Nichols oder Takahashi. Aber um das emperische Einstellen der Parameter wirst du nicht rumkommen. mfg wolfi
sou, nach vielem rumprobieren und ergebnislosen rechnungen bin ich genausoweit wie zuvor, nur noch etwas unglücklicher! ich stell nun mal eines meiner vielen programme rein und versuche daran zu erläutern was mein plan war/ist! die variablendeklarierungen etc hab ich weggelassen. ich habe versucht mit dieser formel zu arbeiten: y = Kp * e + ( Ki Ta esum ) Programm ____________________________________________________ soll_speed = 5 ;vorgabe der zeit ---------------------------------------------- while mot1_LS loop end loop ;timer wird zurückgesetzt tmr1L = 0x00 tmr1H = 0x00 ist_speed_mot1 = 0 while !mot1_LS loop ;timer beginnt zu zählen if tmr1L == 255 then ist_speed_mot1 = ist_speed_mot1 + 1 while tmr1L == 255 loop end loop end if end loop ;dieser teil übernimmt nur die zeitmessung zwischen zwei strichen ---------------------------------------------- ;der folgende teil soll die regelung sein e = soll_speed - ist_speed_mot1 ;berechnung der differenz esum = esum + e y = 1 * e + 0 * esum ;testweise setzen der faktoren duty_mot1 = duty_mot1 + y ;verändern des dutycycles in abhängigkeit von y PWM_set_DutyCycle (duty_mot1, duty_mot2) ;Pulsweitenmodulation ______________________________________________________ ich habe auch ein programm mit ganz anderem ansatz! dies geht dann aber eher in die richtung von michael w. >Ich habe bei einem ähnlichen Problem Soll- und Istwert verglichen, die >Differenz gebildet, entschieden ob mehr oder weniger Geschwindigkeit >benötigt wird und dann nicht eine Konstante addiert oder subtrahiert, >sondern die Differenz herangezogen. Je größer die Abweichung war, umso >mehr oder weniger wurde der PWM-Ausgang korrigiert. jedem wert von e (zwischen 5 und -5) habe ich einen bestimmten wert y zugeordnet! je größer e desto größer y! aber beide programme erfüllen nicht ihren zweck! unter anderem kann ich soll_speed verändern wie ich will, die tatsächliche geschwindigkeit bleibt die selbe! und der geschwindigkeitsunterschied ist immernoch so groß wie davor. wolfi: >dass beide Motoren gleich schnell laufen, wirst du niemals erreichen. >Den Fehler bei gleicher PWM und unterschiedliche Geschwindigkeit wird >mit der Qualität der Motoren abnehmen, aber sich niemals auf 0 >korrigieren lassen. was für eine lösung könnte es dann geben dass mein roboter gerade ausläuft!? ich bin über jeden tritt in den hintern dankbar! ich sitz heute schon seit über 6 stunden daran und ich hab das gefühl, durch das ständige um die ecke denken hab ich nur noch knoten im kopf. hat vllt jemand schon so n programm geschrieben an dem ich mich evtl grob orientieren könnte!? egal ob jal oder c oder sonst was! ich denke so vom groben prinzip her wirds wohl in jeder sprache ähnlich sein... vielen dank für eure mühe EDIT: die räder sind gekaufte modelbau aluräder! die sollten eigentlich den gleichen durchmesser haben!
Florian Rappel schrieb: > duty_mot1 = duty_mot1 + y ;verändern des dutycycles in > abhängigkeit von y > Nein. y ist bereits der neue Duty-Cycle. Du musst mit dem K anpassen, dass der Fehlerwert sich in einen vernünftigen Duty Cycle umrechnet. Erwarte nicht von einem reinen P Regler, dass er den Sollwert auch einstellen kann! Der P-Regler soll einfach nur nachstellen, wenn sich die Last verändert oder sich der Sollwert ändert. Aber der sich einstellende Istwert kann und wird vom Sollwert abweichen (*). Wichtig ist nur, dass du das K nicht zu hoch auufdrehst, sonst beginnt die Regelstrecke zu schwingen: Regler dreht auf, Motor beschleunigt, schiesst übers Ziel hinaus, Regler macht zu, Moter wird langsamer, geht wieder unter eine stabile Drahzahl, Regler dreht auf, Motor beschleunigt, .... Aber ausser dem Zusammenhang "Sollwert steigt - Motordrehzahl steigt auch" gibt es da wenig zusammenhang. Der Regler muss nur reagieren, wenn du einen Motor mutwillig bremst, dann dreht er auf und gibt mehr Stoff auf den Motor. Lass dir auch den e-Wert, Istwert, Sollwert, daraus resultierenden y Wert mal irgendwo ausgeben und studiere wie sich das System verhält. Unter Umständen hast du nämlich keine Mitkopplung gebaut sondern eine Gegenkopplung und der K Wert muss negativ sein. (*) Erst der I-Anteil beseitigt dann diese Regelabweichung.
> vllt jemand schon > so n programm geschrieben an dem ich mich evtl grob > orientieren könnte!? Das würde dir nicht helfen, denn das Geheimnis eines Reglers steckt in seinen K Werten. Und die sind bei jeder Regelstrecke anders.
>Nein. >y ist bereits der neue Duty-Cycle. >Du musst mit dem K anpassen, dass der Fehlerwert sich in einen >vernünftigen Duty Cycle umrechnet. bedeutet, dass ich mit dieser formel y = kp * e + Ki Ta esum direkt einen wert 0 < y < 255 herausbekommen muss, und dementsprechend Kp und Ki wählen muss!?
Florian Rappel schrieb: >>Nein. >>y ist bereits der neue Duty-Cycle. >>Du musst mit dem K anpassen, dass der Fehlerwert sich in einen >>vernünftigen Duty Cycle umrechnet. > > bedeutet, dass ich mit dieser formel > > y = kp * e + Ki Ta esum > > direkt einen wert > > 0 < y < 255 > > herausbekommen muss, und dementsprechend Kp und Ki wählen muss!? Ganz genau Der P Anteil sorgt nur dafür dass e sich auf einen konstanten Wert einpendelt. Der ist aber nicht notwendigerweise 0!
zum obigen noch: e = w - x (sollwert - istwert) sobald die drehzahl zu hoch ist, ist der istwert größer als der sollwert und e wird negativ! wenn e negativ wird, dann bekomm ich einen negativen dutycycle!? und angenommen ich schaff es irgendwie dass sollwert = istwert ist, dann hab ich e = 0 und dadurch auch einen dutycycle von 0 !?
Florian Rappel schrieb: > zum obigen noch: > > e = w - x (sollwert - istwert) > > sobald die drehzahl zu hoch ist, ist der istwert größer als der sollwert > und e wird negativ! > wenn e negativ wird, dann bekomm ich einen negativen dutycycle!? Ja. Den wirst du natürlich klampen und auf den Bereich 0 .. 255 einengen. Es sei denn dein Motor kann mit 'negativem Duty Cycle' aktiv gebremst werden. Letztenendes bedeutet ein negativer Dutycycle bei dir ja nur, dass kein Saft mehr auf den Motor gegeben werden muss und er ganz von alleine langsamer werden soll. Fällt die Drehzahl, wird e wieder positiv und der Regler gibt auch wieder Saft auf den Motor. Wie gesagt: Lass dir die Werte ausgeben! > und angenommen ich schaff es irgendwie dass sollwert = istwert ist, dann > hab ich e = 0 und dadurch auch einen dutycycle von 0 !? Auch klar: Ein Rad welches mit der exakt richtigen Drehzahl läuft, muss ja auch nicht angetrieben werden. Aber stör dich nicht daran. Ich sagte doch: Mit einem P-Regler alleine wird der Regler es nie schaffen die eingestellte Solldrehzahl auch tatsächlich zu erreichen. Es bleibt immer eine Regelabweichung! Erst der I-Anteil behebt diese.
>Wie gesagt: Lass dir die Werte ausgeben! ich bin momentan noch nich in der lage mir die werte aktiv ausgeben zu lassen, aber en paar sachen weiß ich ja! sollwert = den wert kann ich bewusst bestimmen erklärung zu istwert: ein bit meiner variablen ist_speed_mot1 sind 51µs! (ich benutze dafür den timer1 von meinem PIC) laut oszilloskop liegt die zeit von strich zu folgestrich auf meiner lochscheibe zwischen 100µs und 400µs! (je nach drehzahl, das ist ja das was ich steuern will) daraus folgt, dass mein byte ist_speed_mot1 so grob zwischen 1 und 8 liegt. e-wert und y-wert kann ich momentan noch nicht bewusst sehn. aber zumindest der e-wert erscheint mir logisch als differenz von soll und istwert! ich hoffe ich hab das nun einigermaßen verständlich rübergebracht!
>Aber stör dich nicht daran. Ich sagte doch: Mit einem P-Regler alleine >wird der Regler es nie schaffen die eingestellte Solldrehzahl auch >tatsächlich zu erreichen. Es bleibt immer eine Regelabweichung! Erst der >I-Anteil behebt diese. der I-Teil ist ja dann der hintere teil der formel mit Ki Ta esum !? ich versuche den ja auch mitreinzubringen! aber momentan bleibt es halt beim versuchen...
Florian Rappel schrieb: >>Aber stör dich nicht daran. Ich sagte doch: Mit einem P-Regler alleine >>wird der Regler es nie schaffen die eingestellte Solldrehzahl auch >>tatsächlich zu erreichen. Es bleibt immer eine Regelabweichung! Erst der >>I-Anteil behebt diese. > > der I-Teil ist ja dann der hintere teil der formel mit Ki Ta esum !? > ich versuche den ja auch mitreinzubringen! aber momentan bleibt es halt > beim versuchen... Ich sag nur 2-Frontenkrieg. Bring erst mal den P Anteil soweit zum Laufen (Kp hochfahren), bis der Motor sich auf eine Drehzahl einregelt und diese Drehzahl auch hält. Egal welche. Wenn du den Motor bremst, musst du spüren, dass der Regler Gas gibt und versucht die Drehzahl zu halten und wenn du die Bremse wieder lockerst gibt der Regler wieder nach aber die Drehzahl sollte im Idealfall gleich bleiben. Dann vergrößerst du Kp sukzessive immer mehr, bis die Drahzahl anfängt in Schwingungen zu kommen. Und erst dann kommt der I-Anteil ins Spiel!
Hi! >;der folgende teil soll die regelung sein > e = soll_speed - ist_speed_mot1 ;berechnung der differenz > esum = esum + e > y = 1 * e + 0 * esum ;testweise setzen der faktoren > duty_mot1 = duty_mot1 + y ;verändern des dutycycles in > abhängigkeit von y Also wenn ich das richtig beurteile hast du da eigentlich einen reinen I-Regler da dein Kp bei 1 ist und der Fehler, wenn auch an falscher Stelle, aufsummiert wird. Selbst bei negativem e klappt das. Dein Regler sollte eigentlich gehen. Ich vermute eher mal das dein "duty_mot1 " nicht das macht was du denkst. Versuch: - Setze duty_mot1 bei Programmstart auf 0 - setze Y konstant auf 1 - starte das Programm und beobachte den Motor/die PWM Sie müssen bis auf max hochlaufen, sonst ist was anderes Mist. .... wird eventuell duty_mot1 nochmal woanders übergeben/festgesetzt?.... .... wird deine "Regelung" überhaupt angesprungen/ausgeführt?... Viel Erfolg, Uwe
@ UWE >Also wenn ich das richtig beurteile hast du da eigentlich einen reinen >I-Regler da dein Kp bei 1 ist und der Fehler, wenn auch an falscher >Stelle, aufsummiert wird. die werte für Kp und Ki sind in meinem beispiel wohl etwas misslungen! Ki hab ich auf 0 gesetzt, dass der I teil für den anfang unbedeutend bleibt. und Kp = 1 hab ich nur zum test eingesetzt. für den P regler muss ich den wohl etwas größer wählen. >Selbst bei negativem e klappt das. aber das funktioniert ja eben nur durch meine nachfolgende formel duty_mot1 = duty_mot1 + y würde ich y direkt als dutycycle nehmen, würde ich negative werte als dutycycle bekommen... >Dein Regler sollte eigentlich gehen. der regler tu ja auch! aber er regelt eben seine drehzahl die er eben annimmt, aber ich kann die drehzahl nicht über den sollwert ändern! danke für deine tips, auf die werde ich noch eingehen! @ Karl Heinz Buchegger >Dann vergrößerst du Kp sukzessive immer mehr, bis die Drahzahl anfängt >in Schwingungen zu kommen. schwingungen bedeutet in meinem beispiel, dass das rad nicht mehr gleichmässig läuft, sondern ruckartig beschleunigt und abgebremst wird!? P und I anteil bedeutet quasi so viel wie grob und fein einstellung!? eine grobe regelung hab ich ja auch schon hinbekommen, aber eben nicht in form dieser formel, sondern mehr grob geschätzt! das versuch ich noch zu optimieren! auch dir danke für deine tips. ich versuch möglichst alles umzusetzen! nun aber noch ein allgemeines µC problem! wie schafft man es, einen einzelnen pin zu zerstören!? ich hab es geschafft! einer meiner digitalen ausgänge macht keinen mucks mehr... das hat mich grad ne weile beschäftigt!
Florian, naja wir haben es damals so gelöst, dass wir uns auf die Geschwindigkeitsregelung verlassen haben. Wir haben beide Motoren für sich geregelt und wenn du an beiden Motoren 20 cm/s hast, fahren die auch gleich schnell. Ist zwar schwammig. (ich beschreib dir die Lösung von uns nachm Feierabend etwas genauer) mfg Wolfi
ich würde den Mikrocontroller mal beiseite lassen, auf einem PC linuxcnc installieren und das Problem dort hinkriegen - dort kannst Du PWM steuern, mit PID's regeln, Schrittmotoren steuern, Encoder abfragen, und das ganze beliebig in Software (HAL) zusammenpappern. Da kannst Du eine Menge ohne Löten lernen. Wenn das funktioniert, dann als Code für einen uC abmalen. Wenn Du direkt auf einen PID-Regler zusteuern willst, dann sieh dir mal das PID Motor controller Projekt da an: http://hubbard.engr.scu.edu/embedded/avr/code/index.html -Michael
>Versuch: >- Setze duty_mot1 bei Programmstart auf 0 >- setze Y konstant auf 1 >- starte das Programm und beobachte den Motor/die PWM >Sie müssen bis auf max hochlaufen, sonst ist was anderes Mist. hab ich gemacht, mit dem oszilloskop beobachtet, und der dutycycle verändert sich so wie er das soll!
Florian Rappel schrieb: > aber das funktioniert ja eben nur durch meine nachfolgende formel > duty_mot1 = duty_mot1 + y Noch mal: Nein. Du darfst hier nicht noch einmal integrieren. Dann wäre das kein P Regler mehr, sondern ein I Regler. In Summe würdest du dann aber keinen PI-Regler implementieren sondern einen II^2 Regler. > würde ich y direkt als dutycycle nehmen, würde ich negative werte als > dutycycle bekommen... Jaaaaaa. Das ist auch richtig so! Interpretiere die negativen Duty-Cylces als 'Ich muss bremsen' Da du aber nicht aktiv bremsen kannst, setzt du in so einem Fall den dutycyle auf 0 und lässt den Motor auslaufen. Dein Regler, weiss ja nicht, dass du den Motor nicht bremsen kannst! Auch wenn er das noch so gerne möchte. y = ..... if( y < 0 ) y = 0; if( y > 255 ) y = 255; ... y an die PWM ausgeben
Hi! >hab ich gemacht, mit dem oszilloskop beobachtet, und der dutycycle >verändert sich so wie er das soll! Gut so, und er bleibt hoffentlich auch auf Max? Läuft deine Zeitmessung eigentlich als Sub? Ich werde das Gefühl nicht los das da was nicht stimmt Kann es sein das du nur die Strichbreite misst? Viel Erfolg, Uwe
Hi!
Ich kann mich auf meinen Bauch verlassen, habe vermutlich gerade den
Fehler gefunden:
> e = soll_speed - ist_speed_mot1 ;berechnung der differenz
Überlege mal wie "ist_speed_mot1" erzeugt wird, bzw. welche Werte er bei
"zu langsam" und "zu schnell" im Verhältnis zu "soll_speed " hat.
Eigentlich müsste deine PWM auf 0 gehen, warum die Motoren trotzdem noch
leiern ist mir aber unklar. Es wird doch kein Unter/Überlauf auftreten?
Begrenze mal unbedingt "duty_mot1" auf Max/Min.
Mir ist nochwas aufgefallen, wenn ich dein Progr. richtig verstehe.
Angenommen dein Motor steht, Sollwert=0 dann bewegt sich auch dein
Rad/die Schlitzscheibe nicht. Wie soll deine Zeiterfassung jemals
beendet werden? Eigentlich müsste sich dein Progr. aufhängen, es sei
denn du hast irgendwo ein Timeout mit eingebaut von dem wir nichts
wissen.
So, jetzt bist du drann mit Denken.
Viel Erfolg, Uwe
Vielleicht kannst du auch nicht nur jeden Motor für sich ansteuern, sondern die Werte die deine Lichtschranken zählen jeweils speichern und einen Vergleich von beiden Seiten in die Regelung mit einfließen lassen. z.B. Links hat 220 mal geschaltet, zur selben zeit hat die rechts nur 215 mal geschaltet also muss rechts schneller oder links langsamer werden bis die Werte übereinstimmen.
ich habe leider momentan ein zeitliches problem, daher komme ich an diesem projekt grad nicht viel weiter, aber ich schreibe sobald es was neues gibt! grüße rappl
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.