Reluktanzmotor

Zuarbeiten zum Reluktanzmotor …

Frequenzmesser

Für die Wasserkühlung wurden 9 Turbinenzähler eingebaut, für die der verwendete Datenlogger keinen geeigneten Eingang hat. Er kommt mit 5 V und 8 mA aus (letzteres steht nicht im Datenblatt). Daher eine einfache Schaltung mit Arduino eHaJo-Board mit ATmega32U4. Für etwas Reserve wurden 10 Eingänge vorgesehen, diese passten ganz gut an den Seitendeckel des Gehäuses. Die Firmware kann mit geringem Mehraufwand 16 oder 32 Eingänge verarbeiten. Emulation einer seriellen Schnittstelle, einfache SCPI-Kommandos:

Speicherung der Gesamtzählerstände im EEPROM wie bei einer Wasseruhr, alle 1 Minute.

Man hätte hier auch ganz gut eine PIC16F1459 nehmen können, da habe ich nicht schnell genug geschaltet. Wäre deutlich billiger.

CAD-Daten der neuen Seitenbleche des Euro2-Gehäuses. Die verwendeten M3-Stehbolzen sind 2× 24,6 mm und 4× 12 mm lang. 10 Eingänge wurden nunmehr vorgesehen, einer als Reserve. Verwendet wurden dreipolige Steckschraubklemmen für jeden einzelnen Zähler:

… sowie 2 Lochrasterplatinen H25PS160, lag alles herum bzw. wurde gebraucht wiederverwendet.

Rechtes Seitenblech (3D-Darstellung)

Die Firmware in C++. Ganz einfach.

Etikett
Frequenzmesser: Zählt beide Flanken an den 10 Eingängen.
Kommunikation:
Anfragen enden mit "\r" oder "\n".
Antworten kommen als String mit "\r\n".
Anschlussbelegung der Schraubklemmen:
  • *IDN? Gerätekennung
  • ? Abfrage aller 10 Frequenzen je 6 Zeichen
  • 0? Abfrage Frequenz Kanal 0
  • 1? Abfrage Frequenz Kanal 1 usw.
  • S0? Abfrage Zählerstand 0
  • S1? Abfrage Zählerstand 1 usw.
  • T? Abfrage Zählzeitfenster in Millisekunden (Standard: 1000)
  • T500 Setzt Zählzeitfenster in Millisekunden
  • BL Urlader anspringen
Klemmen von oben nach unten:
  • 5 V Versorgung (nicht extra abgesichert)
  • TTL/CMOS-Zähleingang mit internem 40-kΩ-Pullup
  • GND, Bezugspotenzial

Stecker-Reihenfolge (0..9) von unten nach oben, von vorn nach hinten. Von der Seite gesehen von links nach rechts, von oben nach unten.

Stromversorgung: Vom USB.

Sonstiges, Firmware: Siehe http://www.tu-chemnitz.de/~heha/ewa/Reluktanzmotor

Im Einsatz. Das Gerät und die Turbinenzähler werden vom USB gespeist

Am noch freien Eingang ließe sich eine Kette aus DS18B20 digitalen Temperatursensoren anschließen, was das Kabelwirrwarr (zum benachbarten Yokogawa-Gerät) deutlich reduzieren würde. Wo bleibt bloß der Auftrag?

MultiMessung

Mit heißer Nadel gestricktes LabVIEW-Programm zum Messen mit 2 Yokogawa-Geräten MW100 (Vielstellen-Messgerät v.a. für Temperaturen) sowie WT1800 (Energie- und Motoranalysegerät). Zum Archiv. Nicht zur Nachahmung geeignet; unklare Referenzen auf Yokogawa-VIs, die geändert wurden.

CT-Umrichter-Anschluss

Im Nachbar-Schaltschrank ist der originale USB-zu-RS422-Adapter (angeblich) kaputt. Kurzerhand wurde die alte Idee mit dem China-Konverter aufgegriffen und hat prompt funktioniert. Sogar mit dem Closed-Source-Programm „ServoCommander“. Nunmehr liegt der Original-Adapter geöffnet auf dem Tisch. Ungefähr das hier.

