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:
Führen Sie folgende Vorbereitungsarbeiten durch:
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:
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.
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:
Ü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.
Erlernte und gefestigte Arbeitsschritte:
Hier unsere übliche Videozusammenfassung.
Erweitern Sie zur Übung die Anwendung um eine ErrorLED. Die ErrorLED soll bei Sensorwerten unter 100 leuchten.