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, wählen Sie die Sprache ARM C++ und stellen Sie die Hardware (STM32F407) ein. Beim Öffnen des Diagramms (rechte Maustaste, nach unten) laden Sie aus dem SiSy LibStore die Diagrammvorlage Application Grundgerüst für PEC Anwendungen (XMC, STM32, AVR). Weisen Sie das Treiberpaket für STM32F4 zu.

»

Basierend auf verfügbaren Klassen und Templates für ADC und UART soll entsprechend dem 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 Explorer mit dem Suchtext pec_Adc lassen sich die einzelnen Bausteine erreichen. Es ergibt sich folgendes Gesamtbild zu der vorhandenen Lösung für die Klasse PecAdcChannel:

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, welches Pin wir nutzen.

Die verfügbaren Klassen PecAdcChannel und PecUart finden wir, wie schon gesagt, über den Navigator in den UML-Paketen bzw. über die Suche im Explorer. 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 PD8 und PD9. Dabei reicht es, wenn wir die Sendeleitung D8/Rx3 verbinden, da wir keine Daten empfangen. Für die Erfassung des Analogwertes verbinden wir eines der Potentiometer auf dem Erweiterungsboard mit ADC12 als Alternativfunktion des Pins PC2.

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 Übergabe an die UART 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 (Mini USB-Kabel), patchen Sie RxD mit PD8 und das Potentiometer mit Pin PC2 (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 STM32F4 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 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 Sie bitte in der Klasse Controller das Attribut buffer vom Typ String.

Controller::onWork:
uint16_t wert;
wert=poti.getValue();
buffer.format("Adc=%d\n",wert);
terminal.writeString(buffer);
waitMs(1000);

Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers. Starten Sie das ControlCenter, beachten Sie die korrekten Einstellungen für den COM-Port. Nachdem Sie verbinden aktiviert haben, stellen Sie die Ansicht auf Text. 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 PEC Applikation auswählen, laden und Treiberpaket für STM32F4 einfügen - Navigator auf UML Pakete umschalten
  3. gewünschte Klasse im Explorer suchen und ins Diagramm ziehen
  4. Klassen aggregieren
  5. Operationen einer Klasse anlegen
  6. Operationen einer Basisklasse überschreiben
  7. Attribute einer Klasse anlegen
  8. Klassen und Templates zu Komponenten zusammenbauen
  9. den nötigen Quellcode in den Operationen erstellen
  10. Erstellen und Brennen eine ARM Applikation im Klassendiagramm
  11. 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