Platinenfoto

Das Gerät versorgt seine opto-isolierte Seite vom CT-Umrichter „von hinten“. Eine mögliche Fehlerursache wäre der Ausfall jener Versorgungsspannung. Auch die Richtungsumschaltung des RS485-Transceivers erfolgt „von hinten“, vom Umrichter, nicht wie sonst üblich von der USB-Seite.

An einem der beiden Exemplare Stecker abgeschnitten und neuen RJ45-Stecker angepresst für „Invertek Optidrive Eco“, siehe Bedienungsanleitung Revision 3.03 Seite 51.

IC-Bestückung:

Zum Thema RS485 siehe auch da mit LabVIEW.

Übergabe

Nachdem dieses DFG-Projekt mit Pauken und Trompeten durchgefallen war (wohlgemerkt, als einziges im Projektverbund, das einzige was nicht vom Maschinenbau kommt), fällt die Finanzierung weg und nun ist's teurer Schrott, an dem man (wer will) noch forschen kann.

Übergabe an mich Ende Juni. Dazu die folgenden handgekritzelten Notizen („Feldbuch“):

Übergabeprotokoll

In Textform:

Kühlung erforderlich, schießt manchmal Sicherung ab. Doppelkühlung. Dort Vorlauftemperatur einstellen mittels ESC + ▲▼ am Display. Kühlung: René, Motor: Maximilian. Vorlaufdruck an Pumpe einstellen. Füllstand ≥ 500 mm sicherstellen. Innen Primärkreislaufregulierung; Durchflusssensor sekundär — dieser steuert die Störungs-LED. Stromversorgung der gesamten Einheit zurzeit vom Hauptschalter Roßwein-Schaltschrank.

Flansch für Drehlagegeber

Flansch mit Außendurchmesser 120 mm

Wärmetauscher

Das zugehörige Kühlaggregat hat folgende Sensoren und Funktionen:

Das Gerät wurde irrsinnigerweise so konstruiert, dass sich nur einer der beiden Kühlkreisläufe verwenden lässt. Jedoch kann durch Ersetzen des Umschalters durch 2 getrennte Schalter („Serienschalter“) jeder der beiden Kreisläufe getrennt in Betrieb genommen werden. Im Fehlerfall leuchtet die Fehler-LED auf, und der ungestörte Kreis läuft weiter. Erst (und nur) bei Quittieren des Fehlers macht der ungestörte Kreis einen kurzen Stopp (2 s).

Software für Delfino-Launchpad

Entwicklungsboard mit TMS320F28379D. Ausgangspunkt: Code Composer Studio 8, controlSuite, positionManager-SDK, motorControl-SDK, Beispielprojekt „IDDK_PM_Servo_F2837x-v2“.

Funktion der Firmware in Umgebungsschaltung, zweimal

Beim Laden des Beispiels stellte sich heraus, dass darin relative Pfade zum controlSuite gespeichert sind, die einen Rechnerumzug mit nur leicht anderen Pfaden das Bauen unmöglich macht. Diese relativen (mit viel ..\..\..\..) Pfade muss man erst mal durch 'was vernünftiges ersetzen. (Unter Project→Properties→Resource→Linked Resources→Path Variables habe ich eine Variable „CS“ generiert, welche als Wurzel für die controlSuite-Unterverzeichnisse dient.) Man sieht die Wurzel zu controlSuite in der Datei .project Zeile 92. Änderbar unter Projekt→Einstellungen→Erweitert→Variablen→Globale Variablen.

Die Stromwerte kommen von ΔΣ-Modulatoren AMC1204, die Takt benötigen und den ΔΣ-Datenstrom ausspucken. Zunächst wurde vom Bearbeiter ein externes ΔΣ-Dezimierungsfilter eingesetzt, um mit einem SPI-Interface gleich 4 Stromwandler zu betreiben. Die 20 MHz aus einem Quarzoszillator zu beziehen erwies sich als Murks, weil dieser stark störte und zudem asynchron läuft. Die 20 MHz mit Tastverhältnis 1:1 aus einem 200-MHz-Mikrocontroller per PWM zu erzeugen erwies sich aber auch als trickreich!!

