Open drain/collector zieht nicht auf GND (DHT11)

Gast #5304753
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
Angehängte Dateien:
#5304795
>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.
Gast #5304803
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.
#5304815
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.
Gast #5304994
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!!!!
Gast #5305025
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?
Gast #5305656
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...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.