Analogdaten erfassen und verarbeiten

Für eingebettete Systeme ist das Erfassen und die Verarbeitung analoger Daten oft essentiell. Das PEC-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, sind mit einer Auflösung von 8 Bit durchaus hinreichend zu lösen. Somit wollen wir in diesem Beispiel zunächst nur einen 8-Bit Wert zyklisch erfassen und per UART an das Controlcenter senden. Der Charm dabei ist, dass sich 8-Bit Werte sehr reibungslos per UART übertragen lassen da diese ja „zufällig“ Datenworte zu je 8 Bit überträgt.

In einer Erweiterung der Übung werden wir den Wert nicht direkt als 8 Bit Rohdaten (binary raw data) senden, sondern wandeln die Werte in lesbare Zeichen (ASCII) um und senden diese als Zeichenkette an den PC. Die vorausgegangene UART Übung kann hier als Muster dienen.

Es soll eine Mikrocontrolleranwendung entwickelt werden, bei der die Analogwerte von einem Potentiometer digitalisiert und an den PC gesendet werden.

Anforderungen an die Lösung:

  • UART an A9/A10
  • Datenübertragungsrate 19200 BAUD
  • Genauigkeit der ADC Konvertierung 8 Bit
  • Potentiometer oder Helligkeitssensor an Pin A7

Führen Sie folgende Vorbereitungsarbeiten durch:

  • neues Klassendiagramm anlegen
  • Zielsprache ARM C++
  • Zielplattform MM32L073 myMM32 Board
  • Diagrammvorlage Application Grundgerüst für PEC Anwendungen (XMC, STM32, AVR) laden
  • Treiberpaket für MM32L0 zuweisen

Vergegenwärtigen wir uns die Aufgabe dann besteht diese darin mit unserem Mikrocontroller von einem analogen Sensor (Potentiometer/Helligkeitssensor) Messdaten zu erfassen und diese in einem Terminalprogramm auf dem PC anzuzeigen. Aus dieser Aufgabenstellung resultieren folgende Systembausteine für das Klassenmodell unserer Lösung.


Der STM32F042 verfügt zum Erfassen von Analogdaten über einen Analog-Digital-Converter ADC mit bis zu 12 Bit Genauigkeit, bis 10 verschiedene Kanäle und einer Erfassungszeit von 1 Mikrosekunde. Der Spannungsbereich der erfassten Analogwerte liegt zwischen 0V (GND) der Versorgungsspannung bzw. Referenzspannung des ADC 3,3V (AVCC).

Das PEC-Framework bietet uns für die Lösung der gestellten Aufgaben den bereits bekannten Baustein PecUart und für die Nutzung des ADC die Bausteine PecAdcSingle und PecAdcChannel.

Für die gestellten Anforderungen würde der kleine Baustein PecAdcSingle absolut ausreichen. Da wir für diese Übung nicht „sparsam“ sein müssen verwenden wir den etwas komplexeren Bibliotheksbaustein PecAdcChannel. Damit können wir später auch mehrere Analogkanäle komfortabel erfassen. Übernehmen wir die herausgearbeiteten System- und Bibliothekbausteine sieht ein möglicher Grobentwurf unserer Lösung wie folgt aus:

MERKE: Signale (Spannungen) am Controller = maximal bis zur Versorgungsspannung!!!

Die Realisierung sollte die im obigen Entwurf beschriebenen Elemente beinhalten. Zusätzlich müssen wir noch die konkret verwendeten Ressourcen unseres Controllers zuweisen. Für die UART benutzen wir die bekannte Konfiguration aus der vorangegangenen Übung uart1portA9_mm32. Den ADC sollen wir an PinA7 anschließen. Wir könnten auch andere Pins benutzen aber das Pin A7 ist einfach den analogen Eingabegeräten auf unserem Board am nächsten. Wir ziehen wieder unsere Referenzkarte zu Rate.

Demzufolge ist Pin A7 auch gleich der ADC-Channel 7. Jetzt haben wir alle nötigen Informationen um unseren Lösungsetwurf zu vervollständigen. Hier noch mal ein kurze Zusammenfassung:

  • Grundgrüst mit Systembaustein Controller
  • Systembausteine Sensor und Terminal anlegen
  • neue Systembausteine mit Controller verbinden (Aggregation)
  • Bibliotheksbausteine PecUart und PecAdcChannel zuweisen (Realisierung)
  • Baustein Terminal korrekt konfigurieren mit baudrate19200 und uart1portA9_stm32f0
  • Baustein Sensor korrekt konfigurieren mit adcResolution8bit und adc1ch07_stm32

Vervollständigen Sie ihr Klassenmodell soweit, dass es mit der folgenden Darstellung übereinstimmt. Ordnen sie die Elemente übersichtlich an.

Das in der Aufgabenstellung geforderte zyklische Erfassen des Analogwertes und senden an den PC erledigen wir der Einfachheit in der Operation onWork. Damit wir die Änderung der Werte in Ruhe verfolgen können sorgen wir mit einer kleinen Wartezeit dafür dass die Daten nicht zu schnell hintereinander gesendet werden.

Controller::onWork():void
// continuous event from the Mainloop
uint8_t value;
value=sensor.getValue();
terminal.writeByte(value);
waitMs(10);

Ü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. verbinden Sie den Helligkeitssensor oder das Potentiometer mit Pin A7

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 MM32L073 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 (8 Bit). 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 komfortable Variante unsere 12-Bit Daten trotzdem zu übertragen ist, diese in Text umzuwandeln. Dann lassen sich die Werte in der Textansicht leicht verfolgen. Ergänzen Sie bitte in der Klasse Controller das Attribut buffer vom Typ String.

Ändern sie den Code der Operation onWork wie folgt:

Controller::onWork:
uint16_t wert;
wert=sensor.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 MM32L0 einfügen
  3. gewünschte Bausteine im Explorer/Navigator suchen und ins Diagramm ziehen
  4. Klassen aggregieren
  5. Operationen einer Klasse anlegen
  6. Attribute einer Klasse anlegen
  7. Klassen und Templates zu Komponenten zusammenbauen
  8. den nötigen Quellcode in den Operationen erstellen
  9. Erstellen und Brennen eine ARM Applikation im Klassendiagramm
  10. den Bibliotheksbaustein PecAdcChannel anwenden
  11. das SiSy ControlCenter anwenden

Hier unsere übliche Videozusammenfassung.

oder die schnelle Version ohne Sprachkommentare

Übung 6

Erweitern Sie zur Übung die Anwendung um eine ErrorLED. Die ErrorLED soll bei Sensorwerten unter 100 leuchten.

Weiter mit:

Suchbegriffe