Forum: Mikrocontroller und Digitale Elektronik DHT22 / AM2302 Sensor Timing


von Joe (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

da ich keinen richtigen Treiber für den DHT22 gefunden habe, wollte ich 
selbst einen schreiben. Ich werde diesen auch später zu Show stellen, da 
ich so was noch nie gemacht habe und gerne Kritik sammeln möchte.

Ich Taste das Signal des Sensors in einem Interrupt ab und werte es aus. 
Im Datenblatt 
(http://www.akizukidenshi.com/download/ds/aosong/AM2302.pdf) gibt es 
einen Timing Table (Seite 6, bzw. 7). Diese Zeiten habe ich alle im Code 
überprüft. D.h. dauert irgendwas zu lange oder zu kurz -> Fehler.

Jetzt habe ich mal einen LA drangehängt und mir die Bits angeschaut. 
Leider sind die teilweise nicht innerhalb der Spec. Der Lowpegel muss 
laut Tabelle 48 und 55 µs betragen. Wie man am angehängten Screenshot 
sehen kann ist das öfters nicht der Fall. Irgnoriert man dies, kommt ein 
plausibles Ergebnis raus (20,8 Grad und 55% Feuchte).

Ist der Sensor defekt, oder nimmt der Hersteller es nicht so genau mit 
dem Timing. Oder funktioniert der LA nicht zuverlässig? Abtastrate waren 
4 Mhz also mehr als ausreichend.

Ich freue mich auf eine Diskussion.
.... und gehe mal Lüften :-)

von Atmega8 A. (atmega8) Benutzerseite


Lesenswert?

http://davidegironi.blogspot.de/2013/02/reading-temperature-and-humidity-on-avr.html

Die längeren _delay_ms()-Funktionen kannst du durch einen 
Interrupt-gesteuerten Timer erzeugen, bei den kürzeren kannst du aktiv 
warten.

Den 4,7k Widerstand von Vcc zum Datenpin braucht man nicht, der ist 
schon in dem DHT22 integriert.

Du startest die Routine aber eh nur höchstens alle 2 Sekunden, daher ist 
der Performance-Verlust nur extrem gering.

: Bearbeitet durch User
von Joe (Gast)


Lesenswert?

Moin

Danke für die Antwort. Beantwortet nicht so ganz die Frage :-)
Vielleicht weiß noch einer was ...

von Atmega8 A. (atmega8) Benutzerseite


Lesenswert?

Joe schrieb:
> Ist der Sensor defekt, oder nimmt der Hersteller es nicht so genau mit
> dem Timing. Oder funktioniert der LA nicht zuverlässig?

Da ist ja ein PullUp-Widerstand von 4.7kOhm von der Datenleitung nach 
+3.3V im DHT22 verbaut, also bekommst du da keine so zackigen kurven, 
sondern eher so eine e-Funktion die man beim aufladen eines Kondensators 
sieht.

Erkennt dein LA bei >2.5V (5V/2) ein high oder bei >1,65V (3.3V/2) ?

Das kann dann schon zu einer gewissen Zeitabweichung führen.

: Bearbeitet durch User
von Joe (Gast)


Lesenswert?

Moin,

das ist ne Standard Open Drain Schaltung, so e-Funktionsmäßig kann es 
nicht aussehen. In der Spec stehen 55µs, gemessen habe ich knapp 65µs. 
Wenn es solche Lade und Entladekurven gäbe, dann gute Nacht.
Außerdem müsste es dann trotzdem bei jedem Päuschen gleich sein. Ist es 
aber nicht.

Atmega8 A. schrieb:
> Erkennt dein LA bei >2.5V (5V/2) ein high oder bei >1,65V (3.3V/2) ?

Ja aber keine 10µs. Könnte die Zeiten mal mit dem Atmega ausmessen. Die 
Pegel ab wann ein high erkannt wird kenne ich nicht, da es ein Ab und 
Einschalten gibt, sollten die sich aber kompensieren.

von Alex D. (allu)


Angehängte Dateien:

Lesenswert?

Zum Timing, den AM2302 lese ich mit einem Bascom-Assembler-Programm aus. 
Der Assembler-Teil erzeugt das Timing zur Datenübernahme. Vielleicht 
kannst Du was davon verwenden.

Gruß  Alex

von Atmega8 A. (atmega8) Benutzerseite


Lesenswert?

Joe schrieb:
> Wenn es solche Lade und Entladekurven gäbe, dann gute Nacht.

Da müssen doch nur ein paar nF als Last dranhängen.
Mit 10nF als Last würde sich die Zeit bis zum aufladen auf 1/2 der 
Spannung um 55µs verlängern.

