DHT22 / AM2302 Sensor Timing

Gast #4398139
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 :-)
Angehängte Dateien:
Persönliche Seite #4398227
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.
Persönliche Seite #4399371
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.
Gast #4399391
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.
Persönliche Seite #4399432
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?
Gast #4400535
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.
Angehängte Dateien:
Persönliche Seite #4400572
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.
#4400639
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.
Gast #4400697
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.
Persönliche Seite #4400722
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)
#4400746
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)
#4401124
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
#4926234
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren