Messdatenerfassung Multi-MCU

Aus Technische Beeinflussbarkeit der Geschmacksache Kaffee
Zur Navigation springen Zur Suche springen

Noureddine Ait Ouhamou, 16.08.2023

Messdaten werden mit Hilfe des ADCs und dem Multiplexer erfasst. Um den ADC zu bedienen wird eine Klassenbibliothek von Robert Hammelrath [102] und die I2C aus der machine-Bibliothek des Raspberry Picos verwendet. Dabei wird zuerst an den Pins 4 und 5 eine I2C-Bus Schnittstelle mit einer Frequenz von 400 kHz angelegt. Pin 4 ist für die Daten verantwortlich und Pin 5 gibt den Takt weiter. Sobald ein Messwert vom ADC erstellt wurde, schickt der ALERT-Pin des ADCs ein Signal an den Microcontroller.

irq_pin = Pin(7, Pin.IN, Pin.PULL_UP)
irq_pin.irq(trigger = Pin.IRQ_FALLING, handler = sample)

In der ersten Codezeile wird der Pin 7 am Raspberry Pico als Eingangspin und als Pull-Up-Widerstand initialisiert. Anschließend wird definiert, wie der Interrupt ausgelöst wird und welche Funktion dazu abgearbeitet wird. Die Pins zum Schalten des Multiplexers werden wie in der Ventilsteuerung initialisiert. Für die richtigen Schalterstellungen wird ein Vektor angelegt, in dem die richtigen Werte zum Ansteuern der Pins hinterlegt sind. Diese werden an die Pins adresse0, adresse1 und adresse2 übergeben. Dadurch wird mit den richtigen Indices der entsprechende Kanal eingestellt.

Datei:20230816 Messwerterassung Flussdiagramm.pdf

Zuerst wird der Interrupt ausgelöst. Somit beginnt die Auswertung an einem der verbauten Messsensors. Dieses Signal wird aus einem analogen Spannungswert zu einer 16-Bit digitalen Zahl umgewandelt. Um die Zahl zu verstehen, wird diese umgerechnet in einen Spannungswert von 0 bis 5000 mV. Danach wird überprüft, ob das Messwertflag (MWflag) schon gesetzt ist. Wenn der MWflag gleich 0 ist, wird der Messwert verworfen und das Flag wird auf 1 gesetzt. Somit wird sichergestellt, dass ein sinnvoller Messwert ausgewertet wird. Wenn der MWflag auf 1 gesetzt ist, wird Wert für die MATLAB-GUI angepasst und in die vorangelegte chan_List eingespeichert. Dazu wird die Laufvariable ch um 1 erhöht, damit der nächste Kanal eingestellt werden kann und der kommende Messwert in die chan_List auf den nächsten Index eingetragen wird. Solange nicht alle acht Kanäle durchlaufen sind, wird jeder 2. Messwert erfasst und in die Liste gespeichert. Nachdem alle Sensoren erfasst wurden, werden die Werte mit Hilfe einer Printanweisung und eines Kennbuchstaben an die MATLAB-GUI gesendet.

- chan_list[0] = Boilertemperatur
- chan_list[1] = Mischwassertemperatur
- chan_list[2] = nicht belegt
- chan_list[3] = Brühgruppentemperatur
- chan_list[4] = Brühgruppendruck
- chan_list[5] = Boilerdruck
- chan_list[6] = Leitungsdruck
- chan_list[7] = Wassertemperatur vor der Pumpe

Im Anschluss wird die Laufvariable auf 0 gesetzt und der erste Kanal am Multiplexer wird wieder eingestellt. Damit weiterhin der erste Messwert verworfen wird, ist das MWflag wieder auf 0 gesetzt.


Armin Rohnen, 30.07.2023

Ziel für die Messwerterfassung ist ein Programmcode der die 8 Messkanäle der Messwertplatine, welche über den Multiplexerbaustein 4051 durchgeschaltet werden, mit möglichst hoher Abtastrate zu erfassen und an die MATLAB®-GUI zu übermitteln. Weitere Anforderung ist, dass die einzelnen Messkanäle zeitlich so nah wie möglich erfasst werden, so dass von zeitgleicher Messung ausgegangen werden kann.

Mit ADS1115_Test.py existiert dazu ein Mustercode, der die Classenbibliothek von Robert Hammelrath [102] verwendet.

Für die Ausführung werden die Module Oin und I2C aus der machine-Bibliothek des Raspberry Pi Picos, die ads1x15 Classenbibliothek und das Modul time. Letzteres dürfte lediglich für dieses Testprogramm erforderlich sein, denn es kann eine Messzeit (Ausführungszeit) definiert werden.

