TC3: Vermutlich Fehler in Skalierungsformel

Beiträge
6.507
Reaktionspunkte
1.552
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo alle,
ich bin gerade bei einer Skalierung am verzweifeln. Die Endwerte passen, aber dazwischen kommt es zu mehr oder minder großen Abweichungen. Hier kurz der Aufbau:
Ein Servo (Modellbau-Servo) wird über ein PWM-Signal angesteuert und gibt ein Feedback-Signal. Dieses Feedback soll bei 0° 2,5V, bei -45° 0V und bei 45° 5V betragen. Diese Werte werden an den Endpunkten jedoch nicht ganz erreicht, der Spannungsbereich ist ca. 0,1V - 4,9V. Um diesen genau zu ermitteln führe ich eine Kalibrierung durch. Der Servo fährt jeweils die minimale und maximale Position an, dann wird mit einer EL3751 (5V = 16#773594) die jeweilige Spannung gemessen und gespeichert. Zur Berechnung der aktuellen Position nutze ich folgende Formel:
Code:
IFC.ACT.r32_ServoPosition := LREAL_TO_REAL(
(5 / DWORD_TO_LREAL(16#00773594) * HW.st_Input.i32_FeedbackServo - IFC.SET.r32_FeedbackVoltageMinPos) * (CFG.r32_MaxPositionPWM - CFG.r32_MinPositionPWM) (IFC.SET.r32_FeedbackVoltageMaxPos - IFC.SET.r32_FeedbackVoltageMinPos) + CFG.r32_MinPositionPWM
);
Sieht vielleicht einer wo ich einen Fehler mache? Die Variablen für die min und max Werte passen.
 
Zuletzt bearbeitet:
Hi Oliver,

Ich würde zum skalieren des Eingangssignales den Trafo aus der util.lib verwenden. Dann können die min und Max Signale gesetzt werden auf der Seite des Eingangswortes und du kannst im Nachgang direkt mit deinen Winkeln arbeiten.

Gruß

Mavorkit

Gesendet von meinem SM-G389F mit Tapatalk
 
Wie groß sind die "mehr oder minder großen Abweichungen"?

Ich kenne TC3 nicht, mir fällt aber trotzdem einiges auf:
- Geht das in dem TC3, daß man beliebige Datentypen (gedankenlos bzw unkontrolliert) miteinander verrechnen kann und TC3 konvertiert automatisch in die passenden Datentypen? Macht TC3 das immer richtig/in der richtigen Reihenfolge?
- Welchen Datentyp hat "HW.st_Input.i32_FeedbackServo" - ist das DINT?
- DWORD_TO_LREAL(16#00773594) - sollte das nicht DINT_TO_LREAL(16#00773594) heißen? (oder ist in TC3 immer noch der Designfehler daß DWORD = UDINT interpretiert wird?)
- Müssen wirklich alle Variablen in LREAL konvertiert werden? Kommt die Ungenauigkeit vielleicht durch die vielen Konvertierungsungenauigkeiten?

Harald
 
Hallo Harald,
der Hardware-Eingang ist ein DINT der aber nur positive Werte hat. Soweit ich weiß ist für TwinCAT WORD und UINT, bzw. DWORD und UDINT immer noch das Gleiche.
Alles in LREAL zu konvertieren muss ich mal ausprobieren. Vielleicht erwarte ich auch nur zu viel. An den Endlagen habe ich eine Abweichung von +/- 1°-2° was OK ist, bei 0° ist es aber +/- 0,8°-0,9° und das ist mir eigentlich zuviel.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Alles in LREAL zu konvertieren muss ich mal ausprobieren.
Hallo Oliver,

wie gesagt ich kenne TC3 nicht, doch ich behaupte mal, daß eh' schon (unsichtbar) alle Variablen in LREAL konvertiert werden und in LREAL gerechnet wird, weil Du ein DWORD_TO_LREAL(16#00773594) in der Formel drin hast. Allerdings traue ich solchen automatischen Hintergrund-Konvertierungen nicht, besonders wenn ich den Compiler und die Regeln nicht genug kenne.

Kannst Du mal bitte Deinen Formel-Code nochmal etwas lesbarer posten, außerdem habe ich das Gefühl, daß da ein Operationszeichen fehlt (nach CFG.r32_MinPositionPWM) - oder werden fehlende Operationszeichen in TC3 durch Standard-Operationen ersetzt?

Harald
 
Hallo Harald,
da fehlt tatsächlich ein Operator, suche ihn gerade ;) . Aber im Ernst, da hab ich aus Versehen ein / gelöscht. Hier mal die Formel in einer hoffentlich klareren Version.

(5V / 16#00773594 * Wert[SUB]Eingang[/SUB] - U[SUB]Min Position[/SUB]) * (MaxPosGrad - MinPosGrad) / (U[SUB]Max Position[/SUB] - U[SUB]Min Position[/SUB]) + MinPosGrad

Alle Werte habe ich derzeit in Long Real gewandelt.
 
Du könntest mal die Zwischenergebnisse der Berechnungen in Hilfsvariablen speichern, um zu sehen, wo die Ungenauigkeit entsteht. Dann vielleicht die Spannungswerte nicht in Volt umrechnen, sondern die Originaleinheit der Klemme als DINT verwenden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Oliver!

Kann es sein, dass Du von ...
... Ein Servo (Modellbau-Servo) wird über ein PWM-Signal angesteuert und gibt ein Feedback-Signal. ...
... eine Präzision bzw. ein Maß an Reproduzierbarkeit erwartest, das das Ding nicht erfüllen kann?

Gruss, Heinileini

PS:
... Vielleicht erwarte ich auch nur zu viel. An den Endlagen habe ich eine Abweichung von +/- 1°-2° was OK ist, bei 0° ist es aber +/- 0,8°-0,9° und das ist mir eigentlich zuviel. ...
Wenn Du noch Spielraum an den Endlagen hast, könntest Du sie so manipulieren (verschieben), dass die 0-Position in die Mitte gerückt wird?
 
Zuletzt bearbeitet:
Also an der Formel an sich ist erstmal mathematisch nichts auffällig, also wenn du nicht beim abtippen irgendwelche Fehler gemacht hast (Klammern, Operatoren, Operanden, ...), kommen noch zwei Fehlerquellen infrage:

  1. Fehler in den Messwerten
  2. Numerische Instabilität
 
Ich würde sagen, die Formel an sich ist richtig, doch ich würde sie anders formulieren:
Code:
IFC.ACT.r32_ServoPosition :=
  (5.0 / 7812500.0 * DINT_TO_REAL(HW.st_Input.i32_FeedbackServo) - IFC.SET.r32_FeedbackVoltageMinPos)
* (CFG.r32_MaxPositionPWM - CFG.r32_MinPositionPWM)
/ (IFC.SET.r32_FeedbackVoltageMaxPos - IFC.SET.r32_FeedbackVoltageMinPos)
+ CFG.r32_MinPositionPWM;
Ich meine, eine Berechnung in normalem REAL müßte noch genau genug sein. Ein Inkrement des Analogeingangswertes ändert das Ergebnis um ca. 1.5e-005

Wieviel Auflösung des errechneten Winkelwertes brauchst Du wirklich? Warum ist da so eine total hochauflösende Analogeingangskarte eingebaut (EL3751, 24 Bit ADU)? Angenommen Dir reichen 0.01° Auflösung dann wären das zwischen -45.00° und +45.00° gerade mal 9000 Inkremente - normale 15-Bit ADU-Auflösung würde dafür reichen.

Wie wird der Drehwinkel mechanisch erfasst? Kommt die Ungenauigkeit vielleicht daher?
Vielleicht wäre ein digitaler inkrementaler Drehgeber oder (Singleturn-)Absolutwert-Drehgeber mechanisch exakter?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Harald!
Heute haben wir anscheinend das Thema "Verschwendung von (hochauflösenden) ADUs" drauf. Der eine scheint Teile aus der Bastelkiste um jeden Preis verwenden zu wollen und der andere hat nicht genügend DE zur Verfügung - oder weiss u.U. nicht, dass er nur 2 DE benötigt und nicht unbedingt 3 oder 4, wie er vielleicht fälschlich annimmt?
Könnte mir z.B. vorstellen, dass letzterer noch weitere StufenSchalter verarbeitet und auch dort via EntkopplungsDioden den Bedarf an DE reduzieren könnte, um Eingänge frei zu bekommen.
Gruss, Heinileini
 
@Harald, @Heinileini: Leider sagt die Anzahl der Bits nur bedingt etwas über die Genauigkeit einer Karte aus. Wichtig ist auch der Messfehler bezogen auf den Messbereichsendwert. Ich benötige eine Genauigkeit von +/-1°, wobei 0-180° einer Spannung von 0-5V entsprechen, also 27,8mV/°, wenn man nur die Eingangskarte betrachtet. Ginge es lediglich um die Anzahl der Bits würde mir die EL306X mit 12 Bit schon reichen, denn da würde eine Änderung/Fehler um ein Digit 2,4mV entsprechen, was deutlich genauer wäre als wie ich es benötige. Dummerweise macht mir sowohl bei der EL606X (12 Bit, 0-10V) als auch bei der EL616X (16 Bit, 0-10V)der folgende Eintrag im Datenblatt einen Strich durch die Rechnung:
Messfehler.jpg
Wenn ich jetzt nicht völlig falsch liege ist der Messbereichsendwert bei beiden Karten 10V und wenn ich jetzt in Mathe nicht völlig gepennt habe sind 0,3% von 10V genau 30mV was schon mal über 27,8mV liegt und somit entsprechen die Karten schon nicht mehr meinen Anforderungen. Zumal ja nicht nur die Karten Messfehler haben, sondern auch der Rest der Komponenten (z.B. Hallsensor im Servo) so das aufgrund der Fehlerfortpflanzung alleine die Eingangskarte eine deutlich höhere Genauigkeit als +/-27,8mV haben muss.
@Harald: An der Stelle haben wir nur die Rückmeldung vom Servo, allerdings fürchte ich, dass diese doch nicht so genau (bzw. linear) ist wie der Hersteller meint. Der Servo treibt einen Magneten, der über einen zweiten Magneten wiederum eine Welle bewegt an dessen Ende dann ein Absolut-Drehgeber sitzen wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

warum arbeitest Du nicht mit mehreren Stützpunkten. Machen wir zum Teil auch. z.B. -45°, 0°, 45°. Könntest auch noch weitere Stützstellen wählen.

Kannst Du ja sonst einfach mal ausprobieren wie groß die Abweichungen dann sind.

Gruß
 
... Ich benötige eine Genauigkeit von +/-1°, wobei 0-180° einer Spannung von 0-5V entsprechen, ...
Gestern waren wir noch bei -45° bis + 45°!? Die Ungenauigkeit scheint bei Deinen Angaben deutlich grösser zu sein als die des ADU.
Wenn Du für 10V 10 Bit hast, hast Du Sprünge von < 1 hundertstel V. Bei 5V für 100° (überschlägig statt 90°) bleiben 500 Stufen, also Sprünge von < 0,2°.
Bei 12 Bit entsprechend < 0,05°. Hört sich gar nicht so dramatisch schlecht an.
Mit HallSensoren in analogen Anwendungen hätte ich grössere Bedenken und mit den zwei Magneten, die eine starre Verbindung zwischen Servo und AbsolutDrehgeber produzieren sollen, fast schon Bauchschmerzen ...
Gruss, Heinileini
 
Ich benötige eine Genauigkeit von +/-1°, wobei 0-180° einer Spannung von 0-5V entsprechen
:confused: Gestern im EP #1 waren es noch 0-5V = -45..+45° (= 0..90°)

+/-1° von 90° sind ca 1.1% zulässige Abweichung (bzw. 0.56% von 180°)
Kannst Du die Karte auf einen Meßbereich 0-5V (bzw. +/-5V) einstellen? Da sind 0.3% Meßfehler doch ausreichend.

Oder übersehe ich da was?

Unabhängig davon, ob die Karte überdimensioniert ist: ändern sich die Positions-Ergebnisse, wenn Du mal meine Formel-Formulierung aus #11 verwendest?

Harald
 
Kannst Du die Karte auf einen Meßbereich 0-5V (bzw. +/-5V) einstellen? Da sind 0.3% Meßfehler doch ausreichend.

Oder übersehe ich da was?
Nein, tust Du nicht, leider sind diese Karten nicht einstellbar, nur die jetzt eingesetzte 24Bit-Karte ist einstellbar.
Unabhängig davon, ob die Karte überdimensioniert ist: ändern sich die Positions-Ergebnisse, wenn Du mal meine Formel-Formulierung aus #11 verwendest?
Werde ich morgen testen und Rückmeldung geben.
 
Zurück
Oben