Forum: Mikrocontroller und Digitale Elektronik Open drain/collector zieht nicht auf GND (DHT11)


von Larch (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich versuche einen DHT11 an einem STM32F070CB zu betreiben. Im Moment 
benutze ich den internen Pull-UP des STM, obwohl das Datenblatt einen 5k 
Vorschlägt.

Die Versorgungsspannung ist 3,23V.
Datenblatt zum DHT11 (China angaben, also nicht wirklich nützlich...): 
https://akizukidenshi.com/download/ds/aosong/DHT11.pdf

Im Anhang ist das Oszilloskop Bild des Ausgangs. Aus diesem wird 
ersichtlich, dass der STM das Signal auf GND zieht und die Leitung dann 
frei gibt. Dann Antwortet der DHT11 wie im Datenblatt angegeben mit 
einem Pull Down. Diese wird aber immer Schwächer biss der LOW-Pegel nur 
mehr 2,46V beträgt.

Was könnte die Ursache für den steigenden LOW-Pegel sein?
Der Sensor Antwortet korrekt, die Daten, von Hand ausgewertet, ergeben 
Sinn und verändern sich wenn ich die Umgebungsbedingungen ändere.

GND Verbindungen sind überprüft...
Kann es sein dass meine Versorgungsspannung zu gering ist und dadurch 
der Ausgangstransistor nicht voll durch steuern kann?
Einen zusätzlichen Pull-Up von 5k einzufügen würde das Ergebnis doch 
verschlechtern, da der Strom größer würde...

vielen Dank für die Hilfe

von Andreas B. (bitverdreher)


Lesenswert?

1. Das Datenblatt wird schon stimmen. Da es sich um einen chinesischen 
Hersteller handelt, kanst Du froh sein, daß es eine so gute englische 
Übersetzung gibt.
2. Ich wette, daß der STM immer noch auf H liegt und der DHT gegen den 
Ausgang des STM arbeiten muß.

von Jens G. (jensig)


Lesenswert?

>2. Ich wette, daß der STM immer noch auf H liegt und der DHT gegen den
>Ausgang des STM arbeiten muß.

Denke ich auch. Mache doch mal einen Serien-R (1k oder so) zw. beiden 
IC's rein, und prüfe dann, wie die Spannungen auf beiden Seiten ist. 
Dann sollte man ja sehen, ob der STM noch auf H zieht.

von Larch (Gast)


Lesenswert?

Vielen Dank für die schnelle Antwort.

Zu deiner Vermutung:
Ich benutze diesen Code:
1
  HAL_GPIO_WritePin(DHT11_DATA_GPIO_Port, DHT11_DATA_Pin, 0);
2
3
  HAL_Delay(20);
4
  GPIO_InitTypeDef ty;
5
6
  ty.Pin  = DHT11_DATA_Pin;
7
  ty.Mode = LL_GPIO_MODE_INPUT;
8
  ty.Pull = LL_GPIO_PULL_UP;
9
  HAL_GPIO_Init(DHT11_DATA_GPIO_Port, &ty);
10
11
  uint16_t timeout = 80;
12
  uint32_t start = LL_TIM_GetCounter(TIM1);
13
14
  while(LL_TIM_GetCounter(TIM1) - start < 40 );  // Delay for pull up
15
16
  timeout = 100; // 80us nominal low
17
  while(DHT11_DATA_GPIO_Port->IDR & DHT11_DATA_Pin == 0)
18
  {
19
    if(LL_TIM_GetCounter(TIM1) - start > timeout) return -1;
20
  }
21
  timeout = 100; // 80us nominal high
22
  while(DHT11_DATA_GPIO_Port->IDR & DHT11_DATA_Pin == 1)
23
  {
24
    if(LL_TIM_GetCounter(TIM1) - start > timeout) return -1;
25
  }

Der STM Pin wird als Eingang um konfiguriert und der Pull Up 
eingeschaltet.
Im Oszi bild ist zu erkennen wie die Spannung langsam hoch geht, nachdem 
der Pin um konfiguriert wird. Die folgende Antwort des DHT11 ist exakt 
80us lang wie im Datenblatt beschrieben. Ich denke also nicht, dass dies 
das Problem ist.

von Jim M. (turboj)


Lesenswert?

Larch schrieb:
> Im Oszi bild ist zu erkennen wie die Spannung langsam hoch geht, nachdem
> der Pin um konfiguriert wird.

Und danach wird sie zuerst hart auf GND und dann hart auf VCC gezogen. 
Bei Open Drain müssten alle steigenden Flanken wie die allererste im 
Oszi Bild aussehen. Tun sie aber nicht -> Pin ist Push-Pull.

von Larch (Gast)


Lesenswert?

ok, danke für den Tip mit dem 1k Widerstand.
Ich habe dies nun gemacht und es ist tatsächlich so, dass das Signal auf 
der Seite vom DHT11 sehr schön ist und auf der anderen Seite sehr 
schlecht.

Die nächste Frage ist, wieso der Ausgang immer noch auf High treibt, 
obwohl er als Eingang Konfiguriert ist.

Vielen Dank für die Antworten!!!!

von Darth Moan (Gast)


Lesenswert?

Moin,

Larch schrieb:
>  HAL_GPIO_WritePin(DHT11_DATA_GPIO_Port, DHT11_DATA_Pin, 0);

> HAL_GPIO_Init(DHT11_DATA_GPIO_Port, &ty);

Diese beiden wollen DHT11_DATA_Pin als Pin Nummer (0..15)

>   while(DHT11_DATA_GPIO_Port->IDR & DHT11_DATA_Pin == 0)

>   while(DHT11_DATA_GPIO_Port->IDR & DHT11_DATA_Pin == 1)

Diese beiden scheinen DHT11_DATA_Pin als Bit Mask fuer das Port Input
Register haben zu wollen.
Was soll denn da wirklich passieren?

Wenn man abfargen will, ob (zB) bit 5 gesetzt (1) ist, wäre doch eher
das hier richtig:

while(((DHT11_DATA_GPIO_Port->IDR&(1<<DHT11_DATA_Pin))>>DHT11_DATA_Pin)= 
=1)

oder ist da noch was anderes gemeint?
Mit nem F070 hab ich noch nix gemacht.

Was passiert ausserhalb der Funktion, wenn du mit -1 zurückkehrst?

von Larch (Gast)


Lesenswert?

Das Problem lag in der Benutzung der HAL Bibliothek.

Nach dem Umstellen auf die LL Library wurde der Ausgang korrekt 
umgestellt und alles funktioniert nun.

Übrigens:
1
while(DHT11_DATA_GPIO_Port->IDR & DHT11_DATA_Pin == 1)
ist bullshit, da es eine integer operation ist und nicht eine bool 
operation. D.h. diese Bedingung ist nur gegeben, wenn DHT11_DATA_Pin 1 
ist.
Lösung:
1
while(DHT11_DATA_GPIO_Port->IDR & DHT11_DATA_Pin)

Darth Moan schrieb:
> Larch schrieb:
>>  HAL_GPIO_WritePin(DHT11_DATA_GPIO_Port, DHT11_DATA_Pin, 0);
>
>> HAL_GPIO_Init(DHT11_DATA_GPIO_Port, &ty);
>
> Diese beiden wollen DHT11_DATA_Pin als Pin Nummer (0..15)
>
>>   while(DHT11_DATA_GPIO_Port->IDR & DHT11_DATA_Pin == 0)
>
>>   while(DHT11_DATA_GPIO_Port->IDR & DHT11_DATA_Pin == 1)
>
> Diese beiden scheinen DHT11_DATA_Pin als Bit Mask fuer das Port Input
> Register haben zu wollen.
> Was soll denn da wirklich passieren?


Das ist so nicht ganz richtig.
DHT11_DATA_Pin ist eine Bitmaske

> Wenn man abfargen will, ob (zB) bit 5 gesetzt (1) ist, wäre doch eher
> das hier richtig:
>
> while(((DHT11_DATA_GPIO_Port->IDR&(1<<DHT11_DATA_Pin))>>DHT11_DATA_Pin)=
> =1)
oder siehe oben...

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.