poniedziałek, 21 marca 2016

[3] STM32F4 - Discovery - CubeMx - DAC

W tym poście zaprezentuje sposób generacji sygnału sinusoidalnego za pomocą ustawienia konwertera analogowo cyfrowego.

CubeMx


Całość jak poprzednio należy rozpocząć od wybrania odpowiedniego mikrokontrolera. Następnie należy włączyć DAC, wykonuje się to poprzez zmianę występujących na pinach PA4 i PA5 funkcji. W tym celu klika się prawym przyciskiem myszy na pinie.

Po zaznaczeniu DAC zostaje automatycznie aktywowany.


Rys. 1. Wlaczenie DAC

Kolejnym krokiem jest włączenie zegara. 
Rys. 2. Właczenie zegara

Rys. 3. Parametry zegara

Teraz przyszła kolej na konfiguracje DAC. W tym celu trzeba przejść do zakładki Configuration i tam w polu Analog kliknąć DAC. Wyświetli się okno takie jak na rysunku 4. Co do ustawień to należy włączyć Output Buffer, oraz zaznaczyć sposób wyzwalania jako Software Trigger. Oznacza on wyzwalanie sygnału poprzez odpowiednią komendę w programie.

Rys. 4. DAC konfiguracja

Teraz tylko generacja projektu i przejście do kompilatora w celu dokończenia i wgrania kodu.

Rys. 5. Generacja projektu

Programowanie


Wygenerowany kod należy zmienić w pliku main.c. Na samym początku trzeba zdeklarować tablicę z próbkami dla sygnału sinusoidalnego.

  1. #define DACBUFSIZE 32
  2. int main(void)
  3. {
  4.     /* USER CODE BEGIN 1 */
  5.     //Zmienna wykorzystywana w for
  6.     int i=0;
  7.     //Tablica probek dla sinusa
  8.     const uint16_t dacbuf[DACBUFSIZE] = {
  9.                       2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,
  10.                       3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,
  11.                       599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647};

W następnym kroku należy włączyć kanały DAC:

  1.   /* USER CODE BEGIN 2 */
  2.        
  3.   //Wlaczenie konwertera na pinie PA4
  4.   HAL_DAC_Start(&hdac, DAC_CHANNEL_1); 
  5.   //Wlaczenie konwertera na pinie PA5
  6.   HAL_DAC_Start(&hdac, DAC_CHANNEL_2); 
  7.        
  8.   /* USER CODE END 2 */

Ostatnim elementem jest wprowadzenie wartości i ustawienie aktywacji z programu.

  1.   /* USER CODE BEGIN WHILE */
  2.   while (1)
  3.   {
  4.   /* USER CODE END WHILE */
  5.     for(i=0; i<32; i++)
  6.         {
  7.             //Ustawienie wartosci
  8.             HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1,DAC_ALIGN_12B_R,dacbuf[i]);
  9.             //Wywolanie triggera programowego
  10.             DAC->SWTRIGR|=DAC_SWTRIGR_SWTRIG1;
  11.            
  12.             HAL_DAC_SetValue(&hdac, DAC_CHANNEL_2,DAC_ALIGN_12B_R,dacbuf[i]);
  13.             DAC->SWTRIGR|=DAC_SWTRIGR_SWTRIG2;
  14.         }
  15.        
  16.   /* USER CODE BEGIN 3 */
  17.   }
  18.   /* USER CODE END 3 */

Przedstawiony fragment kodu pozwoli na generację sygnału na obu dostępnych dla DAC-a wyprowadzeniach.