Von der Übertragungsfunktion zum Arduino

7

Diese Frage mag dumm erscheinen, aber ich war schon lange neugierig darauf.

Ich bin also ein neuer Ingenieurstudent und wir haben viel über das "Entwerfen eines Controllers" gelernt. Zum Beispiel Design-Controller für ein Autolenkungssystem und so weiter. Alle von uns entworfenen "Controller" befinden sich in der Laplace-Domäne, auch bekannt als S-Domäne. Und meistens handelt es sich nur um eine Übertragungsfunktion. Wie nutzen echte Steuerungssystemingenieure diese Übertragungsfunktionen in Arduino und anderen Mikrocontrollern? Ich meine, Sie können die Funktion nicht einfach dort einfügen, oder?

Müssen Sie die Übertragungsfunktion in eine andere Form konvertieren und den Code für den Mikrocontroller schreiben, oder gibt es eine einfachere Möglichkeit, dies zu tun?

Vielen Dank für Ihre Zeit!

MechAvia
quelle

Antworten:

4

Angenommen, Sie haben ein Arduino, das Sie so angeordnet haben, dass es ein Signal mit einer Abtastrate von 1 / T abtastet, das dann von Ihrem Controller verarbeitet wird. Nehmen wir auch an, dass die Verarbeitungszeit für Ihren Controller im Vergleich zu T, z. B. 0,1 / T, gering ist

Zunächst müssen Sie die Controller-Übertragungsfunktion in diskrete Zeit konvertieren. Es gibt viele Möglichkeiten, dies zu tun. Matlab hat eine praktische c2d () Funktion. Eine Möglichkeit, dies auf Papier zu tun (nicht die beste), ist die Verwendung der Euler-Methode.

s = (z-1) / T wobei T die Abtastperiode ist.

Konvertieren einer Übertragungsfunktion dann: (s + a) / (s + b) => (z- (1-aT)) / (z- (1-bT))

Jetzt haben Sie also einen TF in z wie: Y (z) / X (z) = (zc) / (zd), wobei Y die Ausgabe und X die Eingabe ist.

Um dies in einem Controller zu implementieren, benötigen Sie dies als Differenzgleichung in Bezug auf Verzögerungen. Konvertieren Sie also die Gleichung in eine Funktion von (z ^ -1), die eine Verzögerung darstellt:

Y (z) / X (z) = (1-cz ^ -1) / (1-dz ^ -1)

und schreibe neu als: Y (Z) (1-dz ^ -1) = X (z) (1-cz ^ -1)

Y (Z) -dY (z) .z ^ -1 = X (z) -cX (z) .z ^ -1

und zur Abtastzeit wechseln, wobei z ^ -1 als Verzögerung behandelt wird: y (n) - dy (n - 1) = x (n) - cx (n - 1)

Neuordnung: y (n) = dy (n-1) + x (n) - cx (n-1)

Sie können dies einfach im Arduino implementieren, indem Sie erkennen, dass y (n-1) der vorherige Wert von y (n) und ähnlich für x (n) ist und x (n) der in die Steuerung eingegebene Wert ist; dh die Referenz abzüglich der Ausgabe vom ADC.

Akellyirl
quelle
Würde es Ihnen etwas ausmachen, uns ein Codebeispiel zu geben, um diese Art von Übungen durchzuführen? Ich wäre dir sehr dankbar. In meinem Fall hat a eine Übertragungsfunktion a / s + a, "a" ist ein Wert, den a über eine mit dem Arduino Mega verbundene Tastatur eingeben muss. Ich habe die Operationen wie folgt mit der Tustin-Methode berechnet: a1Z + a2 / b1Z + b2 wobei jeder Wert ist: a1 = a2 = (aT / aT + 2); b1: ist immer 1; und b2: aT-2 / aT + 2. T ist die Abtastzeit. Wie Sie sehen, habe ich alles berechnet, aber ich habe Schwierigkeiten im Programmcode in Arduino Mega. Wenn Sie mir helfen können, wäre ich wirklich dankbar.
Mauricio López