Forum: Mikrocontroller und Digitale Elektronik Regelung von 2 DC-Motoren mit Lichtschranke


von Flo R. (rappl)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael W. (retikulum)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Flo R. (rappl)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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'

von Flo R. (rappl)


Lesenswert?

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!?

von Karl H. (kbuchegg)


Lesenswert?

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.

von wolfi (Gast)


Lesenswert?

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

von Flo R. (rappl)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

> 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.

von Flo R. (rappl)


Lesenswert?

>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!?

von Karl H. (kbuchegg)


Lesenswert?

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!

von Flo R. (rappl)


Lesenswert?

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 !?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Flo R. (rappl)


Lesenswert?

>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!

von Flo R. (rappl)


Lesenswert?

>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...

von Karl H. (kbuchegg)


Lesenswert?

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!

von Uwe (Gast)


Lesenswert?

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

von Flo R. (rappl)


Lesenswert?

@ 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!

von wolfi (Gast)


Lesenswert?

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

von Michael H. (mah)


Lesenswert?

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

von Flo R. (rappl)


Lesenswert?

>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!

von Karl H. (kbuchegg)


Lesenswert?

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

von Uwe (Gast)


Lesenswert?

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

von Uwe (Gast)


Lesenswert?

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

von rgysdgtawerfga (Gast)


Lesenswert?

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.

von Flo R. (rappl)


Lesenswert?

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
Noch kein Account? Hier anmelden.