Einen I²C Feldbus verwenden

Für diese Übung benötigen Sie ein Temperatursensor Add-On als Erweiterung an Ihrem mySTM32 Board light.
Feldbussysteme spielen bei vielen Mikrocontrolleranwendungen eine wichtige Rolle. Zum einen ermöglichen solche digitalen Kommunikationskanäle intelligente Sensoren und Aktoren zu verwenden und es erlaubt dem Entwickler, Controller mit verhältnismäßig geringer Pinanzahl zu benutzen und damit den Footprint klein zu halten. Der I²C Bus ermöglicht hohe Datenübertragungsraten und selbst in Standardmodus bereits über 100 Geräte in einem Bus zu adressieren. Dabei benötigt der I²C Bus nur zwei Leitungen also zwei Pins am Controller. Es gibt es tausende I²C Devices die ein breites Anwendungsspektrum abdecken. Faktisch jede moderne Mikrocontrollerfamilie unterstützt diesen Standard. I²C wurde ursprünglich von Philips für die Kommunikation innerhalb eines Gerätes zum Beispiel innerhalb eines Fernsehers entwickelt. Damit lässt sich schon daraus schließen, dass dieses Bussystem nicht für weite Übertragungswege gedacht ist sondern für einige Zentimeter bis wenige Meter konzipiert wurde. In einem der folgenden Kapitel lernen Sie ein weiteres Feldbussystem kennen, den CAN-Bus, dieser kann mindestens 40 und unter bestimmten Voraussetzungen bis 500 Meter Daten zuverlässig übertragen. Auch diesen Feldbus finden Sie auf dem kleinen mySTM32 Board light.

Entwickeln Sie eine Mikrocontrolleranwendung bei der ein I²C Temperatursensor ausgelesen und die aktuelle Temperatur per UART an den PC gesendet wird.

Anforderungen an die Lösung:

  • Temperatursensor LM75, Adressekonfiguration 0x90
  • Datenübertragung 8 Bit, 19200 Baud
  • Temperaturwerte in vollen Grad Celsius

Wenn Sie noch ein 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, öffenen sie das SiSy UML-Projekt wieder. Führen Sie folgende Vorbereitungsarbeiten durch:

  • neues Klassendiagramm anlegen
  • Zielsprache ARM C++
  • Zielplattform STM32F042 mySTM32 Board light HAL
  • Diagrammvorlage Application Grundgerüst für PEC Anwendungen (XMC, STM32, AVR) laden
  • Treiberpaket für STM32F0 zuweisen
  • optional Template stm32F042_48Mhz zuweisem

Die Aufgabe besteht darin einen digitalen Temperatursensor über einen I²C Bus auszulesen und die Daten per UART an ein PC Terminal zusenden. Daraus lassen sich die fachlich motivierten Systembausteine für den Entwurf der Systemarchitektur ableiten.


Für den Temperatursensor LM75 gibt es neben anderen I²C Geräten einen entsprechenden Bibliotheksbaustein. Der folgende Ausschnitt aus dem Klassenmodell der PEC-Bibliothek zeigt den Zusammenhang zwischen dem Baustein PecLm75 und der entsprechenden I²C Buskomponente PecI2cBus.

Für die Anwendung dieser Bausteine sind zwei Operationen für uns wichtig. Zum einen soll die Temperatur in ganzen Grad ausgelesen werden. Dafür dient die Operation getTemp(). Diese wandelt die Temperaturdaten vom Sensor bereits in ganze Grad um. Der Sensor selbst liefert die Temperatur in 0,125°C (8tel Grad) Schritten. Desweiteren können moderne Mikrocontroller mehrere I²C Bus-Schnittstellen besitzen. Es ist daher notwendig das Gerät mit seiner Adresse dem konkreten Bus zuzuweisen. Das erfolgt über die Operation connect(…). Es gibt für diese Operation zwei Alternativen. Die Operation connect(…) im Device oder im Bus.

