STM32 DAC.

STM32 DAC.

Ключевое отличие цифровой электроники от аналоговой заключается в том, что цифровая электроника оперирует лишь двумя уровнями сигнала логическим нулем и единицей. Это не значит, что если мы подключим к ножке микроконтроллера мультиметр, он покажет 0 или 1V. Нуль, образно говоря, можно представить как отсутствие сигнала, а единица как присутствие сигнала, величина же самого сигнала зависит от питающего напряжения микросхемы. Если Ваш МК питается от 3V, то логический нуль будет соответствовать 0V, а логическая единица 3V. Для получения промежуточных значений напряжения на выводе микроконтроллера используют DAC или по-русски ЦАП.

DAC у STM32 обладает следующими особенностями:
  • двухканальный 12 разрядный, может работать в 8 или 12-битном режиме
  • напряжение на выходе от 0 до Vref
  • аппаратная генерация шума и пилы
  • одновременная загрузка данных в оба DAC
  • отдельный DMA канал на каждый DAC
  • запуск преобразования по триггеру


Сразу хотелось бы отметить, что данные сначала загружаются в регистр предварительного хранения (data holding register, DHRx), и лишь потом по событию (если включено) переносятся в выходной регистр (DORx).

Регистр управления DAC_CR:

DMAEN2 (DAC channel2 DMA enable) — единица в этом бите разрешает использовать DMA.

MAMP2[3:0](DAC channel2 mask/amplitude selector) — битовое поле позволяет задавать амплитуду генерируемого.

WAVE2[1:0](DAC channel2 noise/triangle wave generation enable) — битовое поле позволяет включать аппаратный генератор и выбирать форму генерируемого сигнала. 0 — аппаратный генератор отключен, 1 — генерация шума, 2 — генерация пилы.

TSEL2[2:0](DAC channel2 trigger selection) — битовое поле позволяет выбрать источник события по которому данные будут переносится из регистра предварительно хранения (data holding register, DHRx), в выходной регистр (DORx).
STM32 DAC.


TEN2(DAC channel2 trigger enable) — единица в этом бите включает перенос данных из регистра предварительно хранения (data holding register, DHRx), в выходной регистр (DORx) по триггеру. Если событие аппаратное это занимает 3 такта, если программное то 1.

BOFF2(DAC channel2 output buffer disable) — единица в этом бите, отключает буфер на выходе ЦАП, по умолчанию он включен.

EN2(DAC channel2 enable) — единица в этом бите запускает ЦАП.

Образно, регистр можно разделить на две части, они полностью идентичны, но настраивают разные каналы.

DMAEN1(DAC channel1 DMA enable) —
MAMP1[3:0](DAC channel1 mask/amplitude selector) —
WAVE1[1:0](DAC channel1 noise/triangle wave generation enable) —
TSEL1[2:0](DAC channel1 trigger selection) —
TEN1(DAC channel1 trigger enable) —
BOFF1(DAC channel1 output buffer disable) —
EN1(DAC channel1 enable) —

Регистр управления программным триггером DAC_SWTRIGR:

SWTRIG2(DAC channel2 software trigger) — при записи единицы в этот бит генерируется программное событие для второго канала.

SWTRIG1(DAC channel1 software trigger) — при записи единицы в этот бит генерируется программное событие для первого канала.

Данные в регистр предварительного хранения могут загружаться в нескольких форматах: 12 бит выравнивание по правому краю, 12 бит выравнивание по левому краю , 8 бит. Для каждого способа существует свой регистр, что значительно упрощает настройку.
STM32 DAC.


DAC_DHR12Rx — предназначен для загрузки 12 бит выровненных по правому краю.

DAC_DHR12Lx — предназначен для загрузки 12 бит выровненных по левому краю.

DAC_DHR8Rx — предназначен для загрузки 8 бит выровненных по правому краю.


Если данные обоих ЦАП необходимо обновить одновременно, это можно сделать используя следующие регистры.
STM32 DAC.


DAC_DHR12RD — предназначен для одновременного обновления обоих каналов, 12 бит выровненных по правому краю.

DAC_DHR12LD — предназначен для одновременного обновления обоих каналов, 12 бит выровненных по левому краю.

DAC_DHR8RD — предназначен для одновременного обновления обоих каналов, 8 бит выровненных по правому краю.


Регистр данных DAC_DOR1 — позволяет считывать текущее состояние выхода первого ЦАП.

Регистр данных DAC_DOR2 — позволяет считывать текущее состояние выхода второго ЦАП.

Мне ЦАП понадобился для получения напряжения величиной 1V на ножке МК. Код ниже позволяет это сделать.


#include "stm32f4xx.h"

void DAC_Init(void)
{
  //разрешаем тактирование порта
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; 
  //PA5 push-pull
  GPIOA->MODER |= GPIO_MODER_MODER5_1;
  GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR5;
  GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR5;
 
  //разрешаем тактироваине DAC
  RCC->APB1ENR |= RCC_APB1ENR_DACEN;
  //включаем DAC2
  DAC->CR |= DAC_CR_EN2;  
  //загружаем 12 битные данные в регистр с правым выравниванием          
  DAC->DHR12R2 = 1000;
}
комментарии
0