Indirekter Anschluss von 4 ΔΣ-Modulatoren
Der Mikrocontroller TMS320F28379D enthält zwei ΔΣ-Dezimierungsfilter mit je vier Eingängen, von denen am Delfino-Board insgesamt fünf Eingänge verfügbar sind. Dabei sind die Takteingänge dummerweise stets nur Eingänge; daher muss der Mikrocontroller den 20-MHz-Takt anderweitig bereitstellen (Lösung genauso wie oben) und eine externe Schaltung den Takt auf die bis zu 5 Stromwandler verteilen. Zwei Ausgänge werden ver(sch)wendet, um das Fanout gering zu halten. Der Anschluss der Stromwandler erfolgt zweckmäßigerweise über RJ45-Stecker und handelsübliche Twisted-Pair-Ethernetkabel.
Direkter Anschluss der ΔΣ-Modulatoren

Für den Quadraturenkoder hat das Delfino-Board bereits zwei gesonderte fünfpolige Pfosten-Anschlüsse mit eingebautem Pegelkonverter. Diese Eingänge sind an zwei eQEP-Eingänge des Mikrocontrollers verdrahtet. Die eQEP-Module können hohe Frequenzen in Hardware verarbeiten (= zählen und nullsetzen), aber analogfähig zwecks Interpolation sind sie nicht. Typischerweise hat ein Enkoder mehr als 1000 Striche pro Umlauf und ist somit sehr präzise: Viermal die Strichzahl ist die erreichbare Auflösung.
Zum Erfassen des Drehwinkels beim Einschalten wird ein zusätzlicher Lagegeber (Sinus-Kosinus-Geber) benötigt, der typischerweise an 2 Analogeingängen (A/D-Wandlern) ausgelesen und von einem D/A-Wandler mit einem Sinussignal erregt wird. Ein einfacher Operationsverstärker als Spannungsfolger dient dem Treiben der Erregerwicklung, falls der Mikrocontroller-Ausgang nicht selbst stromergiebig genug ist.
Die Analogmasse wird zweckmäßigerweise auf die halbe Referenzspannung(!) gelegt. Beim Delfino-Board sind das 1,5 V. Damit sind alle Analogfunktionen mittensymmetrisch. Die Bereitstellung der positiven und negativen Analogbetriebsspannung von typischerweise ±15 V erfolgt entweder (schaltflankenfrei) durch eine gesonderte Trafowicklung oder mit einem isolierten DC/DC-Wandler. (Die Dinger heißen dann meist 0515D.) So fließt kein Strom durch den Sternpunkt.
Ärgerlicherweise ist die Referenzspannung am Delfino-Board nirgends herausgeführt, so dass eine ratiometrische Bereitstellung der Analogmasse nicht möglich ist. Oder man lötet einen Draht an.

Anschluss der Lagegeber, hier mit externem Sinusgenerator (weil kein D/A-Wandler frei)

