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
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ß.
>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.
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.
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.
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!!!!
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.