ADC LM35 STM32L0538 Błędny pomiar z czujnika

Pytania dotyczące problemów ze zrozumieniem kart katalogowych, not aplikacyjnych dla mkrokontrolerów ARM firmy STMicroelectronics, rozwiązania układowe z zastosowaniem STM.
Awatar użytkownika
StaryAnoda_NEW
Newb
Newb
Posty: 78
Rejestracja: środa 04 kwie 2018, 16:48

ADC LM35 STM32L0538 Błędny pomiar z czujnika

Postautor: StaryAnoda_NEW » sobota 16 lut 2019, 19:28

Hej

Posiadam zestaw ewaluacyjny STM32L0538 Discovery. Mam problem z pomiarem napięcia z prostego czujnika LM35. Pomiaru dokonuję na pinie PA4 który nie jest zajmowany przez inne układy na płytce.

Program na którym testuję pomiar napięcia:

Kod: Zaznacz cały

 /* Initialize all configured peripherals */
        MX_GPIO_Init();
        MX_ADC_Init();
        /* USER CODE BEGIN 2 */
        HAL_ADC_Start(&hadc);
        /* USER CODE END 2 */
 
        /* Infinite loop */
        /* USER CODE BEGIN WHILE */
   while (1)
   {
      /* USER CODE END WHILE */

      /* USER CODE BEGIN 3 */
      if(HAL_ADC_PollForConversion(&hadc, 100) == HAL_OK)
      {
         volatile uint32_t reading = HAL_ADC_GetValue(&hadc); // volatile abym mógł podglądnąć wartości zmiennych w przy użyciu profilu debug
         volatile double voltage = reading * (3.3 / 4096);
// Tutaj BREAKPOINT jest wstawiony
         HAL_Delay(1000);
         HAL_ADC_Start(&hadc);
      }
   }

20190216_185553.jpg

Wartości napięcia podglądam przy użyciu profilu debug:
Zrzut ekranu (2).png

W momencie robienia tego zrzutu ekranu miernik cyfrowy wskazał wartość 257mV. Moje testy:
Nie ma znaczenia czy miernik cyfrowy jest wpięty.
Na czas robienia zdjęcia został odłączony kondensator elektrolityczny 10uF który znajduję się zaraz przy nóżkach zasilających LM35DZ.
Kiedy podaję napięcie z zewnętrznego zasilacza pomiary różnią się w niewielkim - stopniu są dla mnie akceptowalne.
20190216_191258.jpg

Zrzut ekranu (5).png

Czy jest mi ktoś podpowiedzieć gdzie robię błąd?
Albo dać jakieś wskazówki co mogę jeszcze sprawdzić?
Od razu zaznaczam, że robiłem buforowanie sygnału przy użyciu wzmacniacza operacyjnego LM324 i rezultaty były takie same.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Nie jest możliwe, żeby ludzki umysł opracował rzecz bardziej uniwersalną niż mikroprocesor - Andy Grove

Awatar użytkownika
ZbeeGin
User
User
Posty: 308
Rejestracja: sobota 08 lip 2017, 17:16
Lokalizacja: GOP
Kontaktowanie:

Re: ADC LM35 STM32L0538 Błędny pomiar z czujnika

Postautor: ZbeeGin » niedziela 17 lut 2019, 11:33

Zrobiłem parę testów na "żywym organizmie". Moje wnioski są następujące.

1. Przed pierwszym pomiarem powinieneś zrobić kalibrację przetwornika. HAL dostarcza odpowiedniej funkcji, która uruchamia wewnętrzny proces autokalibracji: HAL_ADCEx_Calibration_Start(&hadc, ADC_SINGLE_ENDED);. Trzeba ją umieścić przed pierwszym HAL_ADC_Start(&hadc); i wywołać tylko raz. Dodałem ją w tej sekcji.

Code: Select all

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC_Init();
/* USER CODE BEGIN 2 */

HAL_Delay(100);
HAL_ADCEx_Calibration_Start(&hadc, ADC_SINGLE_ENDED);

/* USER CODE END 2 */


Ten HAL_Delay(100); być może jest niepotrzebny bo procedura autokalibracji i tak poczeka na pełną stabilizację ADC.

2. Moim zdaniem błędem w tej aplikacji jest ustawienie taktowania przetwornika. Oryginalny kod z CubeMX wybiera takie źródło:

Code: Select all

hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;


Jest to zegar zsynchronizowany z PCLK i przepuszczony przez preskaler. Można tu wybrać jeszcze dwa inne preskalery _DIV1, _DIV4. Przy każdym z nich odczyty wydają się błędne - nawet po autokalibracji - i do tego różne dla każdego z ustawień tego preskalera. Coś tu musi być na rzeczy...

Dlatego zmieniłem źródło taktowania na generator przeznaczony dla ADC i użyłem jego preskalera:

Code: Select all

hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4;


Próby pomiarów wykazują teraz, że dla kilku wybranych ustawień preskalera (_DIV2, _DIV4 a nawet _DIV32) odczyty są takie same i co najważniejsze poprawne. W moim testowym układzie mam potencjometr 50k podłączony do PA4. Ustawiłem na nim 0.502mV (odczyt z multimetru). Aplikacja zaś daje odczyt... między 0.501 a 0.503 (pomijam dalsze cyfry jako nieistotne).

Te wartości uznaje za całkowicie poprawne.

I jeszcze jedno. Moja aplikacja działa z innym ustawieniem zegara HCLK. Wykorzystuje HSI 16MHz tak podzielone i pomnożone by zegar systemowy taktował rdzeń 32MHz, czyli maksymalna wartość dla tego układu.

Awatar użytkownika
StaryAnoda_NEW
Newb
Newb
Posty: 78
Rejestracja: środa 04 kwie 2018, 16:48

Re: ADC LM35 STM32L0538 Błędny pomiar z czujnika

Postautor: StaryAnoda_NEW » niedziela 17 lut 2019, 12:50

Ok to podsumowując. Problem został rozwiązany, źródłem problemu było ustawienie źródła taktowania przetwornika. Bardzo dziękuję koledze ZbeeGin za pomoc w rozwiązaniu problemu.
Nie jest możliwe, żeby ludzki umysł opracował rzecz bardziej uniwersalną niż mikroprocesor - Andy Grove


Wróć do „STM - problemy układowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość