Temperatursensor mit Matlab/Simulink: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Zeile 50: Zeile 50:
|}
|}
[[Bild:Kennlinie.jpg|thumb|400px|right|Abb. 4: Kennlinie]]
[[Bild:Kennlinie.jpg|thumb|400px|right|Abb. 4: Kennlinie]]
Die Temperatur und die Signale stellen nun die Koordinatenachsen dar, mit deren Hilfe die Kennlinie erzeugt wird (siehe Abb.4). Teilt man nun die dezimalen Signale durch die dazugehörige Temperatur, so erhält man die Temperaturauflösung von 0,0625°C, was laut dem Datenblatt der typischen Auflösung entpricht. Durch die Temperaturauflösung wird deutlich, dass ein Grad Temperatur in <math>1^\circ C/0,0625^\circ C=16</math> Stufen unterteilt werden kann. Der Messbereich des TMP275 liegt bei -40°C bis 125°C, was in Summe einen Bereich von 165 Temperaturwerten abdeckt. Somit benötigt man <math>165\cdot16=2640</math> Darstellungsmöglichkeiten, um alle Temperaturwerte mit der gegebenen Auflösung darstellen zu können.
Teilt man nun die dezimalen Signale durch die dazugehörige Temperatur, so erhält man die Temperaturauflösung von 0,0625°C, was laut dem Datenblatt der typischen Auflösung entspricht. Durch die Temperaturauflösung wird deutlich, dass ein Grad Temperatur in <math>1^\circ C/0,0625^\circ C=16</math> Stufen unterteilt wird. Der Messbereich des TMP275 liegt bei -40°C bis 125°C, was in Summe einen Bereich von 165 Temperaturwerten abdeckt. Somit benötigt man <math>165\cdot16=2640</math> Darstellungsmöglichkeiten, um alle Temperaturwerte mit der gegebenen Auflösung darstellen zu können.
[[Bild:BitsandBandwidth.jpg|thumb|400px|right|Abb. 5: Bits and Bandwidth]]
[[Bild:BitsandBandwidth.jpg|thumb|400px|right|Abb. 5: Bits and Bandwidth]]
[[Bild:DELTA-SIGMA BLOCK DIAGRAM.jpg|thumb|400px|right|Abb. 6: DELTA-SIGMA BLOCK DIAGRAM]]
[[Bild:DELTA-SIGMA BLOCK DIAGRAM.jpg|thumb|400px|right|Abb. 6: DELTA-SIGMA BLOCK DIAGRAM]]

Version vom 25. Juni 2018, 13:50 Uhr

Autor: Sergej Vogel
Betreuer: Prof. Schneider
Sensor: Lego Temperatursensor 9749


Aufgabenstellung

In dem Fach "Signalverarbeitende Systeme" aus dem Studiengang "Business and Systemsengineering" wurde jeder Student damit beauftragt, sich Semester begleitend mit einem Sensor auseinander zu setzen. Genauer gesagt, soll man sich über den Sensor informieren, sowie dessen Signale mittels MATLAB/Simulink verwertbar machen.

Primärsensor

Abb. 1: Temperatursensor [1]


In diesem Kapitel soll der LEGO® MINDSTORMS® Temperatursensor (Artikel 9749) vorgestellt und erläutert werden (siehe Abb. 1). Leider gibt es sehr wenige Informationen zu dem Sensor. Aus diesem Grund habe ich den Kundenservice von Lego Mindstorms kontaktiert und um ein Datenblatt des Sensors gebeten. Nach Aussage des Kundenservice besitzen sie kein Datenblatt zu diesem Sensor. Dennoch war es möglich einige Daten zusammen zu bekommen. Es handelt es sich um einen digitalen Sensor, der durch einen LEGO® MINDSTORMS® Education NXT (Software v.2.1) oder LEGO MINDSTORMS Education EV3 (EV3 Software) angesteuert und ausgelesen werden kann. Dabei findet die Kommunikation, zwischen dem Mikrocontroller und dem Sensor, über die I²C Schnittstelle statt. Dafür muss die 7 bit Adresse des Sensors angesprochen werden. Der Einsatz des Sensors liegt in dem Temperaturbereich: -20°C bis 120°C bzw. -4°F bis 248°F, wobei dieser erst kalibriert werden muss. [2] [3]
Laut Angaben, ist in dem NXT Gehäuse der Sensor von Typ TMP275 mit einem 12 Bit Analog-Digital-Umsetzer (ADU oder engl. Analog-Digital-Converter ADC oder A/D-Wandler) integriert. Die Temperaturaufnahme erfolgt hierbei mittels einer in dem TMP275 Sensor verbauten Diode und dem Fühlerrohr. [4]






