Analogdaten erfassen

Für eingebettete Systeme ist das Erfassen und die Verarbeitung analoger Daten oft essentiell. Das Framework stellt Klassen und Templates zur Verfügung, mit denen sich eine Vielzahl von Aufgabenstellungen rings um den Analog-Digital-Converter mit wenigen Handgriffen erledigen lassen. Viele Problemstellungen, bei denen ein Analogwert erfasst, verarbeitet und daraufhin etwas, was auch immer, getan werden soll, ist mit einer Auflösung von 8 Bit absolut hinreichend zu lösen. Somit soll in diesem Beispiel ein 8-Bit Wert erfasst und per UART an das Controlcenter gesendet werden. Der Charm dabei ist, dass sich 8-Bit Werte auch sehr reibungslos per UART übertragen lassen. In einer Erweiterung der Übung übertragen wir den Wert nicht direkt (binary raw data) sondern wandeln die Werte in lesbare Zeichen (ASCII) um und senden diese als Zeichenkette an den PC.

Es soll eine Mikrocontrolleranwendung entwickelt werden, bei der die Analogwerte von einem Potentiometer digitalisiert und an den PC gesendet werden. Die Auflösung der Analog-Digital-Wandlung soll 8 Bit betragen.

Falls Sie jetzt noch das Klassendiagramm geöffnet haben wählen Sie im Kontextmenü (rechte Maustaste) des Diagramms den Menüpunkt nach oben. Falls das Projekt nicht mehr geöffnet ist, öffnen sie das SiSy UML-Projekt wieder. Legen Sie ein neues Klassendiagramm an und wählen Sie die Sprache ARM C++. Beachten Sie die Einstellungen für die Zielplattform XMC4500 Relax Kit. Beim Öffnen des Diagramms (rechte Maustaste, nach unten) laden Sie die Diagrammvorlage für eine PEC Applikation und fügen das Treiberpaket für den XMC4500 ein.

Basierend auf verfügbaren Klassen und Templates für ADC und UART soll entsprechend dem unten folgenden Blockbild eine Firmware erstellt werden. Die Klasse PecUart kennen wir bereits. Die Frameworklösung für den ADC schauen wir uns etwas näher an. Über den Navigator UML-Pakete lassen sich die einzelnen Bausteine erreichen. Es ergibt sich folgendes Gesamtbild zu der vorhandenen Lösung für die Klasse PecAdcSingle:

Es lässt sich daraus schließen, dass wir beim Zusammensetzen des gewünschten analogen Bausteins die Auflösung und den Kanal zuweisen müssen. Aus der Belegungsmatrix ergibt sich, von welchem Pin wir die Alternativfunktion Analog-In nutzen.

Die verfügbaren Klassen PecAdcSingle und PecUart finden wir, wie schon gesagt, über den Navigator in den UML-Paketen. Inzwischen wissen wir, wie aus den Basisklassen und zuordenbaren Templates konkrete Komponenten zusammengesetzt werden können. Für die UART nutzen wir wiederum die Pins P 2.14 und P 2.15. Dabei reicht es eigentlich, wenn wir nur die Sendeleitung P 5.0 mit RxD verbinden, da wir keine Daten empfangen. Für die Erfassung des Analogwertes verbinden wir eines der Potentiometer auf dem Erweiterungsboard mit ADC 0, Chanel 0 als Alternativfunktion des Pin 14.0 (vgl. ADC Pin Mapping).


Wir setzen die geforderten Komponenten für die Abstraktion der PC-Konsole und des Potentiometers wie folgt aus den im Framework verfügbaren Bausteinen zusammen:

Controller::onWork:

// hole Wert vom Poti
// sende Wert an PC
// mach eine kleine Pause

Wir realisieren das Erfassen des Analogwertes in der Operation onWork. Als Variable für den erfassten Wert legen wir uns vorausschauend einen vorzeichenlosen 8-Bit Wert an. Diesen sollten wir dann bei der Übernahme vom ADC explizit casten.

Controller::onWork: >

uint8_t wert;
wert= poti.getValue();
terminal.writeByte(wert);
waitMs(100);

Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers.

  1. Erstellen (Kompilieren und Linken)
  2. Brennen
  3. Verbindungen herstellen

Verbinden Sie die USB-UART-BRIDGE auf dem Erweiterungsboard mit dem PC und patchen Sie das Potentiometer auf Pin14.0 (vgl. Bild). Starten Sie das ControlCenter und beachten die korrekten Einstellungen für den COM-Port. Nachdem Sie die Verbindung mit geöffnet haben stellen Sie die Ansicht auf „Oszi“ um. Sie können über die Optionen für die Oszi-Ansicht verschiedene Darstellungsvarianten auswählen. Nun können Sie jede Veränderung am Potentiometer auf dem Bildschirm verfolgen.

Für genauere Messungen ist es nötig die Auflösung des ADC zu erhöhen. Der XMC kann Analogwerte mit einer Auflösung von bis zu 12 Bit digitalisieren. Die 12 Bit lassen sich jetzt leider nicht mehr ganz so einfach an das ControlCenter schicken, um diese zu visualisieren. Die UART ist leider byteorientiert. Sollen Daten aus mehreren Bytes zusammengesetzt werden, muss das empfangende Programm genau wissen, wie die Informationen zusammengesetzt werden sollen. Das leisten einfache Terminalprogramme nicht. Eine verhältnismäßig einfache Variante unsere 12-Bit Daten trotzdem zu übertragen ist, diese in Text umzuwandeln. Dann lassen sich die Werte in der Textansicht verfolgen. Ergänzen bzw ändern Sie bitte in der Klasse Controller das Attribut buffer vom Typ String und die ADC-Genauigkeit auf 12 Bit.

Ändern Sie den Quellcode der Datenerfassung und -übertragung wie folgt:

Controller::onWork:

uint16_t wert;
wert = poti.getValue();
buffer.format("ADC=%d\n",wert);
terminal.writeString(buffer);
waitMs(100);

Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers. Starten Sie das ControlCenter und beachten die korrekten Einstellungen für den COM-Port. Nachdem Sie „verbinden“ aktiviert haben, stellen Sie die Ansicht auf „Text“.

  1. Erstellen (Kompilieren und Linken)
  2. Brennen

Testen Sie die erweiterte Anwendung und variieren Sie die Einstellungen des Potentiometers.

Videozusammenfassung

Erlernte und gefestigte Arbeitsschritte:

  1. Klassendiagramm anlegen und öffnen
  2. Diagrammvorlage für ARM C++ Applikation auswählen und laden
  3. Navigator auf UML Pakete umschalten
  4. gewünschte Klasse im Navigator suchen und ins Diagramm ziehen
  5. Klassen aggregieren
  6. Operationen einer Klasse anlegen
  7. Operationen einer Basisklasse überschreiben
  8. Attribute einer Klasse anlegen
  9. Klassen und Templates zu Komponenten zusammenbauen
  10. den nötigen Quellcode in den Operationen erstellen
  11. Erstellen und Brennen einer ARM Applikation im Klassendiagramm
  12. das SiSy ControlCenter anwenden

Hier unsere übliche Videozusammenfassung.

Übung

Erweitern Sie zur Übung die Anwendung um eine LED. Diese soll leuchten, wenn der Analogwert größer als 200 ist.

Nächstes Thema