niedziela, 18 września 2016

[3] STM32F4 - Rejestry DAC

W tym poście chciałbym opisać sposób zaprogramowania konwertera cyfrowo - analogowego na rejestach. Trochę teorii zostało już przeze mnie opisanej w części dotyczącej DAC na bibliotekach.

Program:


W pierwszej kolejności aby była możliwość wyprowadzania sygnału na zewnątrz to należy ustawić piny w tryb analogowy za pomocą rejestru MODER. Który wygląda następująco:

Rys. 1. Rejestr GPIO MODER

Każdy z dwóch bitów odpowiada za ustawienie jednego pinu. Funkcje analogowe otrzymuje się poprzez wpisanie do pojedynczej sekcji 11. Wobec tego aby włączyć pin PA4 oraz PA5, PA4 odpowiada DAC1 natomiast PA5 odpowiada za DAC2. Mikrkontroler STM32F401 nie posiada wyjść dla sygnału z konwertera analogowo-cyfrowego.

  1. GPIOA->MODER |= 0x00000F00;

Następnym w kolejności jest włączenie zegara dla DAC:

  1. RCC->APB1ER |= 0x20000000;

Kolejnym krokiem jest włączenie rejestru kontrolnego. W którym należy ustawić oba kanały jako wyjście. Czyli EN1 oraz EN2 należy ustawić na 1.

Rys. 2. Rejestr DAC Control

  1. DAC->CR |= 0x00000F00;

Na samym końcu wygenerowany zostanie sygnał piłokształtny na obu wyjściach układu. Sygnał zostaje wygenerowany poprzez podawanie wartości do 12 bitowego rejestru DAC_DHR12R2 dla kanału drugiego, oraz DAC_DHR12R1. Przykładowa generacja została zawarta w pętli while.

  1. while(1)
  2. {
  3.     DAC->DHR12R1 = i & 0xFFF;
  4.     DAC->DHR12R2 = 0xFFF - (& 0xFFF);
  5.     j = (+ 1) & 0x0FFF
  6. }



Rys. 3. Rejestr DHR12R1

Na rysunku 3 przedstawiłem konstrukcję rejestru przechowującego dane dla DAC1. Zajęte są tylko 12 bitów z danymi od 0 do 11. Pozostałe są zarezerwowane.

Całość wygląda następująco:

  1. int main()
  2. {
  3.     RCC->APB1ER |= 0x20000000;
  4.     GPIOA->MODER |= 0x00000F00;
  5.     DAC->CR |= 0x00000F00;
  6.     while(1)
  7.     {
  8.         DAC->DHR12R1 = i & 0xFFF;
  9.         DAC->DHR12R2 = 0xFFF - (& 0xFFF);
  10.         j = (+ 1) & 0x0FFF
  11.     }
  12. }

Bibliografia


[1] Reference manual RM0090