Skocz do zawartości

Kurs STM32L4 – #9 – przetworniki analogowo-cyfrowe (ADC)


Pomocna odpowiedź

@StefanekP @dudoxx sprawdźcie jak działa SWV - serial wire viewer. Nie pamiętam czy trzeba tam kolejną linię STlinka (SWO), ale chyba nie. To jest wbudowane w CUbeIDE. To jest coś podobnego do LiveExpresions debuggera.

Przy pracy z większymi STMkami jest też narzędzie TraceX dla RTOS ThreadX, tylko ono jest chyba tylko na windowsa, na pewno jest do pobrania ze stora. W tym rozwiązaniu dodaje się statyczny bufor w którym zapisywane są wartości zmiennych.

  • Lubię! 2
Link do komentarza
Share on other sites

@StefanekP przepraszam za brak wcześniejszej odpowiedzi, ale nie zauważyłem Twojego pytania. Jeśli chodzi o STM Studio to program ten działa wyłącznie na Windowsach i właściwie nie jest już rozwijany. Pokazaliśmy go w kursie, ponieważ jest stosunkowo prosty w obsłudze. Firma ST przygotowała nowsze narzędzie, które może się tu przydać - mowa o STM32CubeMonitor. Program ten jest jednak znacznie bardziej rozbudowany, daje dużo więcej możliwości i właściwe byłby dobrym tematem na osobny kurs. Więcej informacji na ten temat znaleźć można np. na YT firmy ST, przykładowy wstęp:

 

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@StefanekP warto się zastanowić też czy faktycznie tego potrzebujesz. Rysowanie wykresów i wizualizacja jest ciekawa, tylko nie zawsze jest to potrzebne. Może jak w jakimś projekcie będzie tego potrzebował to wtedy się zainteresujesz 😉 

  • Lubię! 1
Link do komentarza
Share on other sites

Cześć wszystkim,

od trzech dni próbuje zrobić zadania z tej części kursu i mimo, że pomysł już wymyśliłem, to układ raz działa, raz nie, wygląda jak by się dosłownie sam zawieszał i odwieszał, totalnie nie mogę znaleźć o co chodzi i pomyślałem, że może ktoś z  Was mi wytłumaczy. Myślałem, że chodzi o printowanie bieżących ustawień, intensywności oświetlenia i częstotliwości migania, np. zabiera za dużo czasu i przez to układ wariuje, ale bez printa dzieje się dokładnie to samo.

 

Generalny zamysł jest taki, że TIM6, generuje na jednym kanale sygnał PWM, wypełnienie sygnału jest zależne od rezystancji fotorezystora, a miganie realizowane jest poprzez przerwania cykliczne, wywoływane przez TIM6, którego counter period zależny jest od ustawienia potencjometru. 

 

Poniżej wrzucam swój projekt i chętnie przyjmę każde inne uwagi, np. odnośnie kodu i samego podejścia do problemu.

ADC_TASK1.zip

Link do komentarza
Share on other sites

@Tomasz2000PL przepraszam za brak odpowiedzi, ale odłożyłem ten temat na później, aby odpisać za jakiś czas, a później zamknąłem kilka kart w przeglądarce i temat umknął. Czy pytanie jest nadal aktualne?

Link do komentarza
Share on other sites

Cześć wszystkim,

Takie pytanie, może trochę głupie, dlaczego podpięcie joysticka pod 5V może uszkodzić mikrokontroler? Czy chodzi tu o potencjalne zagrożenie przepływu zbyt dużego prądu przy maksymalnym zwarciu potencjometru w joysticku (R=0)?

Link do komentarza
Share on other sites

13 minut temu, P-- napisał:

Takie pytanie, może trochę głupie, dlaczego podpięcie joysticka pod 5V może uszkodzić mikrokontroler? Czy chodzi tu o potencjalne zagrożenie przepływu zbyt dużego prądu przy maksymalnym zwarciu potencjometru w joysticku (R=0)?

Producent zaprojektował mikrokontroler tak, by wytrzymywał napięcie 3.3V (teoretycznie 3.6V do 4.0V). Większość wejść w STM32 wspiera logikę 5V, aczkolwiek należy wtedy zwracać szczególną uwagę na noty aplikacyjne, dokumentację danego układu etc. Dlatego jest tam określenie "może". Dla przykładu kursu dużo wygodniejsze jest założenie, że lepiej tego nie robić, by nie wprowadzać kursanta w zbyt duże zakłopotanie. O tym jak połączyć MCU z logiką 5V może dowiedzieć się w zakresie własnym.