Signalverarbeitung

Abb. 2: TMP275 Temperatursensor [5]

Das analoge Temperatursignal wird über das Fühlerrohr aufgenommen und an die, im Temperatursensor TMP275 integrierte, Temperaturdiode weitergeleitet. Die Diode erzeugt eine zur Temperatur proportionale elektrische Größe, die im weiteren Schritt an den 12-Bit A/D Wandler übergeben wird. Daraus resultiert ein 12-Bit Code, den es zu interpretieren gilt. Mit Hilfe der Tabelle aus dem Datenblatt des TMP275 Sensors kann eine Kennlinie erzeugt werden (siehe Abb.4), wodurch jedem Signal eine bestimmte Temperatur zugeordnet wird.[6]

Temperatur in °C Signale im Hexadezimalsystem Signale im Dezimalsystem
128 7FF 2047
127.9375 7FF 2047
100 640 1600
80 500 1280
75 4B0 1200
50 320 800
25 190 400
0.25 004 4
0 0 0
-0.25 FFC -4
-25 E70 -400
-55 C90 -880
Abb. 4: Kennlinie

Teilt man nun die dezimalen Signale durch die dazugehörige Temperatur, so erhält man die Temperaturauflösung von 0,0625°C, was laut dem Datenblatt der typischen Auflösung entspricht. Durch die Temperaturauflösung wird deutlich, dass ein Grad Temperatur in Stufen unterteilt wird. Der Messbereich des TMP275 liegt bei -40°C bis 125°C, was in Summe einen Bereich von 165 Temperaturwerten abdeckt. Somit benötigt man Darstellungsmöglichkeiten, um alle Temperaturwerte mit der gegebenen Auflösung darstellen zu können.

Abb. 5: Bits and Bandwidth
Abb. 6: DELTA-SIGMA BLOCK DIAGRAM

















Es ist plausibel einen 12-Bit A/D Wandler zu nutzen, da dieser 4096 Zustände darstellen kann, während ein 11-Bit A/D Wandler nur auf 2048 Zustände kommt und somit nicht ausreicht. Bei dem, im TMP275 Sensor integrierten, Analog-Digital-Wandler handelt es sich um den Delta-Sigma-Wandler (ΔΣ-ADC). Neben den anderen möglichen ADCs bietet der Sigma-Delta-Wandler eine gute Kombination aus hoher Auflösung und einem relativ hohen Durchsatz (siehe Abb.5).Vereinfacht besteht der ΔΣ-ADC aus drei Hauptabschnitten (siehe Abb.6):

Delta-Sigma-Modulator
  • Die Aufgabe des Modulators besteht darin, die analogen Eingänge in einen 1-Bit-modulierten digitalen Strom umzuwandeln.
Digital Filter (Integrator)
Decimator















I²C Schnittstelle


Der I²C Bus (Inter Integrated Circuit) wurde von Philips konzipiert und stellt heute den Standard für die Systemsteuerung dar. Der Bus basiert auf einem Master-Slave-Prinzip und hat zwei Leitungen zur Verfügung. Die beiden Leitungen heißen Signal Data (SDA) und Signal Clock (SCL). Wie die Namen schon sagen, wird die SDA Leitung für Datenübertragung genutzt, während die SCL Leitung für den Takt zuständig ist. Der Takt wird durch den Master erzeugt, kann aber vom Slave solange auf 0 gehalten werden, bis der Slave wieder bereit ist. Die Daten können in beide Richtungen byteweise übermittelt werden. In diesem Fall stellt der Temperatursensor den Slave dar. Dieser hat eine eindeutige 7-Bit-Adresse, die der Master anspricht.

START-Bedingung

Abb. 3: START-Bedingung

Zu Anfang befinden sich die beiden Leitungen im Leerlauf und werden durch Pullupwiderstände auf hohem Pegel gehalten. Zu diesem Zeitpunkt können keine Daten übertragen werden. Um eine Kommunikation zwischen Master und Slave herzustellen, muss eine Startbedingung erzeugt werden. Diese kommt Zustande, indem die SDA Leitung von HIGH auf LOW wechselt, während die SCL Leitung weiterhin auf HIGH bleibt. Erst dann beginnt die Datenübertragung. Hervorgerufen wird die Startbedingung durch den Master. Ab dem Moment befindet sich der Bus im Modus "beschäftigt".














Adressierung und Read/Write (R/W)

Abb. 4: Temperatursensor

Nach der Startbedingung beginnt die von dem Master ausgehende Kommunikation. Übertragen werden die Informationen byteweise (8-Bit). Damit sich ein Slave angesprochen fühlt, muss der Master die eindeutige Adresse des Slave ansprechen. Somit sendet der Master auf der SDA Leitung eine 7-Bit Adresse, um den Slave anzusprechen, gefolgt vom einem weiteren Bit mit der Information, ob der Master an den Slave eine Information senden (LOW), oder vom Slave Informationen erhalten möchte (HIGH). Dieses wird als Datenrichtungsbit bezeichnet.






Aknowledge (ACK) und Not Aknowledge (NACK)

Abb. 5: Acknowledge/Not Acknoledge

Die Bestätigung ACK erfolgt nach jedem Byte. Dadurch teilt der Empfänger/Slave (in unserem Fall der Temperatursensor) dem Sender/Master mit, dass das Byte erfolgreich empfangen wurde und das nächste Byte gesendet werden kann. Damit es funktioniert, gibt der Master die SDA-Leitung während des Bestätigungstaktimpulses frei und der Slave zieht die SDA-Leitung auf LOW. Diese bleibt während der HIGH-Periode des Taktimpulses weiterhin auf LOW. Es gibt 5 Bedingungen die zu einem NACK führen:

  1. Auf dem Bus ist kein Empfänger mit der übertragenen Adresse vorhanden, so dass kein Gerät mit einer Bestätigung antworten kann.
  2. Der Empfänger kann nicht empfangen oder senden, da er eine Echtzeitfunktion ausführt und nicht bereit ist, die Kommunikation mit dem Master zu starten.
  3. Während der Übertragung erhält der Empfänger Daten oder Befehle, die er nicht versteht.
  4. Während der Übertragung kann der Empfänger keine weiteren Datenbytes mehr empfangen.
  5. Ein Master-Empfänger muss das Ende der Übertragung an den Slave-Sender signalisieren.




STOP-Bedingung

Abb. 6: STOP-Bedingung

Das Gegenstück zu der Start-Bedingung ist die Stop-Bedingung. Diese wird erzeugt, indem die SDA Leitung von LOW auf HIGH wechselt, während sich die SCL Leitung in der HIGH Phase befindet. Diese Bedingung wird ebenfalls durch den Master erzeugt. Eine bestimmte Zeit nach dem STOP befindet sich die Bus-Leitung im freien Zustand.














Herstellung der Kommunikation

Abb. 7: Herstellung der Kommunikation


In diesem Projekt wird der Temperatursensor zunächst durch einen Arduino angesteuert und ausgelesen. Die vorverarbeiteten Daten werden im nächsten Schritt über eine serielle Schnittstelle an Matlab weitergeleitet und dort verarbeitet.






Anschluss an Arduino

Abb. 9: Arduinoanschluss Schaltplan
Abb. 8: Sensor-Arduino-Verbindung