Ausgehend vom haarsträubenden Quelltext habe ich zunächst Struktur hineingebracht (#define zu const int usw. und dann das Ganze in mehrere Dateien aufzuteilen, nach Möglichkeit in solche mit weniger als 1000 Zeilen. Gleichzeitig wurde versucht, etwas C++ zur Strukturierung einzubauen, die Header von controlSuite machen das aber nahezu unmöglich, weil dort kuriose Datenreferenzen der Art extern struct{float blabla;}nirgendwo; eingebettet sind. Gruselig. Man muss die Daten selbst deklarieren, kann aber keine Zeiger darauf übergeben.

So sieht's aus. Es geht nun mittlerweile auch vom Flash. Da die Header von controlSuite einiges in die Sektion ramfuncs stecken, das moderne __attribute__((ramfunc)) aber nach .TI.ramfunc muss man im Linkerskript Zeile 81 beides zusammenwerfen. Mittlerweise gibt es nur noch .TI.ramfunc.

Huch! wsnprintf(s,n,L"%f",floatzahl) stürzt ab! Also blieb mir nichts anderes übrig als printf() neu zu schreiben. Schönen Dank!!

Des Rätsels Lösung war schließlich zu wenig Stack, aber nun habe ich ein eigenes printf()-Gerüst

printf() mit folgenden Features:

Das Linkerskript wirft Kode und Daten in folgende Bereiche (beispielhaft):

Der schwierige Akt der Pinzuweisung ist auf einer gesonderten, interaktiven Seite. Eigentlich hätte TI das machen sollen.

BP6A-Ersatz

Eine Ersatzplatine mit den DC/DC-Wandlern und Optokopplern zur IGBT-Modul-Ansteuerung. Ungefähr wie das Original von Powerex und mit etwas gängigeren Ersatzbauelementen.

Abgemalter Schaltplan; Quelle
Für die kuriosen Low-Profile-Elkos und die DC/DC-Wandler wurden Bestückungsvarianten mit preiswertem Reichelt-Ersatz vorgesehen. Die ebenfalls seltsamen Optokoppler-Typen können durch 6N135 bzw. PC817 pinkompatibel ersetzt werden, die 39-µF-Elkos durch 47-µF-Elkos. Dann ist alles bis auf die Steckverbinder CN3..CN5 von Reichelt lieferbar.
Erstelltes Board-Layout; Quelle

Platinendatei für die Produktion: doppelseitig, 1,6 mm dick, keine besonderen Ansprüche, Bestückungsdruck (tPlace, tNames, evtl. tValues) optional.

Materialbestellung: Die DC/DC-Wandler und die PSK-Steckverbinder mussten noch beschafft werden, alles andere war vorrätig.

Erfahrungsbericht: Die Löcher für die PSK-Stecker sind elend klein. Hier korrigiert. Die Löcher für die Führungsnasen sind (in der Bibliothek) zu eng, Schusselfehler. Hier korrigiert. Für die DC/DC-Wandler sind Vorbelastungswiderstände zweckmäßig, sonst läuft deren Ausgangsspannung auf über 20 V hoch. 10 kΩ genügen. Hier korrigiert. Vielleicht mit einer LED pro Ausgang? Für die Elkos 39 µF ist der Platz neben den DC/DC-Wandlern ziemlich knapp. Nicht korrigiert. Eine Platine wurde prompt verkehrtherum mit 24 V versorgt, 1 DC/DC-Wandler ging kaputt. Einer Verpolschutzdiode in Reihe würde nicht negativ auffallen. Nicht korrigiert.

TODO: Für die Signalzuführung über lange Strecken (> 1 m) bieten sich Netzwerkkabel an. Um für jedes der 6 schnellen Signale eine Verdrillung mit einer Masseleitung zu haben, braucht man zwei. Um für jedes Signal einen Schirm zu haben, braucht man Cat.6. Die dafür zweckmäßigen RJ45-Buchsen müssten zweckmäßigerweise mit auf die Platine, auf die rechte Seite. Für die 24 V wäre ein alternativer Schraubklemmstecker vorteilhaft, ebenfalls auf die rechte Seite. Durch eine alternative Bestückung mit DC/DC-Wandlern mit geringerer Primärspannung käme man von der lästigen 24-V-Versorgung los und kann alles mit 5 V bauen.

Win32-Ersatz für dSPACE Control Desk

Wieder mal eine Software, die ich nicht kenne, und äußerlich so ähnlich wie LabVIEW aussieht. Wenn es um freie Implementierung geht, ist Control Desk genauso wie LabVIEW ein Klotz am Bein. Vermutlich gibt es auch noch Lizenzierungsprobleme. Daher der Nachbau als Win32-Programm. Dreh- und Angelpunkt ist die grafische Anzeige in XY-Diagrammen, für die es leider kein Win32-Dialogelement gibt.

Aktueller Entwicklungsstand. Entwickelt wird nun doch wieder im guten alten MSVC6, weil es als k.-o.-Kriterium eine funktionierende Offlinehilfe hat. Entwickelt in C++ sowie mittels eigener Fensterklassen.

WebUSB-Ersatz für dSPACE Control Desk

Da die Win32-Software im Sande verlaufen ist und nicht cool ist (man möchte den Motor ja auf 'nem Smartfon überwachen!) wäre die Ausgabe der Motordaten über USB nicht schlecht. Leider hat der Delfino keinen USB-Anschluss; der Controller jedoch schon. Dazu muss man die serielle Schnittstelle totlegen und auf eine USB-Buchse umleiten. Das USB-Beispiel Nummer 2 (HID-Maus) geladen geht so einfach natürlich nicht: Man muss die Quarzfrequenz von 10 MHz an 2 Stellen eintragen, da das Beispiel von der ControlCard (20 MHz) und nicht vom LaunchPad (10 MHz) ausgeht: Einmal für den Prozessortakt (unwichtig) und einmal für den AUX-Takt (wichtig). Und dann das Beispiel im Debugger laufen lassen, nicht absteppen.

C2000 LaunchPad XL mit USB-Anzapfung: Die Isolationsverstärker wurden entfernt, gebrückt und die USB-Leitungen zur unteren USB-B-Buchse verlängert.

Der derzeitige Software-Stand, funktioniert toll: Im Code Composer Studio 8 und C-Compiler 20.2.1.LTS.

Erledigt:

Entscheidend für die jetzige Software-Struktur ist die Deklaration der USB-Registerbank UsbRegs als C++-Struktur, deren Elemente allesamt Mini-Klassen sind: byte, word und dword. Diese lösen die Zugriffe so auf, dass dieselbe Struktur auch für den Connectivity Manager (CM) verwendbar ist und die Bytezugriffe richtig aufgelöst werden, ohne sich um die seltsame TI-Brückenlösung hin zum C28x (CPU1) kümmern zu müssen. Innerhalb der Struktur sind Arrays endpoint-richtig angelegt, wobei es neben EP0, EP1..15IN und EP1..15OUT, mithin 31 Endpoints gibt. Die UsbRegs-Struktur wird wie gehabt via #pragma data_seg und einem Eintrag im Linkerskript auf die Adresse 0x40000 gemappt. Dummerweise ist die Angabe der Basisadresse im Datenblatt komplett falsch.

DMA wird nicht benötigt. Bei großem Datenvolumen kann man die µDMA damit beschäftigen, den Bulk-In-Endpoint mit Messdaten vollzustopfen. Aber die lausigen 1,5 MByte/s kann auch die CPU gut stemmen. Leider ist das USB des TMS320F28379D nur Full-Speed (12 Mbit/s).

Die Bedienung des USB-Interfaces erfolgt per Polling und (bei Schleifen innerhalb) unter Aufruf einer benutzerdefinierten Idle-Funktion, sodass keine Rechenleistung verschwendet wird. Es wurde darauf geachtet, dass sämtliche inneren Schleifen bei unerwartetem USB-Reset nicht hängen bleiben (wie bei vielen anderen Beispielen) sondern terminieren. Die Idle-Funktion darf USB-spezifikationsgemäß (IMHO) 10 ms blockieren. Um jedes SOF zu erwischen darf die Idle-Funktion maximal 1 ms blockieren. Im Prinzip wurde so die state machine (Zustandsautomat) statt über Zustandsvariablen über den Stack (stackful) implementiert. Das ist wesentlich übersichtlicher als der Zustandsautomat. Der Quelltext ist auf 2 Quelldateien zusammengeschrupft, die Gesamtgröße der Quelle liegt bei übersichtlichen 20 kByte. Es bestehen keine Abhängigkeiten von irgendwelchen Bibliotheken oder Frameworks!

Inzwischen handelt es sich um ein USB-Gerät mit 3-4 Interfaces (je nach Sichtweise, als USB-Deskriptor oder als Windows-Treiberstapel):