ADC akurat jest wejściem, które (chyba) w każdym STM32 wspiera max 3.6V. Więc podłączanie tutaj 5V jest grubo ponad limity wynikające z dokumentacji, a to co się uszkodzi w środku już nie powinno nas interesować. Dla nas wystarczy, że układ będzie nadawać się na złom. (By określić czemu MCU ulegnie uszkodzeniu potrzebny byłby schemat architektury wewnętrznej, a tego producent raczej nie udostępni).

Ogólna zasada: 3.3V, max 3.6V. >4.0V => "proszę działaj dalej".

Edytowano przez H1M4W4R1
  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dzięki za odpowiedź, jest to już dla mnie jasne.

Nasunęło mi się natomiast kolejne pytanie, w kursie nie ograniczaliśmy w żaden sposób płynącego maksymalnego prądu, więc czy całkowite zwarcie potencjometru może być w jakiś sposób groźne?

Link do komentarza
Share on other sites

Dnia 25.05.2021 o 08:18, Treker napisał:

@tktofi głównym celem tej części kursu było omówieni ADC. Rysowanie wykresów to tylko mały dodatek (w kategoriach ciekawostki). Zdecydowaliśmy się na STM Studio dlatego, że ma ono jedną dużą zaletę - jest po prostu bajecznie proste w użyciu. W wielu przypadkach taki program w zupełności wystarcza. STM32CubeMonitor to oczywiście ciekawy projekt, ale znacznie bardziej rozbudowany. Ciężko byłoby sensownie wspomnieć o tym narzędziu wyłącznie w ramach krótkiej ciekawostki, bo jego obsługa nie jest już tak banalna i może budzić sporo pytań. Ten program zasługuje raczej na osobny "minikurs" lub przynajmniej osobny, długi artykuł - niewykluczone, że takie materiały pojawią się na Forbocie w przyszłości, ale już poza tym cyklem, który i tak będzie najobszerniejszym kursem w historii Forbota 😉

STM Studio jest dostępne jedynie w wersji na Windows'a, a CubeMonitor posiada już wersje na inne systemy operacyjne, stąd też fajnie by było krótko omówić, jak sobie poradzić w przypadku nowego narzędzia ;)

  • Lubię! 1
Link do komentarza
Share on other sites

Siemka, poniżej mój pomysł na zadanie 2, wiem że dość prymitywne podejście ale nie wpadłem jak inaczej to zrealizować. Jeśli ktoś w inny sposób podszedł/podszedłby do tego to zachęcam do podzielenia się w komentarzach.

value[0] i value[1] to wartość z dzielnika napięcia z fotorezystorem, value[2] to potencjometr do regulacji częstotliwości migania (tak naprawdę to zmienia długość czasu w którym diody świecą). Wykonane na 3 kanałach przetwornika (można na 2 ale wcześniej eksperymentowałem z joystickiem i tak zostało) i 2 timerach ( jeden do PWM drugi do obsługi migania). W późniejszym etapie dodałem funkcje do naprawy nieliniowości diody ( z artykułu).

/* USER CODE BEGIN 0 */
volatile static uint16_t value[3];


int __io_putchar(int ch)
{
	if (ch == '\n') 
    {
   	 __io_putchar('\r');
 	 }
  	HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
  	return 1;
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{

	if(htim==&htim3)
		{
			__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, value[0]);
			__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, value[1]);
		}

}



/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART2_UART_Init();
  MX_ADC1_Init();
  MX_TIM3_Init();
  MX_TIM6_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */

  HAL_TIM_Base_Start_IT(&htim6);
  HAL_TIM_Base_Start_IT(&htim3);
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);

  HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */



  HAL_ADC_Start_DMA(&hadc1,(uint32_t*)value, 3);

  while (1)
  {
	  while(__HAL_TIM_GET_COUNTER(&htim6)>value[2])
	  		{
	  			__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0);
	  			__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0);
	  		}




    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**

 

  • Lubię! 2
Link do komentarza
Share on other sites

Czy to normalne, że fotorezystor potrzebuje tak dużo światła żeby mógł zareagować? Przez jakieś 20 minut szukałem błędu w konfiguracji i kodzie zastanawiając się czemu dioda nie gaśnie. Okazało się, że dopiero przyłożenie fotorezystora na odległość 15-20 cm do mocno świecącej lampki sprawiło, że dioda zgasła. Trochę inaczej wyobrażałem sobie działanie tego elementu 🤔

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!

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