Zuarbeiten zum Reluktanzmotor …
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.
Die Firmware in C++. Ganz einfach.
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:
|
Klemmen von oben nach unten:
|
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 |
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?
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.
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.
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.
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“):
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.
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).
Entwicklungsboard mit TMS320F28379D. Ausgangspunkt: Code Composer Studio 8, controlSuite, positionManager-SDK, motorControl-SDK, Beispielprojekt „IDDK_PM_Servo_F2837x-v2“.
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!!
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.
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.
Ausgehend vom haarsträubenden Quelltext habe ich zunächst Struktur hineingebracht
( So sieht's aus.
Es geht nun mittlerweile auch vom Flash.
Da die Header von controlSuite einiges in die Sektion ramfuncs stecken,
das moderne Huch! Des Rätsels Lösung war schließlich zu wenig Stack,
aber nun habe ich ein eigenes
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.
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.
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.
Platinendatei für die Produktion:
doppelseitig, 1,6 mm dick, keine besonderen Ansprüche,
Bestückungsdruck ( 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.
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.
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.
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 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):
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.
#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.
__attribute__((ramfunc))
aber nach .TI.ramfunc
muss man im Linkerskript
Zeile 81 beides zusammenwerfen.
Mittlerweise gibt es nur noch .TI.ramfunc.
wsnprintf(s,n,L"%f",floatzahl)
stürzt ab!
Also blieb mir nichts anderes übrig als printf()
neu zu schreiben. Schönen Dank!!
printf()
-Gerüst
printf() mit folgenden Features:
printf("%,1i °C",255);
ergibt 25,5␣°C
printf("%,1j V",-32768);
ergibt NaN␣V
printf("%`12u Bytes",12345678UL);
ergibt ␣␣12`345`678␣Bytes
printf("%+i",0);
ergibt 0 (nicht +0)
printf()
aus der Laufzeitbibliothek)
BP6A-Ersatz
tPlace
, tNames
, evtl. tValues
) optional.
Win32-Ersatz für dSPACE Control Desk
WebUSB-Ersatz für dSPACE Control Desk
#define
-Geraffel auflösen (erledigt)
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.