Skocz do zawartości

UART_DMA


MasteR_PuppetS

Pomocna odpowiedź

Witam.

Próbuję przesyłać dane z czujników z mikrokontrolera do komputera.

Realizuję to w ten sposób:

Zapisują dane z czujników do odpowiednich zmiennych, zabezpieczając się, aby wartości przypadkiem nie przekroczyły 'sensownych' wartości w ten sposób:

	if(((ECHO1_rejestr2 - ECHO1_rejestr1) / 54) < 999)
	{
		dystans_HC_1 = (ECHO1_rejestr2 - ECHO1_rejestr1) / 54;
	}
	if(((ECHO1_rejestr2 - ECHO1_rejestr1) / 54) < 999)
	{
		dystans_HC_2 = (ECHO2_rejestr2 - ECHO2_rejestr1) / 54;
	}


	if(PWM_rejestr2 > PWM_rejestr1)
	{
		if(((PWM_rejestr2 - PWM_rejestr1) / 2.84) < 361)
		{
			ENK_kat = (PWM_rejestr2 - PWM_rejestr1) / 2.84;
		}
	}
	else
	{
		if(((1024 + (PWM_rejestr2 - PWM_rejestr1)) / 2.84) < 361)
		{
			ENK_kat = (1024 + (PWM_rejestr2 - PWM_rejestr1)) / 2.84;
		}
	}

Wartość czujnika SHARP analogowego jest odczytywana za pomocą DMA

HAL_ADC_Start_DMA(&hadc1, ADC_rejestr_DMA, 3);

Następnie konwertuję te dane do stringa w ten oto sposób:

sprintf(buffor, "x%04d %03d %03d %03d", ADC_rejestr_DMA[0],
		            dystans_HC_1, dystans_HC_2, ENK_kat);

I następnie przy wykorzystaniu DMA transmituję te dane komendą:

HAL_UART_Transmit_DMA(&huart3, buffor, 17);

umieszczoną przed pętlą while.

I działa to nawet poprawnie, string przeważanie wygląda w ten sposób:

"x1337 185 087 250"

jednak czasami przyjmuje postać np:

"x1421 188 65535 3" - moja pierwsza myśl była taka, że wynika to z "przepełnienia" się jednego z liczników, i w wyniku odejmowania rejestrów otrzymujemy taką oto liczbę, ale potem zastosowałem instrukcje warunkowe, aby wyeliminować takie wyniki właśnie - nie pomogło.

innym przykładem stringu błędnego jest:

"x1336 05494 12160" - to wygląda jeszcze dziwniej.

Zachodzę w głowę, i nie mam pojęcia co może być przyczyną.

Może Wy dostrzegacie gdzieś błąd ?

__________

Komentarz dodany przez: Treker

Link do komentarza
Share on other sites

STM32F103

Dodatkowe info:

Skierowałem przed chwilą dwa czujniki ultradźwiękowe (HC-SR04) na obiekt oddalony o około 20 cm

oto wyniki:

Co ciekawe, kiedy printuję osobno każdy czujnik, to wskazują poprawne wartości

[ Dodano: 17-02-2016, 22:07 ]

Wygląda na to, że to jednak problem z czujnikami.

Chryste Panie, jak ogromne jest moje zdziwienie, kiedy jeszcze wczoraj ten sam kod działał, a dziś już nie.

Wygląda na to, że za każdym kolejnym razem poprawnych wyników było coraz mniej. Na samym początku prawie wszystkie były poprawne, a teraz ten sam kod wywala w większości 0 lub wartości oscylujące wokól 65518.

Bladego pojęcia nie mam, co może być przyczyną.

Szczególnie, że początkowo pojawiało się dość dużo ewidentnie poprawnych wyników - ciężko więc doszukiwać się błędów w ustawieniach timera.

Liczba 655xx jest zbliżona do maxymalnego zakresu zmiennej w której przechowuję wartość (uint16)

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.