Aus dem bisherigen Erkenntnissen lässt sich folgender Grobentwurf für die geforderte Mikrocontrollerlösung ableiten:

In einfacher natürlicher Sprache lässt sich dieser Entwurf wie folgt lesen:

  • der Controller ist ein stm32F042_48MHz
  • der Controller hat einen SensorBus
  • der SensorBus ist eine PecI2CBus
  • der Controller hat ein Terminal
  • das Terminal ist eine PecUart

Die Zuweisung der konkreten Ressourcen muss in der Realisierung erfolgen.

MERKE: BUS = DEVICE mit ADRESSE zuweisen

Die Realisierung sollte die im obigen Entwurf beschriebenen Elemente beinhalten. Zusätzlich müssen wir noch die konkret verwendeten Ressourcen unseres Controllers zuweisen. Vervollständigen Sie ihr Klassenmodell soweit, dass es mit der folgenden Darstellung übereinstimmt. Ordnen sie die Elemente übersichtlich an.

Zuerst muss die Verbindung zum Bus hergestellt und die Geräteadresse zugewiesen werden. In einem Bus können bis zu acht LM75 Adressiert werden. Dafür gibt es auf dem Add-On Jumper zum Konfigurieren der Geräteadresse. Achten Sie darauf, dass auf dem Add-On die Adress-Jumper wie folgt stehen (alle auf 0 = 0x90):

Notieren Sie in der Operation onStart() der Klasse Controller folgenden Code:

Controller::onStart():void
sensorBus.connect(sensorBus.temperaturSensor,0x90);

Das Auslesen der aktuellen Temperatur der Digitalsensors erfolgt auf API-Ebene ähnlich der Vorgehensweise beim Analogsensor. Beachten Sie, dass der Temperatursensor verhältnismäßig träge ist. Nutzen Sie eine kleine Warteroutine damit die Änderung der Daten auf dem Terminal gut zu verfolgen sind.
Notieren Sie in der Operation onWork() der Klasse Controller folgenden Code:

Controller::onWork():void
temperatur=sensorBus.temperaturSensor.getTemp();
terminal.writeByte(temperatur);
waitMs(10);

Jetzt können Sie die Anwendung erstellen und Testen.

Ü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 das Temperatursensor Add-On mit dem mySTM32 Board light
  4. Achten Sie auf die richtige Position der Adress-Jumper
  5. Aktivieren Sie mit den entsprechenden Jumpern die Pull-Up-Widerstände
  6. Beachten Sie die Einstellungen im SiSy-ControlCenter

Ändern Sie die Anwendung so, dass die rohen Sensordaten (raw value) an den PC gesendet werden. Um die Lesbarkeit zu erhöhen wandeln sie die 10 Bit Rohdaten in Text um. Ändern sie den Code der Operation onWork() der Klasse Controller wie folgt:

Controller::onWork():void
uint16_t temp;
temp=sensorBus.temperaturSensor.getRawValue();
String txt;
txt.format("\nRawValue=%d",temp);
terminal.writeString(txt);
waitMs(100);

Bilden, übertragen und testen Sie die Anwendung. Vergleichen Sie die Ergebnisse beider Varianten miteinander.

Videozusammenfassung

Erlernte und gefestigte Arbeitsschritte:

  1. Klassendiagramm anlegen und öffnen
  2. Diagrammvorlage für PEC Applikation auswählen
  3. laden des richtigen Treiber-Pakets
  4. gewünschte Bausteine im Explorer suchen und ins Diagramm ziehen
  5. Klassen aggregieren, Komponenten bilden
  6. den nötigen Quellcode in den Operationen erstellen
  7. Erstellen und Brennen eine ARM Applikation im Klassendiagramm

Und weil es so schön war hier das Ganze noch mal als Video.

oder die schnelle Version mit Musik

Übung

Nutzen Sie das Text-LCD um die Sensordaten anzuzeigen!

Weiter mit: