PID und Motorsteuerung durch PWM

Ich habe ein Potentiometer, das eine analoge Spannung im Bereich von 0-5 V liefert. Ich betrachte diesen POT als Drosseleingang für den Motor. Wenn ich die Topfgeschwindigkeit ändere, erhöhe und verringere sie auf der Grundlage der vom Topf kommenden Spannung. Ich erfasse die analoge Spannung vom ADC meiner ATMEL-MCU. Meine MCU arbeitet mit 5V.

Angenommen, der analoge Eingang vom POT beträgt 2 V. Und ich gehe davon aus, dass das Befehlssignal 200 U / min für den Motor beträgt. Mein Motor hat einen Hallsensor o / p, von dem ich die aktuelle Drehzahl des Motors ablesen kann, die beispielsweise 120 U / min beträgt.

error = set_speed - current_speed  = 200 -120 = 80 RPM

Jetzt wende ich die PID auf dieses Fehlersignal (80 U / min) an. Ich bekomme einen Controller o / p.

Die Motordrehzahl wird durch Ändern des PWM-Tastverhältnisses (16-Bit-Register) gesteuert. Die große Frage ist jedoch, dass PWM zur Steuerung der Motordrehzahl verwendet wird. Nun, wie man diesen Controller-Ausgang verwendet, um die PWM-Eingabe meiner MCU zu ändern

Wie bezieht sich PWM auf das O / P-Signal des Controllers, um die Geschwindigkeit anzupassen?

Antworten (2)

Beim Einrichten eines PID-Reglers benötigen Sie Skalierungsparameter, die die abstrakten PID-Zahlen in die Eigenschaften der realen Welt übersetzen. In ähnlicher Weise müssen Sie auch maximale und minimale Grenzen für P, I bzw. D haben, die ebenfalls auf die Ausgangseigenschaften skaliert werden müssen.

Sie haben eine bestimmte Spannung, die die maximale Drehzahl des Motors ist. Diese angegebene Spannung muss in ein maximales Tastverhältnis der PWM übersetzt werden. Vielleicht sind es 5 V und dann ist das Maximum 100% Einschaltdauer.

Der Skalenwert, den Sie für den PID-Regler verwenden müssen, ist dann dieses maximale Tastverhältnis. Die Einheit sind Timer-Ticks des Timers, mit dem Sie die PWM erzeugen.

Stellen Sie außerdem sicher, dass Sie die Möglichkeit haben, den Messwert des Hallsensors mit Ihren PID-Regleraktualisierungen zu synchronisieren. Sie können das System nicht schneller regeln, als Sie den Sensor lesen können. Die Lesevorgänge müssen ebenfalls skaliert werden, wahrscheinlich ist es am einfachsten, sie auch auf den Arbeitszyklus zu skalieren, sodass Sie überall dieselbe Einheit haben.

Programmiertechnisch ist es viel einfacher, mit diesem 16-Bit-Timer-Tick-Rohwert zu arbeiten, als beispielsweise mit Volt, Prozent der Einschaltdauer, Drehzahl usw.

Ich gehe davon aus, dass der Ausgang seines Sensors Spannung und sein Eingang Spannung vom Potentiometer ist, also wäre es natürlich, alles auf Spannung zu skalieren und PID mit Spannung als Steuerung zu machen und es dann in Tastverhältnis zu übersetzen. Aber meistens stimme ich dir zu.
Mein Hallsensor o / p hat die Form von Impulsen.
Sie sagen ... Die Lesevorgänge müssen auch skaliert werden. Wahrscheinlich ist es am einfachsten, sie auch auf den Arbeitszyklus zu skalieren, sodass Sie überall dieselbe Einheit haben. ... was ich davon habe, ist, dass die Eingangsvariable die eingestellte Geschwindigkeit ist und o / p die tatsächliche Geschwindigkeit ist. Sie meinen also, überall dieselbe Einheit zu haben. Eingangsgeschwindigkeit und tatsächliche Geschwindigkeit, die auf den Fehlerdetektor angewendet werden sollten auf die PWM-Eingabe herunterskaliert. In diesem Fall habe ich in meinem gesamten Anlagenmodell die gleiche PWM-Eingabeeinheit.
@ Haris778 Es gibt keine Spannung innerhalb des Programms, Spannung ist eine künstliche Einheit, die geschaffen wurde, damit Menschen verstehen, was vor sich geht. Innerhalb des Programms haben Sie eine Ausgabe als Roharbeitszyklus, ausgedrückt in Timer-Ticks, und eine Eingabe als einen anderen Rohwert, ausgedrückt in Bits Ihrer ADC-Auflösung, oder als Messwerte Ihres Sensors / Ihrer Timer-Einheit usw. Es ist nicht sinnvoll, beide zu skalieren Ausgang und Eingang zu einer künstlichen Spannungseinheit, die niemanden außer Menschen interessiert. Wenn Sie kein Display haben, das die gemessene Spannung anzeigt, muss es nicht in Ihrem Programm enthalten sein.
@ user6363 Ja, ich denke, Sie werden Impulse pro Zeiteinheit als Eingabe haben. Viele Fehler und Verwirrung in dieser Art von Programmen stammen von Programmierern, die überall verschiedene Einheiten verwenden und irrationale Entscheidungen treffen wie "Oh, aber das wird 3,3 V sein und es gibt eine Dezimalzahl, also muss ich Gleitkommazahlen verwenden". So denken PC-Programmierer. Eingebettete Programmierer müssen näher am Metall sein.
Ich stimme Ihnen zu, aber ich habe versucht, es aus Sicht der automatischen Steuerung zu erklären. Ich weiß, dass die Spannung in der MCU nur eine künstliche Einheit ist, aber ich denke, es ist am einfachsten zu verstehen, wie Geschwindigkeit mit Spannung und Spannung mit Arbeitszyklus verknüpft ist.
Ist es richtig, bitte vorschlagen ??
@Lundin Aso Wenn ich die interessierende i / p- und o / p-Variable als PWM-Eingabe nehme, wird in diesem Fall mein Systemreaktionsdiagramm (Überschwingen, Oszillation, stationäre Reaktion) in Bezug auf die PWM-Eingabe und nicht in Bezug auf die Geschwindigkeit sein. ?? Wie geht es weiter .. bitte vorschlagen ?

Bei voller Einschaltdauer erhalten Sie maximale Geschwindigkeit, und bei Null-Einschaltdauer erhalten Sie überhaupt keine Drehung. Ihr Fehler kann auch 0 und maximal sein, wenn Sie volle Geschwindigkeit wünschen und der Motor nicht dreht. Die volle Einschaltdauer entspricht dem vollen DC-Bereich bis 5 V, die Einschaltdauer der halben Periode entspricht 2,5 V und so weiter. Sie müssen die Spannung, die Sie als Ausgang in Ihrer Berechnung von PID erhalten, in das Tastverhältnis umwandeln. Wenn der Ausgang des PID beispielsweise 1 V (im Bereich von 0-5 V) beträgt, sollte Ihr Arbeitszyklus 0,2 betragen. Hoffe das hilft.

Sie sagen .... Sie müssen eine Umwandlung von der Spannung vornehmen, die Sie als Ausgang in Ihrer Berechnung meiner PID in das Tastverhältnis erhalten. ... aber meine Ausgabe der PID-Berechnung ist die Geschwindigkeitsdifferenz. Sagen Sie irgendetwas über die Spannung?
Ich wende PID auf den Geschwindigkeitseingangsbefehl an - tatsächliche Motorgeschwindigkeit ... wie kommt es dann, dass der O / P des PID-Controllers eine Spannung ist?
Die Eingabe Ihrer PID ist ein Drehzahlfehler (ausgedrückt in welchen Einheiten, U / min?). Wenn dies der Fall ist, müssen Sie der maximalen Drehzahl Werte als volle Einschaltdauer und der Nulldrehzahl keine Drehung zuweisen. Und weil die Spannung linear vom Arbeitszyklus abhängt und die Motordrehzahl linear von der Spannung abhängt, haben Sie alles. Betrachten wir das System als LTI.
Es ist sehr wichtig, dass Sie überall die gleiche Einheit verwenden. Wenn Sie in einem Atemzug von RPM sprechen, im nächsten Atemzug Arbeitszyklus und im dritten Atemzug Spannung, werden Sie nichts als Verwirrung erreichen. Wählen Sie eine Unisono-Einheit aus und verwenden Sie diese während des gesamten Programms. Die Spannung scheint nicht intuitiv zu sein, da sie nur ein Mittelschritt zwischen dem in Timer-Ticks ausgedrückten PWM-Tastverhältnis und der in U / min ausgedrückten Motordrehzahl ist.
Sie meinen also, den Durchschnittswert zu finden (wie ich bei maximaler Einschaltdauer weiß, was U / min ist und bei minimaler Einschaltdauer von 0 U / min auch Null ist), sagen wir für 1 U / min, wie hoch der Wert des Tastverhältnisregisters sein sollte ... Da ich weiß, dass der Fehler 80 U / min beträgt, erhöhen Sie in diesem Fall den Wert des Betriebsregisters um 80 * (digitaler Betriebswert für 1 U / min). Richtig?
Ihre PID ist nicht linear (es gibt P und I und D), daher wird das Tastverhältnis nicht nur um 80 erhöht, wenn der Fehler 80 beträgt.
@ Haris778 ist diese Einheitenzuordnung zwischen PWM und Encoderdrehzahl nicht von der Motorlast abhängig? Es würde nur für eine bestimmte Last gelten.