Die vorbelegte Liste für die Mittelwertbildung und die Lafvariable xi werden in diesem Programmcode nicht verwendet. Es existiert eine Liste für das Bitmuster welches am Multiplexerbaustein die Kanalselektion durchführt. Um hier zu einer der Messwertplatine logischen Durchschaltung zu gelangen, müssen aggf. an dieser Stelle Änderungen vorgenommen werden. Die Pin-Zuordnung im testprogramm entspricht der Pin-Zuordnung auf der Messwertplatine. Für das Umschalten am Multiplexer wird enable auf 1 gesetzt, damit wird der Multiplexer deaktiviert. Danach erfolgt über die Pins adresse0, adresse1 und adresse2 die Adressauswahl, weclhe durch setzen von enable auf 0 aktiviert wird. Die Pins für die Adresse und Enable des Multiplexers müssen im MicroPython-Code defniert werden. Der Multiplexer wird auf einen vordefinierten Messkanal initialisiert.

Der ADC ads1115 benötigt eine I2C-Verbindung. Hierzu wird I2C1 mit den Pins 27, für SCL (Takt), und 26, für SDA (Daten), verwendet. Der ads1115 verfügt zwar im Single-Endet-Modus über 4 Eingangskanäle, jedoch werden für das Umschalten von Messkanälen am ADC 150 ms benötigt. Messbereich (Parameter Gain) und Abtastrate könne am ADC eingestellt werden. Da sich an einem I2C-Bus mehrere Bauelemente befinden können, muss der ADC definiert werden. Mit der Definition wird auch der Parameter Gain gesetzt.
Für die Erfassung der Messdaten existiert eine Funktion, welche durch einen Interrupt aufgerufen wird. Die Mess-Funktion ignoriert den erfassten Messwert, wenn dieser während des Kanalwechsels am Multiplexerbaustein erfogt sein könnte. Dadurch wird lediglich jeder zweite erfasste Messwert verwendet. Der 16Bit-Messwert wird in einen Spannungswert umgerechnet. Die Umrechnung in physikalische Werte erfogt in der MATLAB®-GUI. Nach der Erfassung eines gültigen Messwerts wird um einen Messkanal weiter geschaltet. Sind alle 8 Messkanäle erfasst werden diese mit einer berechneten Abtastrate ausgegeben. Die hier bestimmte Abtastrate gibt an, wie oft je Sekunde eine Messreihe aus 8 Messkanälen durchgeführt werden kann. Die Konfiguration sollte so gewählt werden, dass möglichst die gewünschten 10 Messreihen je Sekunde erreicht werden.

Es muss ein irq_pin definiert werden. Dieser wird mit dem Alert-Pin des ADC verbunden. Immer wenn der ADC einen Messwert erstellt, also eine Messwertwandlung durchgeführt hat, erfolgt über diesen Pin ein Signal. Dieses Signal wird verwendet um im MicroPython-Programm anzustoßen, dass der erfasste Messwet beim ADC ausgelesen wird. Diese Funktionalität muss dem Pin zugeordnet definiert werden.

Den Start der Messerterfassung am ADC darf erst dann erfolgen, wenn alle Konfigurationen durchgeführt sind. Dem Mess-Start werden die Parameter der ADC-Abtastrate und der am ADC zu messende Kanal mitgegeben.

Das Testprogramm beendet nach einer definierten Zeitspanne die Ausführung.


Noureddine Ait Ouhamou, 21.06.2023

Die Messwertkonfiguration wurde angepasst. Somit sind die 16-Bit Auflösung des ADCs auf 5000 mV abgebildet worden. Die Umrechnungskurven sind aus dem Datenblatt entnommen und die angegebenen Werte aus dem Programm sind plausibel. Beim Boilerdrucksensor kam es zuerst zu keiner Verbindung, obwohl durch das Testen mit angelegter Spannung im Programm Messwerte ausgelesen wurden. Nach dem der Spannungsteiler überbrückt wurde und entfernt wurde, sind Werte vom Boilerdruck ausgelesen worden. Die Messplatine läuft mit dem Programm ohne Probleme eine Testzeit von 30 min. Dadurch ist das Problem, welches die STM32 hat, dass diese nach 15 min einschläft, behoben.

Noureddine Ait Ouhamou, 14.06.2023

