Skocz do zawartości

Kurs STM32L4 – #13 – czujnik ciśnienia, pomiar wysokości (I2C)


Wiadomość dodana przez Treker,

Zadanie domowe numer 3, które znajdowało się w pierwotnie w tej części kursu, było źle sformułowane i nie było możliwe do realizacji. Zadanie zostało usunięte. Przepraszamy za kłopoty osoby, które miały problem z realizacją tego ćwiczenia 🙂

Pomocna odpowiedź

@KEacper cieszę się, że problem rozwiązany! Byłem właśnie ciekawy z czym porównujesz pomiary 😉

Miło słyszeć, że kurs Ci się podoba 🙂 Jeśli chodzi o CAN to temat ten był na naszym radarze, ale później celowo z niego zrezygnowaliśmy. Głównie z trzech powodów. Po pierwsze, stosunkowo mały procent czytelników potrzebuje CAN-a na tym etapie nauki. Po drugie, porządne zajęcie się tym tematem wymagałoby praktycznie osobnego kursu. Po trzecie, aby móc działać z CAN-em przydałby się jakiś podzespół, z którym można się komunikować za pomocą tego interfejsu lub drugie Nucleo, aby symulować takie urządzenie - oba rozwiązania znacznie podniosłyby koszt zestawu. Możliwe jednak, że w przyszłości zajmiemy się tym tematem w jakieś osobnej serii poradników.

  • 3 miesiące później...
  • 1 rok później...

Czytając ten rozdział w książce spostrzegłem drobny błąd - mianowicie na stronie 358 w ostatnim akapicie znajduje się zdanie, w którym niepotrzebnie użyto podwójnie słowa "on":

Cytat

Błąd może być duży, a będzie on wynikał on z użycia wartości średniej.

Sprawdziłem, że w internetowej wersji kursu błąd również występuje. Z góry dziękuję za naniesienie poprawki w przyszłości. Przy okazji drobne pytanie - na stronie 362 zastanowił mnie zapis heksadecymalny wartości "0xbd", który został użyty w instrukcji warunkowej if. W tej części kursu autorzy konsekwentnie trzymali się zapisu z użyciem dużych liter, a zatem powinno być "0xBD". Oczywiście zapis małymi literami również jest poprawny. Czy jest to zwykłe przeoczenie, czy też próba zasygnalizowania czegoś?

@cd2dot0 gratuluję czujności i dziękuję za zgłoszenie uwagi. Błąd w wersji elektronicznej został już poprawiony 🙂

Dnia 22.08.2024 o 16:49, cd2dot0 napisał:

Oczywiście zapis małymi literami również jest poprawny. Czy jest to zwykłe przeoczenie, czy też próba zasygnalizowania czegoś?

To zwykłe przeoczenie, nie kryje się za tym nic szczególnego - obie wersje działają tak samo.

  • 5 miesiące później...

@slawekvslawek witam na forum 🙂 Zadanie domowe to odnosi się do fragmentu, który jest pod nagłówkiem: "Pomiar ciśnienia za pomocą czujnika LPS25HB" - przeczytaj go raz jeszcze i temat powinien być jasny. 

  • Lubię! 1

@Treker Jeśli dobrze zrozumiałem to trzeba sprawdzić bit 23 czy jest 1 czy 0. Jeśli jest 1 to wystarczy zmienić 1 na 0 i 0 na 1 i dodać 1?

float lps25hb_read_pressure(void) {
	int32_t pressure = 0;

	if (HAL_I2C_Mem_Read(&hi2c1, LPS25HB_ADDR, LPS25HB_PRESS_OUT_XL | 0x80, 1,
			(uint8_t*) &pressure, 3, TIMEOUT) != HAL_OK) {
		Error_Handler();
	}
  
	if (pressure & 0x800000) {
		pressure |= 0xFF000000;
	}

	return pressure;
}

Na przykład w taki sposób jak powyżej?

Edit. Teraz powinno być już poprawnie.

  • Lubię! 1

Niestety ale mam też problem z 3 zadaniem. Czujnik zwraca ref_pressure jako 0. Próbowałem też odczytać wartości z każdego rejestru ale nadal otrzymuje 0.

