Skocz do zawartości

STM32 – ADC i DMA, wartość się nie zmienia


Pomocna odpowiedź

Napisano (edytowany)

Cześć, świetna pomoc w kursie, jednak mam problem z dostępem w kodzie do wartości odczytanych z DMA

Niby wszystko działa poprawnie, to znaczy w STM Studio widzę zmiany wartości w ADC_Value[1] oraz ADC_Value[2], natomiast gdy chce je wykorzystać w kodzie przypisując je do zmiennych posX oraz posY to nic się nie dzieje, to znaczy nowe zmienne mają wartości 0 cały czas.

Jakiś pomysł? 🙂

/* USER CODE BEGIN PV */
uint32_t ADC_Value[2];

uint32_t posX;
uint32_t posY;


/* USER CODE END PV */

/////////////////////

później inicjacje itd

/////////////////////

  HAL_ADC_Start_DMA(&hadc1, ADC_Value, 2);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      
      posX=ADC_Value[0];
      posY=ADC_Value[1];
      HAL_Delay(1000);
    /* USER CODE END WHILE */



    /* USER CODE BEGIN 3 */
  }

Pozdrawiam,

Max

Edytowano przez Gieneq

Wygląda na to, że ADC działa wolniej niż rdzeń mikrokontrolera (cóż za niespodzianka! ;). Nasuwa się więc wniosek, że trzeba zaczekać aż ADC zakończy próbkowanie i dopiero wtedy przypisać wyniki albo włączyć przerwanie od zakończenia działania DMA.

Dla sprawdzenia tej tezy proponuję użyć funkcji wykorzystującej polling, HAL_ADC_PollForConversion lub sprawdzać w pętli  czy hal_dma_state_ready.

 

Czy działa wolniej, czy szybciej nie ma raczej najmniejszego znaczenia, w końcu jak nie w pierwszym to drugim obiegu pętli poprawne dane powinny być widoczne.

Proponuję więc zamiast sprawdzania stanu konwersji dodać volatile do zmiennych.

Najlepiej wstaw cały kod bo nie wiadomo nawet czy adc jest włączone poprawnie, dma jest zdaje się uruchamiane tylko raz.

Autor wątku przecież napisał:

"Niby wszystko działa poprawnie, to znaczy w STM Studio widzę zmiany wartości w ADC_Value[1] oraz ADC_Value[2],"

Więc jeśli to prawda, konwersja działa poprawnie. Tak jak napisałem, proponuję dodać, volatile, a jak nie pomoże to można będzie szukać dalej.

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