Joe schrieb:
> da es ein Ab und
> Einschalten gibt, sollten die sich aber kompensieren.

Das auf Low ziehen passiert mit einem Transistor, also passiert das 
quasi ohne Zeitverzögerung, aber auf High geht es nur langsam über den 
4.7k Widerstand.

Theoretisch müsste der Pegel zu spät auf High sein, also ist die 
eigentliche High-Zeit noch länger als ermittelt.

Joe schrieb:
> Der Lowpegel muss
> laut Tabelle 48 und 55 µs betragen.

Gibt es bei dir eine recht hohe Pin-Kapazität um die 1 oder 2nF auf dem 
Board?

von Joe (Gast)


Angehängte Dateien:

Lesenswert?

Atmega8 A. schrieb:
> Das auf Low ziehen passiert mit einem Transistor, also passiert das
> quasi ohne Zeitverzögerung, aber auf High geht es nur langsam über den
> 4.7k Widerstand.
>
> Theoretisch müsste der Pegel zu spät auf High sein, also ist die
> eigentliche High-Zeit noch länger als ermittelt.

Trotzdem ist es doch jedes mal gleich, also müsste das Timing doch immer 
zu lang sein, wenn man davon ausgeht, dass es gleichmäßig ist. Du hast 
aber recht kompensieren tut es sich wohl nicht.


Die Pinkapazität vom Atmega ist mit 10 pF angeben. Ich habe gerade noch 
einen 1kOhm parallelgeschaltet. Das Timing wird dadurch noch schlechter, 
obwohl es sich ja um ein ca. einen Fakter 5 verbessern müsste. Siehe 
Bild...

Vielleicht mach der LA Logic Analyser doch mucken ... leider ist es 
immer noch komisch.

Noch mal .. es geht erstmal nicht draum das Teil zu programmieren, 
sondern dass er laut dem LA das Timing nicht einhält, was im Datenblatt 
angegeben.

von Atmega8 A. (atmega8) Benutzerseite


Lesenswert?

Joe schrieb:
> Noch mal .. es geht erstmal nicht draum das Teil zu programmieren,
> sondern dass er laut dem LA das Timing nicht einhält, was im Datenblatt
> angegeben.

Ich hatte mal einen DHT22 geöffnet, da ist ein kleiner Controller drauf, 
ein NTC, der Feuchtesensor und eben auch der 4,7k Ohm PullUp Widerstand 
sitzt auch mit auf der Platine, so dass man keinen separaten Widerstand 
nutzen muss.

Der interne Resonator im Controller wird bestimmt nicht so 100%-ig genau 
sein, so dass sich die Timings etwas ändern können.

von Alex D. (allu)


Lesenswert?

> Noch mal .. es geht erstmal nicht draum das Teil zu programmieren,
> sondern dass er laut dem LA das Timing nicht einhält, was im Datenblatt
> angegeben.

Mein Am2302 verhält sich auch so. Ich habe gerade mal mit einem DSO 
nachgemessen (Auflösung 2µsec). Die "Normale Pause" ist 54µsec lang, 
jede achte ist aber breiter und 68µsec lang.
Da die Information in den Log.1-Breiten enthalten ist, ist das 
Fehlverhalten m.E. tolerierbar. Die gemessenen Werte stimmen jedenfalls 
gut in Temperatur und Feuchte mit einem Fertiggerät überein.

: Bearbeitet durch User
von Joe (Gast)


Lesenswert?

Okay. Vielen Dank. Hast du mal einen Screenshot von deinem DSO?
Würde mich mal interessieren, ob man wirklich Lade- und Endladekurven 
sieht. Glaube nicht, dass da Kapazitäten im nF Bereich rumschwirren.

Tolerieren ist so eine Sache. Durch die Fehlerauswertung, des 
Algorithmuses zeigt er keine Werte an. Dafür ist ein Datenblatt ja da. 
Vielleicht sehe ich das zu professionell. Ist halt doch kein Sensor der 
wirtschaftlich eingesetzt wird.

Atmega8 A. schrieb:
> Der interne Resonator im Controller wird bestimmt nicht so 100%-ig genau
> sein, so dass sich die Timings etwas ändern können.

Für nicht 100% genau gibt es ja die angegebenen Toleranzen von ... bis 
...
So ist das Datenblatt falsch, oder der Sensor defekt. Vielen Dank auf 
jeden Fall.

von Joe (Gast)


Lesenswert?

Alex D. schrieb:
> Die "Normale Pause" ist 54µsec lang,
> jede achte ist aber breiter und 68µsec lang

Das ist immer zwischen einem achter Block. Ist mir gar nicht 
aufgefallen. Danke!