#define LPS25HB_REF_P_XL 0x08
#define LPS25HB_REF_P_L 0x09
#define LPS25HB_REF_P_H 0x0A

float lps25hb_read_reference_pressure(void){
	int32_t ref_pressure = 0;

		if (HAL_I2C_Mem_Read(&hi2c1, LPS25HB_ADDR, LPS25HB_REF_P_XL | 0x80, 1,
				(uint8_t*) &ref_pressure, 3, TIMEOUT) != HAL_OK) {
			Error_Handler();
		}
		if (ref_pressure & 0x800000) {
			ref_pressure |= 0xFF000000;
		}

		return ref_pressure/4096.0f;
}

Funkcja zwracająca ciśnienie lps25hb_read_pressure pokazana w kursie działa poprawnie.

  • 1 miesiąc później...

@slawekvslawek przepraszamy za zamieszanie z tym zadaniem domowym - właśnie je usunąłem, aby nikogo nie wprowadzać w błąd. Głównym zamysłem tego zadania było zachęcenie do samodzielnego zapoznanie się z dokumentacją czujnika. Wspomniane rejestry były pierwotnie tylko przykładem funkcji, których nie opisaliśmy w kursie. Zadanie sugerowało, że można użyć rejestry referencyjne do obliczania różnicy między aktualnie zmierzonym ciśnieniem, a ustaloną wartością początkowa. Niestety takie wykorzystanie tych rejestrów nie jest możliwe, więc i samo zadanie zostało źle sformułowane.

Rejestry referencyjne można wykorzystać do automatycznego sprawdzania, czy ciśnienie nie wyszło poza założony przedział. Konkretnie można sprawdzić, czy nie jest ono niższe lub wyższe od zadanej wartości. W przypadku przekroczenia zakresu, czujnik może powiadomić mikrokontroler używając linii przerwania. Takie rozwiązanie sprawia, że nie musimy w programie cały czas sprawdzać ciśnienia, a mikrokontroler może zostać uśpiony i oszczędzać energię, a czujnik wybudzi go po wykryciu wzrostu lub spadku ciśnienia.

Reasumując - Twój wynik był "poprawny" to zadanie miało w sobie błąd.

  • Lubię! 1
Dnia 31.01.2025 o 14:03, slawekvslawek napisał:

@Treker Jeśli dobrze zrozumiałem to trzeba sprawdzić bit 23 czy jest 1 czy 0. Jeśli jest 1 to wystarczy zmienić 1 na 0 i 0 na 1 i dodać 1?

float lps25hb_read_pressure(void) {
	int32_t pressure = 0;

	if (HAL_I2C_Mem_Read(&hi2c1, LPS25HB_ADDR, LPS25HB_PRESS_OUT_XL | 0x80, 1,
			(uint8_t*) &pressure, 3, TIMEOUT) != HAL_OK) {
		Error_Handler();
	}
  
	if (pressure & 0x800000) {
		pressure |= 0xFF000000;
	}

	return pressure;
}

Na przykład w taki sposób jak powyżej?

Edit. Teraz powinno być już poprawnie.

Chyba trzeba jeszcze podzielić przez 4096.0f ??

  • 10 miesiące później...
(edytowany)

Czy jest ktoś w stanie mi pomóc? Mam czujnik LPS311AP i dla podanego kodu cały czas pokazuje mi wartość 760 dla ciśnienia. Próbowałem już kilku rzeczy zawsze to samo i wartość nawet się nie zmienia. Czy to kwestia niedziałającego czujnika czy coś w kodzie?

image.thumb.png.138c4af77d8960bc537d15f9e23c4ea1.png

Zmieniłem częstotliwość pomiaru na CRTL_1 na 12.5 HZ, czujnik teraz działa :D.

W takim razie czy ktoś potrafi odpowiedzieć mi na pytanie dlaczego mam problem z odczytem dla częstotliwości maksymalnej 25 Hz ???

Edytowano przez Czubson
  • 2 tygodnie później...

@Czubson jeśli układ nie działa poprawnie przy wyższych częstotliwościach to może to być kwestia połączeń (przewody, płytka stykowa itd), ewentualnie zasilanie może być zbyt mało stabilnie. Ogólnie im szybsza komunikacja tym łatwiej o problemy, a im wolniej tym układ więcej wybaczy.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...