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

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...

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.