Temperatursensor mit Matlab/Simulink: Unterschied zwischen den Versionen
(834 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 6: | Zeile 6: | ||
=Aufgabenstellung= | =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. | 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 | Genauer gesagt, soll man sich über den Sensor informieren, sowie dessen Signale mittels MATLAB/Simulink verwertbar machen. | ||
=Primärsensor= | =Primärsensor= | ||
[[Bild:Temperatursensor.jpg|thumb|450px|left|Abb. 1: Temperatursensor <ref name="Temperatursensor"> [https://education.lego.com/en-us/products/mindstorms-temperature-sensor/9749 ''MINDSTORMS Temperature Sensor'']. Abgerufen am 20. Juni 2018.</ref>]] | |||
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.<br/> | |||
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. | |||
<ref name="Temperatursensor"> [https://education.lego.com/en-us/products/mindstorms-temperature-sensor/9749 ''MINDSTORMS Temperature Sensor'']</ref> | |||
<ref> [https://www.electronic-shop.lu/DE/products/129801 ''Temperatursensor'']. Abgerufen am 20. Juni 2018.</ref> <br/> | |||
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. | |||
<ref name = 'Arduino Praxiseinstieg'>Thomas Brühlmann: [https://books.google.de/books?id=M_hhCAAAQBAJ&pg=PT264&lpg=PT264&dq=adresse+0x4c&source=bl&ots=DXLfjXwt90&sig=4-vjdxewgakrCD6Y15_z65iy-7Y&hl=de&sa=X&ved=0ahUKEwj6gIPyifPaAhUnEJoKHUXSBCYQ6AEIKDAA#v=onepage&q=adresse%200x4c&f=false ''Arduino Praxiseinstieg.''] Kapitel 5.3 integrierte Temperatursensoren </ref> | |||
<br/><br/><br/><br/><br/><br/><br/> | |||
==Signalverarbeitung== | |||
[[Bild:TEMP.-SENSOR ABLAUFPLAN.jpg|thumb|300px|left|Abb. 17: Prozessablaufplan]] | |||
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. Über die Diode ist nichts genaueres bekannt. Daraus resultiert ein 12-Bit Code, den es zu interpretieren gilt. Mit Hilfe der Tabelle aus dem Datenblatt des TMP275 Sensors, die sich unter dem Text befindet, wird eine Kennlinie erzeugt (siehe Abb.4), bei der jedem Signal eine bestimmte Temperatur zugeordnet wird. <ref name="Datenblatt">[http://www.ti.com/lit/ds/symlink/tmp275.pdf ''TMP275 ±0.5°C Temperature Sensor With I²C and SMBus Interface in Industry Standard LM75 Form Factor and Pinout'']. Abgerufen am 20. Juni 2018.</ref> | |||
Wird nun das jeweilige Signal des Sensors durch die dazugehörige Temperatur geteilt, so erhält man die Temperaturauflösung von 0,0625°C, was laut dem Datenblatt der typischen Auflösung entspricht. Durch die erhaltene Temperaturauflösung wird deutlich, dass 1°C in <math>1^\circ C/0,0625^\circ C=16</math> Abstufungen dargestellt werden kann. In Kombination mit dem Messbereich des TMP275 welches bei -40°C bis 125°C liegt und in Summe einen Bereich von 165 Temperaturwerten abdeckt, lässt sich festhalten, dass man einen AD-Wandler benötigt, welcher <math>165\cdot16=2640</math> Zustände darstellen kann. Somit ist es plausibel einen 12-Bit A/D Wandler zu nutzen, da dieser auf <math>2^{^12} = 4096 </math> Zustände kommt, während ein 11-Bit A/D Wandler nur <math>2^{^11} = 2048 </math> Zustände darstellen kann, was nicht ausreichend ist.<br/><br/> | |||
{|align="right" | |||
[[Bild: | |[[Bild:TMP275 Temperatur Sensor.jpg|thumb|325px|right|Abb. 2: TMP275 Temperatursensor <ref name="Datenblatt">[http://www.ti.com/lit/ds/symlink/tmp275.pdf ''TMP275 ±0.5°C Temperature Sensor With I²C and SMBus Interface in Industry Standard LM75 Form Factor and Pinout'']. Abgerufen am 20. Juni 2018.</ref>]] | ||
[[Bild: | | | ||
| | |||
| | |||
| | |||
{| class="wikitable centered" | |||
|- | |||
! 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 | |||
|} | |||
|[[Bild:Kennlinie.jpg|thumb|450px|right|Abb. 4: Kennlinie]] | |||
|} | |||
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> | |||
'''A/D-Umwandler:'''<br/><br/> | |||
Der A/D-Umwandler hat die Aufgabe, analoge (kontinuierliche) Werte aus dem unendlichen Wertebereich in einen endlichen (diskreten) Wertebereich abzubilden. Dies bedeutet, dass die kontinuierlichen Signale in bestimmten Zeitabständen abgetastet werden und in dem Augenblick, je nach Auflösung des ADUs, in einen wertediskreten Wert umwandelt. Somit kommt ein zeit- und wertediskretes Signal heraus. Um ein kontinuierliches Signal korrekt zu rekonstruieren, muss das Signal nach dem Shannonsche Abtasttheorem mit einer mindestens doppelt so hohen Frequenz abgetastet werden, als die Frenquenz des Signals ist.<ref name="Analog-Digital-Umwandler (ADU)"> Prof.Dr.-Ing. Schneider, Ulrich: Analog-Digital-Umsetzer (ADU), Fach: Signalverarbeitende Systeme, Vorlesung Nr. 6. Abgerufen am 30 Juni 2018.</ref> | |||
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). Dabei ist der Delta-Sigma-Modulator der Kern des ADC und ist verantwortlich für die Digitalisierung des analogen Eingangssignals bei gleichzeitiger Reduzierung des Rauschens durch Techniken wie Oversampling, Noise Shaping und Digitalfilter. <ref name="Oversampling">[https://www.fairaudio.de/lexikon/oversampling/''HiFi-Lexikon: Oversampling'']. Abgerufen am 20. Juni 2018.</ref> Vereinfacht besteht der ΔΣ-ADC aus drei Hauptabschnitten (siehe Abb.6):<br/><br/> | |||
'''Delta-Sigma-Modulator''': | |||
*Die Aufgabe des Modulators besteht darin, die analogen Eingänge in einen 1-Bit-modulierten digitalen Strom umzuwandeln. Genauer gesagt, arbeitet der Wandler nur mit einem Bit welches die Werte 0 und 1 annehmen kann. Bei dieser Art der A/D Wandlung werden lediglich die Pegelunterschiede von einem Abtastwert zum nächsten gekennzeichnet (siehe Abb.7).<br/> | |||
'''Digital Filter (Integrator)''': | |||
*Der Integrator integriert diesen einzelnen Bitstrom zu einem Mehrbitwert, der einen Durchschnittswert des Signals darstellt, jedoch mit vielen zusätzlichen Informationen. | |||
'''Decimator''': | |||
*Schließlich entfernt der Decimator die zusätzlichen unnötigen Informationen, was zu einer Ausgabe führt, die genau ist, aber der korrekten minimalen Größe entspricht. | |||
<br/> | |||
Bei der Umwandlung des analogen Signals in ein digitales, wird die Signalkurve in diskrete Werte unterteilt. Dies bedeutet, der Wandler entscheidet in den Situationen, in welchen diskreten Wert er das analoge Signal wandelt. Einfacher gesagt, das Signal wird je nach Auflösung auf- bzw. abgerundet. Dieser Unterschied zwischen dem analogen und konvertierten Signal wird als "Quantisierungsfehler" oder "digitales Rauschen" bezeichnet. Um das Rauschen zu reduzieren, werden die oben genannten Techniken kurz erläutert.<ref name="NoiseShaping"> Henner Wöhler: [http://myweb3.hs-harz.de/mkreyssig/af/pdf/NoiseShaping.pdf''Noise Shaping''] Abgerufen am 20. Juni 2018.</ref><br/><br/> | |||
'''Oversampling:'''<br/> | |||
Laut dem Abtasttheorem muss die Frequenz mit einer (mind.) doppelten Abtastrate abgetastet werden. Es gibt einige Möglichkeiten ein Signal abzutasten. Von Oversampling ist dann die Rede, wenn die Signale mit einer höheren Abtastrate abgetastet werden, als für die Darstellung der Bandbreite nötig wird. Dadurch wird das Quantisierungsrauschen minimiert, bleibt jedoch vorhanden.<ref>[https://www.itwissen.info/oversampling-Ueberabtastung.html''Oversampling'']. Abgerufen am 20. Juni 2018.</ref> <ref name="Oversampling">[https://www.fairaudio.de/lexikon/oversampling/''HiFi-Lexikon: Oversampling'']. Abgerufen am 20. Juni 2018.</ref><br/><br/> | |||
'''Noise Shaping:'''<br/> | |||
Das durch die Quantisierung entstandene Rauschen wird durch das Noise Shaping verringert. Dabei wird die Rauschenergie aus dem Audiobereich in einen höheren Frequenzbereich verschoben. Dadurch gehen diese Signale nicht in die Signalverarbeitung mit ein.<ref name="NoiseShaping">[https://www.itwissen.info/noise-shaping-Noise-Shaping.html''Noise Shaping'']. Abgerufen am 20. Juni 2018.</ref><br/><br/> | |||
{|align="left" | |||
|[[Bild:BitsandBandwidth.jpg|thumb|400px|right|Abb. 5: Bits and Bandwidth <ref name="DELTASIGMAADC">[[https://hackaday.com/2016/07/07/tearing-into-delta-sigma-adcs-part-1/''DELTA SIGMA ADC’S'']. Abgerufen am 20. Juni 2018.</ref>]] | |||
|[[Bild:DELTA-SIGMA BLOCK DIAGRAM.jpg|thumb|400px|right|Abb. 6: DELTA-SIGMA BLOCK DIAGRAM<ref name="DELTASIGMAADC">[[https://hackaday.com/2016/07/07/tearing-into-delta-sigma-adcs-part-1/''DELTA SIGMA ADC’S'']. Abgerufen am 20. Juni 2018.</ref>]] | |||
|[[Bild:1Bit-DeltaModulation.jpg|thumb|300px|right|Abb. 7: 1-Bit-DeltaModulation <ref name="DELTASIGMAADC">[https://hackaday.com/2016/07/07/tearing-into-delta-sigma-adcs-part-1/''DELTA SIGMA ADC’S'']. Abgerufen am 20. Juni 2018.</ref>]] | |||
|} | |||
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> | <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> | ||
==I²C Schnittstelle== | ==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. <ref name = 'I²C Bus'>[https://rn-wissen.de/wiki/index.php?title=I2C''I²C Bus'']. Abgerufen am 20. Juni 2018.</ref><ref>[https://wwwpub.zih.tu-dresden.de/~ss17/wiki/www.mr.inf.tu-dresden.de/wiki/tiki-index78de.html''I²C'']. Abgerufen am 20. Juni 2018.</ref><ref name = 'I2C-bus specification and user manual'>[https://www.nxp.com/docs/en/user-guide/UM10204.pdf''I2C-bus specification and user manual'']. Abgerufen am 20. Juni 2018.</ref> | |||
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=== | ===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".<ref name = 'I²C Bus'>[https://rn-wissen.de/wiki/index.php?title=I2C''I²C Bus'']. Abgerufen am 20. Juni 2018.</ref><ref name = 'I²C'>[https://wwwpub.zih.tu-dresden.de/~ss17/wiki/www.mr.inf.tu-dresden.de/wiki/tiki-index78de.html''I²C'']. Abgerufen am 20. Juni 2018.</ref><ref name = 'I2C-bus specification and user manual'>[https://www.nxp.com/docs/en/user-guide/UM10204.pdf''I2C-bus specification and user manual'']. Abgerufen am 20. Juni 2018.</ref> | |||
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)=== | ===Adressierung und Read/Write (R/W)=== | ||
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.<ref>[http://www.esacademy.com/en/library/technical-articles-and-documents/miscellaneous/i2c-bus/i2c-bus-events/transmitting-a-byte-to-a-slave-device.html''Transmitting a Byte to a Slave Device'']. Abgerufen am 20. Juni 2018.</ref><ref name = 'I²C'>[https://wwwpub.zih.tu-dresden.de/~ss17/wiki/www.mr.inf.tu-dresden.de/wiki/tiki-index78de.html''I²C'']. Abgerufen am 20. Juni 2018.</ref><ref name = 'I2C-bus specification and user manual'>[https://www.nxp.com/docs/en/user-guide/UM10204.pdf''I2C-bus specification and user manual'']. Abgerufen am 20. Juni 2018.</ref> | |||
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)=== | ===Aknowledge (ACK) und Not Aknowledge (NACK)=== | ||
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. | 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. | 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.<ref name = 'I²C Bus'>[https://rn-wissen.de/wiki/index.php?title=I2C''I²C Bus'']. Abgerufen am 20. Juni 2018.</ref> | ||
Es gibt 5 Bedingungen die zu einem NACK führen: | Es gibt 5 Bedingungen die zu einem NACK führen: | ||
#Auf dem Bus ist kein Empfänger mit der übertragenen Adresse vorhanden, so dass kein Gerät mit einer Bestätigung antworten kann. | |||
# | #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. | ||
# | #Während der Übertragung erhält der Empfänger Daten oder Befehle, die er nicht versteht. | ||
# | #Während der Übertragung kann der Empfänger keine weiteren Datenbytes mehr empfangen. | ||
# | #Ein Master-Empfänger muss das Ende der Übertragung an den Slave-Sender signalisieren.<ref name = 'I²C'>[https://wwwpub.zih.tu-dresden.de/~ss17/wiki/www.mr.inf.tu-dresden.de/wiki/tiki-index78de.html''I²C'']. Abgerufen am 20. Juni 2018.</ref><ref name = 'I2C-bus specification and user manual'>[https://www.nxp.com/docs/en/user-guide/UM10204.pdf''I2C-bus specification and user manual'']. Abgerufen am 20. Juni 2018.</ref> | ||
# | |||
< | |||
===STOP-Bedingung=== | ===STOP-Bedingung=== | ||
[[Bild:StopderKommunikation.jpg|mini| | 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.<ref name = 'I²C Bus'>[https://rn-wissen.de/wiki/index.php?title=I2C''I²C Bus'']. Abgerufen am 20. Juni 2018.</ref><ref name = 'I²C'>[https://wwwpub.zih.tu-dresden.de/~ss17/wiki/www.mr.inf.tu-dresden.de/wiki/tiki-index78de.html''I²C'']. Abgerufen am 20. Juni 2018.</ref><ref name = 'I2C-bus specification and user manual'>[https://www.nxp.com/docs/en/user-guide/UM10204.pdf''I2C-bus specification and user manual'']. Abgerufen am 20. Juni 2018.</ref> | ||
< | {|align="left" | ||
|[[Bild:StartderKommunikation.jpg|mini|200px|right|Abb. 8: START-Bedingung<ref name = 'I²C Bus'>[https://rn-wissen.de/wiki/index.php?title=I2C''I²C Bus'']. Abgerufen am 20. Juni 2018.</ref>]] | |||
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> | |[[Bild:AdressierungundRW.jpg|thumb|500px|right|Abb. 9: Adressierung und R/W<ref name = 'I²C Bus'>[https://rn-wissen.de/wiki/index.php?title=I2C''I²C Bus'']. Abgerufen am 20. Juni 2018.</ref>]] | ||
|[[Bild:ACKNACK.jpg|mini|300px|right|Abb. 10: Acknowledge/Not Acknoledge<ref name = 'I²C Bus'>[https://rn-wissen.de/wiki/index.php?title=I2C''I²C Bus'']. Abgerufen am 20. Juni 2018.</ref>]] | |||
|[[Bild:StopderKommunikation.jpg|mini|200px|right|Abb. 11: STOP-Bedingung<ref name = 'I²C Bus'>[https://rn-wissen.de/wiki/index.php?title=I2C''I²C Bus'']. Abgerufen am 20. Juni 2018.</ref>]] | |||
|} | |||
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> | |||
==Herstellung der Kommunikation== | ==Herstellung der Kommunikation== | ||
[[Datei:HerstellungDerKommunikation.jpg|mini|x120px| | [[Datei:HerstellungDerKommunikation.jpg|mini|x120px|left|Abb. 12: Herstellung der Kommunikation]] | ||
In diesem Projekt wird der Temperatursensor zunächst durch einen Arduino angesteuert und ausgelesen. Im weiteren Schritt werden die Daten über eine serielle Schnittstelle an Matlab gesendet und dort weiter verarbeitet.<br/><br/><br/><br/><br/><br/><br/><br/> | |||
In diesem Projekt wird der Temperatursensor zunächst durch einen Arduino angesteuert und ausgelesen. | |||
<br/><br/><br/><br/><br/><br/><br/> | |||
===Anschluss an Arduino=== | ===Anschluss an Arduino=== | ||
[[Datei:Arduinoanschluss.jpg|mini|x250px|right|Abb. | [[Datei:Arduinoanschluss.jpg|mini|x250px|right|Abb. 14: Arduinoanschluss Schaltplan]] | ||
<div class="tright" style="clear:none">[[Datei:praktische Ausführung Arduinoanschluss.jpg|mini|ohne|x250px| | <div class="tright" style="clear:none">[[Datei:praktische Ausführung Arduinoanschluss.jpg|mini|ohne|x250px|left|Abb. 13: Sensor-Arduino-Verbindung]]</div> | ||
Der Sensor besitzt eine I²C Schnittstelle. Es gibt zwei Möglichkeiten die Kommunikation zwischen dem Sensor und dem Arduino herzustellen. Bei der ersten Möglichkeit kann man den I²C Bus aufschneiden und die einzelnen Kabel mit dem Arduino und den Widerständen verbinden. Da wir aber zerstörungsfrei arbeiten möchten, wird ein [http://www.mindsensors.com/ev3-and-nxt/58-breadboard-connector-kit-for-nxt-or-ev3|Breadboard 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. Zur Verbindung werden 4 Kabel und 2 Widerstände benötigt.<ref name = 'Arduino Praxiseinstieg'>Thomas Brühlmann: [https://books.google.de/books?id=M_hhCAAAQBAJ&pg=PT264&lpg=PT264&dq=adresse+0x4c&source=bl&ots=DXLfjXwt90&sig=4-vjdxewgakrCD6Y15_z65iy-7Y&hl=de&sa=X&ved=0ahUKEwj6gIPyifPaAhUnEJoKHUXSBCYQ6AEIKDAA#v=onepage&q=adresse%200x4c&f=false ''Arduino Praxiseinstieg.''] Kapitel 5.3 integrierte Temperatursensoren </ref> | |||
# Das blaue Kabel stellt die SDA-Leitung dar. Dafür wird das Kabel mit dem Port A4 des Arduinos verbunden. | |||
# Das gelbe Kabel stellt die SCL-Leitung dar. Dafür wird das Kabel mit dem Port A5 des Arduinos verbunden. | |||
# Das rote Kabel liefert die Spannung von 5 Volt und wird somit an die 5V des Arduinos angeschlossen. | |||
# Der I²C Bus besitzt zwei Grounds, die miteinander verbunden und über das schwarze Kabel an das GND des Arduinos angeschlossen werden. | |||
# 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.<br/><br/> | |||
===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. | |||
<br/><br/> | |||
<li>Die erste Möglichkeit besteht darin die Adresse auszulesen. Hilfreich dabei ist der Logic Analyzer. Mit dem Gerät wird die SDA- und SCL-Leitung angeklemmt und die Informationen des Sensors ausgelesen. Der Logic Analyser erkennt die Bitmuster und liefert unter anderem die Adresse des angesprochenen Sensors (siehe Abb. 15). | |||
[[Datei:SDASCLSignale.jpg|mini|x300px|left|Abb. 15: SDA-SCL-Signale - Logic Analyzer]]</li> | |||
<br/><br/><br/><br/><br/><br/><br/><br/><br/> | |||
<li> Hat man das Gerät nicht zur Verfügung, so muss recherchiert werden, ob sich jemand mit dem Sensor bereits auseinander gesetzt hat.</li><br/> | |||
<br/><br/> | Ist die Adresse vorhanden, wird der Arduino so programmiert (Programm befindet sich unten), dass dieser als Master von dem Sensor ständig Werte (Signale) anfordert. Da es sich um eine I²C Kommunikation handelt, wird die sogenannte Wire-Bibliothek benötigt. Die Informationen über die Temperatur werden jeweils in 2 Bytes versendet. Der erste Byte ist der wichtigste und wird MSB (Most Significant Byte) genannt. Darauf folgt der LSB (Least Significant Bit). Insgesamt sind es also 16 Bits die gesendet werden. Da der Sensor aber nur einen 12 Bit AD Wandler hat, werden nur 12 Bits verwertet. Aus diesem Grund wird Bit-Shiften verwendet. Durch das Bit-Schiften werden die beiden Bytes so angeordnet, dass der MSB vollständig vorhanden bleibt während der LSB durch den Bit-Shift halbiert wird (siehe Abb.16). Am Ende des Programms wird ein Dezimaler Wert ausgegeben, der in Matlab weiterverarbeitet werden soll.<br/><br/> | ||
[[Datei:MSBplusLSB.jpg|mini|x220px|right|Abb. 16: MSBplusLSB]] | |||
<div style="width:950px; height:300px; overflow:auto; border: 2px solid #088"> | |||
<div style="width: | |||
<source lang=c> | <source lang=c> | ||
Zeile 83: | Zeile 140: | ||
//Adresse des Sensors | //Adresse des Sensors | ||
#define ADDR 0x4C | #define ADDR 0x4C | ||
//Deklaration der Speichervariablen für die Temperatur | |||
byte msb; //erste Byte ist MSB (höherwertig) | byte msb; //erste Byte ist MSB (höherwertig) | ||
byte lsb; //zweiter Byte ist LSB (niederwertig) | byte lsb; //zweiter Byte ist LSB (niederwertig) | ||
int Rohwert; | int Rohwert; | ||
void setup() | void setup() | ||
{ | { | ||
Serial.begin(9600); | |||
Wire.begin(); | Wire.begin(); | ||
} | } | ||
void loop() | void loop() | ||
{ | { | ||
//Jetzt werden 2 Bytes vom Sensor angefordert. Zuerst kommt der MSB (hochwertige Byte) und dann der LSB (der niedrigwertige Byte). | |||
Wire.requestFrom(ADDR, 2); | Wire.requestFrom(ADDR, 2); | ||
if(Wire.available() >= 2) | if(Wire.available() >= 2) | ||
Zeile 102: | Zeile 159: | ||
msb = Wire.read(); //erste Byte ist MSB (höherwertig) | msb = Wire.read(); //erste Byte ist MSB (höherwertig) | ||
lsb = Wire.read(); //zweiter Byte ist LSB (niederwertig) | lsb = Wire.read(); //zweiter Byte ist LSB (niederwertig) | ||
/* Da der Sensor aber nur 12 Bits verarbeiten kann, muss mit Bitshifts gearbeitet werden, um die 16 Bits in 12 Bits umzuwandeln. | |||
* Der MSB muss dabei vollständig erhalten bleiben, während der LSB "gekürzt" werden kann. | |||
* Der MSB wird um 4 Stellen nach links geshiftet und der MSB um 4 Stellen nach rechts und wird dem MSB hinzugefügt. | |||
* Der Arduino liest aber nur die ersten 12 Bits, der Rest wird abgeschnitten. | |||
*/ | |||
Rohwert = ((msb)<<4); // | Rohwert = ((msb)<<4); //Der MSB wird um 4 Bits nach links verschoben. | ||
Rohwert |= (lsb>>4); // | Rohwert |= (lsb>>4); //Der LSB wird um 4 Bits nach rechts verschoben und zu dem MSB hinzuaddiert. | ||
Serial.println(Rohwert); | Serial.println(Rohwert); | ||
} | } | ||
delay( | delay(100); | ||
} | } | ||
</source> | |||
</div> | |||
<br/> | |||
===Weiterverarbeitung der Daten in Matlab=== | |||
Die vorverarbeiteten Daten, werden weiter an Matlab gesendet, dort mit der Auflösung von 0,0625 multipliziert und geplotet. Das Programm für Matlab befindet sich unten.<br/><br/> | |||
<div style="width:670px; height:300px; overflow:auto; border: 2px solid #088"> | |||
<source lang=c> | |||
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 | |||
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); | |||
</source> | </source> | ||
</div> | </div> | ||
<br/> | |||
==Messungen und Darstellung der Ergebnisse== | |||
In diesem Kapitel werden einige Messungen durchgeführt um zu testen, wie hoch die Genauigkeit des Sensors ist. Wie aus dem Matlabprogramm zu entnehmen ist, werden in den 100 Sekunden insgesamt 1000 Werte (also 10 Signale pro Sekunde) aufgenommen. Die Messversuche werden an Wasser durchgeführt, welches unterschiedlich temperiert wird. Die Messungen werden bei der Raumtemperatur von 23°C durchgeführt. | |||
===Trägheit=== | |||
[[Bild:TemperaturmessungTrägheit.jpg|thumb|900px|right|Abb. 16: Temperaturmessung-Trägheit]] | |||
Im Laufe mehrerer Messungen ist aufgefallen, dass der Sensor eine gewisse Zeit benötigt, um sich an die tatsächliche Temperatur, die durch ein Referenzmessgerät gemessen wurde, anzunähern (siehe Abb. 16). Diese Trägheit liegt wahrscheinlich mit der Länge des Fühlerrohrs zusammen und würde im weiteren Verlauf die Mittelwerte der Messreihen negativ beeinflussen. Aus diesem Grund wird der Temperatursensor bei weiteren Versuchen für einige Zeit in das Wasser gelegt, bevor die Messung gestartet wird, um präzisere Werte zu erhalten und bessere Mittelwerte zu ermitteln.. | |||
===Theorie zur Bestimmung der Messunsicherheit=== | |||
Es werden einige Parameter und Formeln benötigt, um die Messunsicherheit zu bestimmen.<br/><br/> | |||
'''Mittelwert:''' Der Mittelwert <math>{\bar {x}}</math> ist eine Schätzung des Erwartungswertes bei einem Stichumfang von n.<br/><br/> | |||
<math>\bar x=\frac{1}{n}\cdot\sum_{i=1}^n x_i</math><br/><br/> | |||
'''Standardabweichung:''' Die Standardabweichung gibt die Streubreite der Messwerte um dessen Mittelwert an.<br/><br/> | |||
<math>s = \sqrt{\frac{1}{n-1}\cdot\sum_{i=1}^n (x_i - \bar x)^2} </math><br/><br/> | |||
'''Vertrauensbereich für den Erwartungswert:''' Damit wird die Messunsicherheit bestimmt.<br/><br/> | |||
<math>u_A = \bar x \pm \frac{t(n-1)}{\sqrt n}\cdot s </math> | |||
===Ergebnisse der Messungen=== | |||
{| class="wikitable" | |||
! style="font-weight:bold;" | Messreihe | |||
! style="font-weight:bold;" | "Wahrer Wert" | |||
! colspan="6" style="font-weight:bold;" | jeweils 1000 Messungen | |||
|- | |||
| style="font-weight:bold;" | Nr. | |||
| style="font-weight:bold;" | Referenzwert in °C | |||
| style="font-weight:bold;" | Min in °C | |||
| style="font-weight:bold;" | Max in °C | |||
| style="font-weight:bold;" | Mittelwert | |||
| style="font-weight:bold;" | Standardabweichung <math>s_i</math> | |||
| style="font-weight:bold;" | Messunsicherheit | |||
| style="font-weight:bold;" | Vertrauensbereich | |||
|- | |||
| 1) | |||
| 2 | |||
| 1,5 | |||
| 2,5 | |||
| 1,86 | |||
| 0,2388 | |||
| 0,0148 | |||
| 1,86 ± 0,0148 | |||
|- | |||
| 2) | |||
| 12 | |||
| 12 | |||
| 12,5 | |||
| 12,39 | |||
| 0,2047 | |||
| 0,0127 | |||
| 12,39 ± 0,0127 | |||
|- | |||
| 3) | |||
| 21 | |||
| 22,5 | |||
| 22,5 | |||
| 22,5 | |||
| 0 | |||
| 0 | |||
| 22,5 ± 0 | |||
|- | |||
| 4) | |||
| 27 | |||
| 28 | |||
| 27 | |||
| 27,3 | |||
| 0,34 | |||
| 0,0211 | |||
| 27,3 ± 0,0211 | |||
|- | |||
| 5) | |||
| 41 | |||
| 41 | |||
| 42 | |||
| 41,6 | |||
| 0,2567 | |||
| 0,0159 | |||
| 41,6 ± 0,0159 | |||
|- | |||
| 6) | |||
| 57,5 | |||
| 57 | |||
| 58,5 | |||
| 57,685 | |||
| 0,49 | |||
| 0,0304 | |||
| 57,685 ± 0,0304 | |||
|- | |||
| 7) | |||
| 67 | |||
| 66 | |||
| 68 | |||
| 67,03 | |||
| 0,52 | |||
| 0,0322 | |||
| 67,03 ± 0,0322 | |||
|} | |||
===Auswertung der Ergebnisse=== | |||
Wie bereits erwähnt, ist der Temperatursensor träge, weswegen dieser als erstes in das zu messende Element gelegt und erst nach einer gewissen Zeit gestartet wurde. Auf diese Weise wurden sieben Messreihen durchgeführt. Insgesamt lässt sich sagen, dass die Temperaturwerte der tausend Messungen (pro Messreihe) um bis zu 1,5 °C von dem Referenzwert abgewichen sind, wobei da angenommen wurde, dass die jeweilige Referenztemperatur dem wahren Wert entspricht. Somit ist die Nutzung des Sensors nicht für schnelle und hochpräzise Messungen zu empfehlen. Schaut man sich die Messunsicherheit an, so ist festzustellen, dass sich diese auf die zweite Nachkommastelle auswirkt und somit fast vernachlässigbar ist. Mit dem Hintergrund das dieser Sensor für Lernzwecke und nicht für hochpräzise Temperaturmessung hergestellt worden ist, ist die Präzision der Messungen völlig ausreichend. | |||
=YouTubeVideo= | |||
Das Video ist unter dem folgenden Link zu finden: | |||
= | [https://www.youtube.com/watch?v=2INj0Ovme6A LEGO® MINDSTORMS® Temperatursensor (Artikel 9749) mit Matlab/Simulink] | ||
= Quellenverweise = | |||
<references /> | |||
→ zurück zum Hauptartikel: [[SigSys_SoSe2018| Signalverarbeitende Systeme]] | → zurück zum Hauptartikel: [[SigSys_SoSe2018| Signalverarbeitende Systeme]] |
Aktuelle Version vom 6. Juli 2018, 19:28 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
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.
[1]
[2]
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.
[3]
Signalverarbeitung
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. Über die Diode ist nichts genaueres bekannt. Daraus resultiert ein 12-Bit Code, den es zu interpretieren gilt. Mit Hilfe der Tabelle aus dem Datenblatt des TMP275 Sensors, die sich unter dem Text befindet, wird eine Kennlinie erzeugt (siehe Abb.4), bei der jedem Signal eine bestimmte Temperatur zugeordnet wird. [4]
Wird nun das jeweilige Signal des Sensors durch die dazugehörige Temperatur geteilt, so erhält man die Temperaturauflösung von 0,0625°C, was laut dem Datenblatt der typischen Auflösung entspricht. Durch die erhaltene Temperaturauflösung wird deutlich, dass 1°C in Abstufungen dargestellt werden kann. In Kombination mit dem Messbereich des TMP275 welches bei -40°C bis 125°C liegt und in Summe einen Bereich von 165 Temperaturwerten abdeckt, lässt sich festhalten, dass man einen AD-Wandler benötigt, welcher Zustände darstellen kann. Somit ist es plausibel einen 12-Bit A/D Wandler zu nutzen, da dieser auf Zustände kommt, während ein 11-Bit A/D Wandler nur Zustände darstellen kann, was nicht ausreichend ist.
|
A/D-Umwandler:
Der A/D-Umwandler hat die Aufgabe, analoge (kontinuierliche) Werte aus dem unendlichen Wertebereich in einen endlichen (diskreten) Wertebereich abzubilden. Dies bedeutet, dass die kontinuierlichen Signale in bestimmten Zeitabständen abgetastet werden und in dem Augenblick, je nach Auflösung des ADUs, in einen wertediskreten Wert umwandelt. Somit kommt ein zeit- und wertediskretes Signal heraus. Um ein kontinuierliches Signal korrekt zu rekonstruieren, muss das Signal nach dem Shannonsche Abtasttheorem mit einer mindestens doppelt so hohen Frequenz abgetastet werden, als die Frenquenz des Signals ist.[5]
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). Dabei ist der Delta-Sigma-Modulator der Kern des ADC und ist verantwortlich für die Digitalisierung des analogen Eingangssignals bei gleichzeitiger Reduzierung des Rauschens durch Techniken wie Oversampling, Noise Shaping und Digitalfilter. [6] 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. Genauer gesagt, arbeitet der Wandler nur mit einem Bit welches die Werte 0 und 1 annehmen kann. Bei dieser Art der A/D Wandlung werden lediglich die Pegelunterschiede von einem Abtastwert zum nächsten gekennzeichnet (siehe Abb.7).
Digital Filter (Integrator):
- Der Integrator integriert diesen einzelnen Bitstrom zu einem Mehrbitwert, der einen Durchschnittswert des Signals darstellt, jedoch mit vielen zusätzlichen Informationen.
Decimator:
- Schließlich entfernt der Decimator die zusätzlichen unnötigen Informationen, was zu einer Ausgabe führt, die genau ist, aber der korrekten minimalen Größe entspricht.
Bei der Umwandlung des analogen Signals in ein digitales, wird die Signalkurve in diskrete Werte unterteilt. Dies bedeutet, der Wandler entscheidet in den Situationen, in welchen diskreten Wert er das analoge Signal wandelt. Einfacher gesagt, das Signal wird je nach Auflösung auf- bzw. abgerundet. Dieser Unterschied zwischen dem analogen und konvertierten Signal wird als "Quantisierungsfehler" oder "digitales Rauschen" bezeichnet. Um das Rauschen zu reduzieren, werden die oben genannten Techniken kurz erläutert.[7]
Oversampling:
Laut dem Abtasttheorem muss die Frequenz mit einer (mind.) doppelten Abtastrate abgetastet werden. Es gibt einige Möglichkeiten ein Signal abzutasten. Von Oversampling ist dann die Rede, wenn die Signale mit einer höheren Abtastrate abgetastet werden, als für die Darstellung der Bandbreite nötig wird. Dadurch wird das Quantisierungsrauschen minimiert, bleibt jedoch vorhanden.[8] [6]
Noise Shaping:
Das durch die Quantisierung entstandene Rauschen wird durch das Noise Shaping verringert. Dabei wird die Rauschenergie aus dem Audiobereich in einen höheren Frequenzbereich verschoben. Dadurch gehen diese Signale nicht in die Signalverarbeitung mit ein.[7]
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. [10][11][12]
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".[10][13][12]
Adressierung und Read/Write (R/W)
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.[14][13][12]
Aknowledge (ACK) und Not Aknowledge (NACK)
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.[10] Es gibt 5 Bedingungen die zu einem NACK führen:
- Auf dem Bus ist kein Empfänger mit der übertragenen Adresse vorhanden, so dass kein Gerät mit einer Bestätigung antworten kann.
- 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.
- Während der Übertragung erhält der Empfänger Daten oder Befehle, die er nicht versteht.
- Während der Übertragung kann der Empfänger keine weiteren Datenbytes mehr empfangen.
- Ein Master-Empfänger muss das Ende der Übertragung an den Slave-Sender signalisieren.[13][12]
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.[10][13][12]
Herstellung der Kommunikation
In diesem Projekt wird der Temperatursensor zunächst durch einen Arduino angesteuert und ausgelesen. Im weiteren Schritt werden die Daten über eine serielle Schnittstelle an Matlab gesendet und dort weiter verarbeitet.
Anschluss an Arduino
Der Sensor besitzt eine I²C Schnittstelle. Es gibt zwei Möglichkeiten die Kommunikation zwischen dem Sensor und dem Arduino herzustellen. Bei der ersten Möglichkeit kann man den I²C Bus aufschneiden und die einzelnen Kabel mit dem Arduino und den Widerständen verbinden. Da wir aber zerstörungsfrei arbeiten möchten, 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. Zur Verbindung werden 4 Kabel und 2 Widerstände benötigt.[3]
- Das blaue Kabel stellt die SDA-Leitung dar. Dafür wird das Kabel mit dem Port A4 des Arduinos verbunden.
- Das gelbe Kabel stellt die SCL-Leitung dar. Dafür wird das Kabel mit dem Port A5 des Arduinos verbunden.
- Das rote Kabel liefert die Spannung von 5 Volt und wird somit an die 5V des Arduinos angeschlossen.
- Der I²C Bus besitzt zwei Grounds, die miteinander verbunden und über das schwarze Kabel an das GND des Arduinos angeschlossen werden.
- 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.
Ist die Adresse vorhanden, wird der Arduino so programmiert (Programm befindet sich unten), dass dieser als Master von dem Sensor ständig Werte (Signale) anfordert. Da es sich um eine I²C Kommunikation handelt, wird die sogenannte Wire-Bibliothek benötigt. Die Informationen über die Temperatur werden jeweils in 2 Bytes versendet. Der erste Byte ist der wichtigste und wird MSB (Most Significant Byte) genannt. Darauf folgt der LSB (Least Significant Bit). Insgesamt sind es also 16 Bits die gesendet werden. Da der Sensor aber nur einen 12 Bit AD Wandler hat, werden nur 12 Bits verwertet. Aus diesem Grund wird Bit-Shiften verwendet. Durch das Bit-Schiften werden die beiden Bytes so angeordnet, dass der MSB vollständig vorhanden bleibt während der LSB durch den Bit-Shift halbiert wird (siehe Abb.16). Am Ende des Programms wird ein Dezimaler Wert ausgegeben, der in Matlab weiterverarbeitet werden soll.
//Bibliothek für die I²C Kommunikation
#include <Wire.h>
//Adresse des Sensors
#define ADDR 0x4C
//Deklaration der Speichervariablen für die Temperatur
byte msb; //erste Byte ist MSB (höherwertig)
byte lsb; //zweiter Byte ist LSB (niederwertig)
int Rohwert;
void setup()
{
Serial.begin(9600);
Wire.begin();
}
void loop()
{
//Jetzt werden 2 Bytes vom Sensor angefordert. Zuerst kommt der MSB (hochwertige Byte) und dann der LSB (der niedrigwertige Byte).
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)
/* Da der Sensor aber nur 12 Bits verarbeiten kann, muss mit Bitshifts gearbeitet werden, um die 16 Bits in 12 Bits umzuwandeln.
* Der MSB muss dabei vollständig erhalten bleiben, während der LSB "gekürzt" werden kann.
* Der MSB wird um 4 Stellen nach links geshiftet und der MSB um 4 Stellen nach rechts und wird dem MSB hinzugefügt.
* Der Arduino liest aber nur die ersten 12 Bits, der Rest wird abgeschnitten.
*/
Rohwert = ((msb)<<4); //Der MSB wird um 4 Bits nach links verschoben.
Rohwert |= (lsb>>4); //Der LSB wird um 4 Bits nach rechts verschoben und zu dem MSB hinzuaddiert.
Serial.println(Rohwert);
}
delay(100);
}
Weiterverarbeitung der Daten in Matlab
Die vorverarbeiteten Daten, werden weiter an Matlab gesendet, dort mit der Auflösung von 0,0625 multipliziert und geplotet. Das Programm für Matlab befindet sich unten.
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
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);
Messungen und Darstellung der Ergebnisse
In diesem Kapitel werden einige Messungen durchgeführt um zu testen, wie hoch die Genauigkeit des Sensors ist. Wie aus dem Matlabprogramm zu entnehmen ist, werden in den 100 Sekunden insgesamt 1000 Werte (also 10 Signale pro Sekunde) aufgenommen. Die Messversuche werden an Wasser durchgeführt, welches unterschiedlich temperiert wird. Die Messungen werden bei der Raumtemperatur von 23°C durchgeführt.
Trägheit
Im Laufe mehrerer Messungen ist aufgefallen, dass der Sensor eine gewisse Zeit benötigt, um sich an die tatsächliche Temperatur, die durch ein Referenzmessgerät gemessen wurde, anzunähern (siehe Abb. 16). Diese Trägheit liegt wahrscheinlich mit der Länge des Fühlerrohrs zusammen und würde im weiteren Verlauf die Mittelwerte der Messreihen negativ beeinflussen. Aus diesem Grund wird der Temperatursensor bei weiteren Versuchen für einige Zeit in das Wasser gelegt, bevor die Messung gestartet wird, um präzisere Werte zu erhalten und bessere Mittelwerte zu ermitteln..
Theorie zur Bestimmung der Messunsicherheit
Es werden einige Parameter und Formeln benötigt, um die Messunsicherheit zu bestimmen.
Mittelwert: Der Mittelwert ist eine Schätzung des Erwartungswertes bei einem Stichumfang von n.
Standardabweichung: Die Standardabweichung gibt die Streubreite der Messwerte um dessen Mittelwert an.
Vertrauensbereich für den Erwartungswert: Damit wird die Messunsicherheit bestimmt.
Ergebnisse der Messungen
Messreihe | "Wahrer Wert" | jeweils 1000 Messungen | |||||
---|---|---|---|---|---|---|---|
Nr. | Referenzwert in °C | Min in °C | Max in °C | Mittelwert | Standardabweichung | Messunsicherheit | Vertrauensbereich |
1) | 2 | 1,5 | 2,5 | 1,86 | 0,2388 | 0,0148 | 1,86 ± 0,0148 |
2) | 12 | 12 | 12,5 | 12,39 | 0,2047 | 0,0127 | 12,39 ± 0,0127 |
3) | 21 | 22,5 | 22,5 | 22,5 | 0 | 0 | 22,5 ± 0 |
4) | 27 | 28 | 27 | 27,3 | 0,34 | 0,0211 | 27,3 ± 0,0211 |
5) | 41 | 41 | 42 | 41,6 | 0,2567 | 0,0159 | 41,6 ± 0,0159 |
6) | 57,5 | 57 | 58,5 | 57,685 | 0,49 | 0,0304 | 57,685 ± 0,0304 |
7) | 67 | 66 | 68 | 67,03 | 0,52 | 0,0322 | 67,03 ± 0,0322 |
Auswertung der Ergebnisse
Wie bereits erwähnt, ist der Temperatursensor träge, weswegen dieser als erstes in das zu messende Element gelegt und erst nach einer gewissen Zeit gestartet wurde. Auf diese Weise wurden sieben Messreihen durchgeführt. Insgesamt lässt sich sagen, dass die Temperaturwerte der tausend Messungen (pro Messreihe) um bis zu 1,5 °C von dem Referenzwert abgewichen sind, wobei da angenommen wurde, dass die jeweilige Referenztemperatur dem wahren Wert entspricht. Somit ist die Nutzung des Sensors nicht für schnelle und hochpräzise Messungen zu empfehlen. Schaut man sich die Messunsicherheit an, so ist festzustellen, dass sich diese auf die zweite Nachkommastelle auswirkt und somit fast vernachlässigbar ist. Mit dem Hintergrund das dieser Sensor für Lernzwecke und nicht für hochpräzise Temperaturmessung hergestellt worden ist, ist die Präzision der Messungen völlig ausreichend.
YouTubeVideo
Das Video ist unter dem folgenden Link zu finden:
LEGO® MINDSTORMS® Temperatursensor (Artikel 9749) mit Matlab/Simulink
Quellenverweise
- ↑ 1,0 1,1 MINDSTORMS Temperature Sensor. Abgerufen am 20. Juni 2018. Referenzfehler: Ungültiges
<ref>
-Tag. Der Name „Temperatursensor“ wurde mehrere Male mit einem unterschiedlichen Inhalt definiert. - ↑ Temperatursensor. Abgerufen am 20. Juni 2018.
- ↑ 3,0 3,1 Thomas Brühlmann: Arduino Praxiseinstieg. Kapitel 5.3 integrierte Temperatursensoren
- ↑ 4,0 4,1 TMP275 ±0.5°C Temperature Sensor With I²C and SMBus Interface in Industry Standard LM75 Form Factor and Pinout. Abgerufen am 20. Juni 2018.
- ↑ Prof.Dr.-Ing. Schneider, Ulrich: Analog-Digital-Umsetzer (ADU), Fach: Signalverarbeitende Systeme, Vorlesung Nr. 6. Abgerufen am 30 Juni 2018.
- ↑ 6,0 6,1 HiFi-Lexikon: Oversampling. Abgerufen am 20. Juni 2018.
- ↑ 7,0 7,1 Henner Wöhler: Noise Shaping Abgerufen am 20. Juni 2018. Referenzfehler: Ungültiges
<ref>
-Tag. Der Name „NoiseShaping“ wurde mehrere Male mit einem unterschiedlichen Inhalt definiert. - ↑ Oversampling. Abgerufen am 20. Juni 2018.
- ↑ 9,0 9,1 9,2 [DELTA SIGMA ADC’S. Abgerufen am 20. Juni 2018. Referenzfehler: Ungültiges
<ref>
-Tag. Der Name „DELTASIGMAADC“ wurde mehrere Male mit einem unterschiedlichen Inhalt definiert. - ↑ 10,0 10,1 10,2 10,3 10,4 10,5 10,6 10,7 I²C Bus. Abgerufen am 20. Juni 2018.
- ↑ I²C. Abgerufen am 20. Juni 2018.
- ↑ 12,0 12,1 12,2 12,3 12,4 I2C-bus specification and user manual. Abgerufen am 20. Juni 2018.
- ↑ 13,0 13,1 13,2 13,3 I²C. Abgerufen am 20. Juni 2018.
- ↑ Transmitting a Byte to a Slave Device. Abgerufen am 20. Juni 2018.
→ zurück zum Hauptartikel: Signalverarbeitende Systeme