Da der Sensor eine I²C Schnittstelle besitzt und nicht beschädigt werden soll, wird ein Connector Kit for NXT or EV3 genutzt. Mit diesem Connector ist es möglich, den I²C Bus mit dem Arduino zerstörungsfrei zu verbinden. Zur Hilfe wird ein Steckbrett hinzugezogen, wo der Connector reingesteckt wird. Zur Verbindung werden 4 Kabel benötigt.

  1. Das blaue Kabel stellt die SDA-Leitung dar. Dafür wird das Kabel mit dem Port A4 des Arduinos verbunden.
  2. Das gelbe Kabel stellt die SCL-Leitung dar. Dafür wird das Kabel mit dem Port A5 des Arduinos verbunden.
  3. Das rote Kabel liefert die Spannung von 5 Volt und wird somit an die 5V des Arduinos angeschlossen.
  4. Der I²C Bus besitzt zwei Grounds, die miteinander verbunden und über das schwarze Kabel an das GND des Arduinos angeschlossen werden.
  5. Zum Schluss werden zwei Pull-Up Widerstände von 82kOhm benötigt. Einer davon wird zwischen die Spannungsversorgung und der SDA-Leitung und der andere zwischen Spannungsversorgung und der SCL-Leitung geschaltet.







Sensor-Arduino-Kommunikation

Um die Kommunikation zwischen dem Arduino und dem Sensor zu realisieren, wird die Adresse des Sonsors benötigt. Dies ist auf mehreren Wegen möglich.


  • Die erste Möglichkeit besteht darin die Adresse auszulesen. Hilfreich dabei ist der Logic Analyzer.
    Abb. 10: SDA-SCL-Signale









  • Hat man das Gerät nicht zur Verfügung, so muss recherchiert werden, ob sich jemand mit dem Sensor bereits auseinander gesetzt hat.
  • Für die Kommunikation zwischen Arduino und dem I²C Bus gibt es die sogenannte Wire-Bibliothek.

    //Bibliothek für die I²C Kommunikation
    #include <Wire.h>
    //Adresse des Sensors          
    #define ADDR 0x4C            
    
    byte msb; //erste Byte ist MSB (höherwertig)
    byte lsb; //zweiter Byte ist LSB (niederwertig)
    int Rohwert;
    
    void setup() 
    {
      Wire.begin();
      Serial.begin(9600);
    }
    
    void loop() 
    {
      Wire.requestFrom(ADDR, 2);
      if(Wire.available() >= 2)
      {
        msb = Wire.read(); //erste Byte ist MSB (höherwertig)
        lsb = Wire.read(); //zweiter Byte ist LSB (niederwertig)
     
        Rohwert = ((msb)<<4); //Bitshiften um 4 nach links
        Rohwert |= (lsb>>4);  //Bitshiften um 4 nach rechts und zu dem MSB hinzuaddieren
       
        Serial.println(Rohwert);
      }
      delay(1000);
    }
    





    Weiterleitung der Rohdaten an Matlab

    Die vorverarbeiteten Daten, werden weiter an Matlab gesendet und dort geplotet

    clear all
    clc;
    Object=serial('COM5','BaudRate', 9600, 'DataBits',8);
    fopen(Object);
    
    f = figure; 
    set(f, 'Position', [100, 0, 1200, 1100])
    
    xArry = 1:1:1001;
    yArry = zeros(1,1001);
    
    
    
    for t = 1:1:1001 %100 Sekunden
       
        yArry(1,t) =  str2num(fgetl(Object))*0.0625;
        
        plot(xArry, yArry);
        grid on;
        
        Ticks = 0:100:1000; 
        set(gca, 'XTickMode', 'manual', 'XTick', Ticks, 'xlim', [0,1000]);
        Ticks = 0:1:71;
        set(gca, 'YTickMode', 'manual', 'YTick', Ticks, 'ylim', [0,71]);
        xlabel('Zeit in Dezisekunden') 
        ylabel('Temperatur in °C')
        title('Temperaturverlauf')
        axis([0 1000 0 71]);
        
        
        pause (0.01); 
    end
    
    fclose(Object);
    

    Einzelnachweise

    → zurück zum Hauptartikel: Signalverarbeitende Systeme