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!!
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.
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("%,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)
Das Linkerskript wirft Kode und Daten in folgende Bereiche (beispielhaft):
printf()
aus der Laufzeitbibliothek)
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.
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.
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:
#define
-Geraffel auflösen (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):