Durch das Verschieben der Messwertspeicherung in die ISR wurde das Problem behoben, dass eine 0 als Mittelwert in der Variable NTC1_mean gespeichert wird. Somit muss die erste Messreihe nicht mehr gelöscht werden. Des Weiteren muss zwischen den einzelnen Messwerten der Mikrocontroller für 2 ms schlafen gelegt werde, damit der ADC bei 860 SPS genug Zeit hat einen neuen Wert auszuwerten. Dadurch hat sich ergeben, dass der ADS1115 die Messgeschwindigkeit limitiert. Je geringer die Konversationsrate des ADCs eingestellt wird, umso länger wird der Multiplexer 4051 die Schalterstellung halten, damit der ADC die angelegte Spannung auswerten kann. Dadurch ergeben sich 6 Messwerte pro Sensor, die an die Matlab GUI gesendet werden können. Eine mögliche Überlegung die Geschwindigkeit der I2C-Leitung zu erhöhen, hat das Problem nicht behoben. Um dies zu verbessern, sollte eine neue Schaltung entworfen werden werden, die einen besseren AD-Wandler unterstützt, mit dem mehr Messwerte in der Sekunde ausgewerten werden und somit die Zeit für das Einhalten der Schalterstellung zu verringern.

Noureddine Ait Ouhamou, 30.05.2023

Die Messwertdatenerfassung gibt die richtigen Daten aus. Dabei wird die erste Messreihe nicht weitergegeben, damit die 0 für den Messwert NTC1 nicht verwertet wird. Hinzu kommt, dass durch die 0 die Messwerte in die falsche Liste eingespeichert werden. Die Lösung war jede Liste den richtigen Mittelwert zuzuordnen. Prinzipiell ist in der NTC1 Liste die Messwerte der NTC2 enthalten. Dadurch wird jede Liste um einen Platz weiter verschoben. Jede Schalterstellung braucht zum Umstellen eine Zeit von 10 ms. Daraus resultiert bei 8 möglichen Stellungen eine Messwertzeit um die 80 ms. Somit hat man etwa 10 Messwerte die Sekunde.

Noureddine Ait Ouhamou, 24.05.2023

Mit Hilfe der ISR werden die Daten unterbrochen vom ADC an den Raspberry Pico weitergeleitet und ausgewertet. Dabei ist bei einer Datenrate von 8 Messwerte die Sekunde und eine Pause von 100 ms zwischen den Schalterstellungen des Multiplexers jeder zweite Wert ein Mischwert. Das bedeutet man darf erst immer den 1. + 2n. Wert verwenden. Bei höheren Datenraten wird nach dem Schalten ein Mischwert wiedergegeben und hinterher der richtige Wert. Bei 860 Messwerte die Sekunde entsteht dieser Mischwert nicht mehr. Ohne die Schalterpause wird kontinuierlich 4.096 V ausgegeben.

Noureddine Ait Ouhamou, 23.05.2023

Der ADC wird mit einer Datenrate von 250 Messdaten pro Sekunde betrieben. Dabei wird kein Messwert verworfen. Die Matlab-GUI wird weiterhin den Timer bereitstellen und die Kommunikationszeit vom 1/10 Sekunden aufrecht erhalten. Das Skript befindet sich befindet sich unter Programmcode. In einer while-Schleife wird NTC3 ebenfalls als Kurzschluss ausgelesen, jedoch beim Speichern in die Listen nicht. Da werden die Werte richtig in die Listen eingelesen.

Armin Rohnen, 16.02.2023

Die Messplatine ist dafür ausgelegt, dass diese 8 Messkanäle über einen MCU-externen 16-Bit-ADC erfasst. 4 Messkanäle sind als Spannungseingang 0 bis 5 V ohne weitere Signalaufbereitung lediglich mit einem Tiefpassfilter ausgelegt. 4 weitere Kanäle sind als Temperaturmesskanal für NTC-Sensoren mit einer Referenzspannungsquelle und einem Spannungsteiler und nachgeschaltetem Tiefpassfilter mit angepasstem Verstärkungsfaktor ausgelegt.

Als ADC wird ein ADS1115-Board mit vorgeschaltetem Multiplexer verwendet. Dieser wird in einem kontinuierlichen Mode betrieben, so dass via ISR ein multiplex Messbetrieb gesteuert wird.

Über die Kommunikation zum Basisboard und/oder zur MATLAB®-GUI sollen im 1/10-Sekunden-Raster die Messdaten aller 8 Messkanäle übermittelt werden.

Sollten für Testzwecke die Messkanäle nicht ausreichen, können weitere Messplatinen verwendet werden. Dabei ist jedoch auf die eindeutige MCU-Kennung zu achten.