von Atmega8 A. (atmega8) Benutzerseite


Lesenswert?

Joe schrieb:
> Das ist immer zwischen einem achter Block.

Dann wird der Controller wohl diese Zeit benötigen um jeweils ein neues 
Byte aus dem Speicher zu holen und dann wurde einfach die entsprechende 
Zeit gewartet, daher summiert sich das dann auch.

Wenn man den µC im DHT22 umprogrammieren könnte und ihn nach dem Holen 
eines weiter Bytes nicht 55µs warten lässt, sondern die ca. 10µs die er 
braucht um das Byte zu holen subtrahiert, dann würde man auch dort 
wieder auf die 55µs kommen.

Der Controller wird wahrscheinlich relativ langsam laufen.

Wer schreibt den netten Herren Liu wegen der Programmänderung jetzt an?
(Email: thomasliu198518@yahoo.com.cn)

von Johannes D. (balou)


Lesenswert?

Atmega8 A. schrieb:
> Dann wird der Controller wohl diese Zeit benötigen um jeweils ein neues
> Byte aus dem Speicher zu holen und dann wurde einfach die entsprechende
> Zeit gewartet, daher summiert sich das dann auch.
>
> Wenn man den µC im DHT22 umprogrammieren könnte und ihn nach dem Holen
> eines weiter Bytes nicht 55µs warten lässt, sondern die ca. 10µs die er
> braucht um das Byte zu holen subtrahiert, dann würde man auch dort
> wieder auf die 55µs kommen.
>
> Der Controller wird wahrscheinlich relativ langsam laufen.
>
> Wer schreibt den netten Herren Liu wegen der Programmänderung jetzt an?
> (Email: thomasliu198518@yahoo.com.cn)

Ist ja auch okay, wenn er länger brauch... Muss halt nur im Datenblatt 
stehen :-)
Ich hatte vorher schon mal eine E-Mail weggeschickt, aber auf die von 
der Website angegebene Adresse. Mal sehn ob was zurück kommt.

Mail:sales@eypump.com
Mail:sales@aosong.com

http://www.aosong.com/en/home/index.asp

Die Website ist nur soooooooooooooooooooooo langsam ...

Vielleicht hätte ich sie dahin schicken sollen :-D
Complaint center: complain@aosong.com ( zu spät gesehn)

von Alex D. (allu)


Lesenswert?

Joe schrieb:
> Tolerieren ist so eine Sache. Durch die Fehlerauswertung, des
> Algorithmuses zeigt er keine Werte an.

Kommt auf den Algorithmus an. Natürlich ist es nicht schön, wenn sich 
ein Bauelement nicht gemäß Datenblatt verhält.

Wenn man nur die Längen der Einsen auswertet ,stimmen Daten und 
Prüfsumme. Mit einem Timeout, der etwas länger als die längste Bitzelle 
ist, jedes Bit überwachen. Damit ist sichergestellt, dass die 
Pausenzeiten etwas länger aber nicht zu lang werden dürfen und das 
Ausleseprogramm nicht hängenbleiben kann.

Frohe Weihnachten

von Kalle (Gast)


Lesenswert?

Hallo,
ich nutze erstmal dieses Beispiel um den Sensor zu verstehen
http://davidegironi.blogspot.de/2013/02/reading-te...

Was ich aber nicht ganz verstehe, wenn ich Temperaturen unter Null grad 
messen will wie wird denn das Minuszeichen ausgegeben das sehe ich 
nirgengwo.
Mfg

von Mike J. (linuxmint_user)


Lesenswert?

Kalle schrieb:
> Temperaturen unter Null grad ...

Ich mache es so:
1
if(rawTemperature & 0x8000)  // Temperatur unter 0°C ?
2
{
3
  rawTemperature &= 0x7FFF; // Remove signal bit
4
  data->temperature_negativ = 1;
5
  data->temperature_integral = (int8_t)(rawTemperature / 10);
6
  data->temperature_decimal = (uint8_t)(rawTemperature % 10);
7
 }
8
else
9
{
10
  data->temperature_negativ = 0;
11
  data->temperature_integral = (int8_t)(rawTemperature / 10);
12
  data->temperature_decimal = (uint8_t)(rawTemperature % 10);
13
}

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Das Bit 15 der Temperatur-Bytes (also oberste Bit von Byte 3) zeigt an, 
ob die Temperatur negativ ist.

Byte 1 und 2 sind die Feuchte, 3 und 4 die Temperatur, 5 die Prüfsumme 
(1+2+3+4==5)

Hab diese Info auch nur aus meinem Code, das zugrunde liegende PDF 
versteckt sich noch :/

MfG

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.