Апр 192012
 

Цифро-аналоговый преобразователь может работать с 8- или 12-разрядными данными. В 12-разрядном режиме работы данные должны быть выровнены влево или вправо. Запуск преобразования возможен программно, либо от внешних источников – это могут быть таймеры или внешний вход EXTI_9. Имеется 2 канала преобразования, их можно использовать раздельно или одновременно (синхронный запуск преобразования в обоих каналах). Оба канала полностью независимы друг от друга, каждый имеет свои собственные регистры для данных и модуль преобразователя. Вход опорного напряжения Vref является общим с АЦП. Какие еще возможности имеются в ЦАП данного семейства микроконтроллеров? Кроме обычного преобразования “цифра-аналог” модуль может генерировать сигнал шума, а также сигнал треугольной формы. Кроме того, предусмотрена работа с модулем DMA (прямой доступ к памяти). В принципе, модуль ЦАП один из самых несложных для изучения и начала работы.

На следующем рисунке приведена схема цифро-аналогового преобразователя.

DAC block diagram

Пояснения к рисунку:

В левом верхнем углу показаны источники внешнего запуска преобразования: таймеры, внешний вход EXTI_9 и программный запуск. В центре логический модуль, формирующий шумовой сигнал (LFSRx) и треугольный сигнал, а также запрос DMA. В правом верхнем углу регистр управления (DAC control register). Кроме разрешения работы с DMA, на рисунке изображены еще и битовые поля этого регистра MAMPx и WAVENx. В разрядах WAVENx включаются/выключаются функции формирования шума или треугольного сигнала. В разрядах MAMPx задается битовая маска, которая в дальнейшем используется для формирования шумового сигнала с помощью регистра сдвига и логических вентилей.

DAC_LFSR

Это в том случае, когда мы хотим сформировать “шум” на выходе. Если же мы формируем “треугольник”, в этих же разрядах задается амплитуда выходного сигнала. При обычном же преобразовании данные записываются в регистры хранения DHRx (Data holding register), затем, при запуске преобразования они передаются в выходные регистры 2-х каналов – DORx (Data output register – доступны только для чтения). Ну а далее, содержимое регистров  DORx преобразуется в аналоговые величины напряжения в модулях преобразователей (Digital-to-analog-converterx) и поступает на вывод. Для первого канала это вывод PA4, а для второго – PA5. Естественно, перед началом работы, соответствующий вывод должен быть сконфигурирован в аналоговый режим.

По умолчанию к каждому выходу ЦАП подключен буфер с низким выходным сопротивлением, но его можно и отключить. Как уже упоминалось, цифро-аналоговый преобразователь, может работать в 8- или 12-разрядном режиме. В 8-разрядном режиме данные выравниваются по правому краю, в 12-разрядном режиме выравнивание может быть влево или вправо. Регистров хранения довольно много, это отдельные регистры для 12-разрядных данных, причем, для данных, выровненных влево или вправо существуют отдельные регистры. Отдельно регистры для 8-разрядных данных. Еще регистры, которые хранят 12-разрядные данные сразу 2-х каналов (для данных, выровненных влево или вправо – отдельные регистры). Это для одновременного запуска преобразования в обоих каналах. То же самое и с 8-разрядными данными. Описание всех регистров займет здесь много места, поскольку большинство из них предназначено для хранения данных, отличаются они только форматами. Поэтому в конце статьи будет ссылка, по ней можно скачать файл с описанием всех регистров.

При пересылке данных с использованием DMA может возникнуть ситуация, когда поток данных DMA может не успевать за более быстрыми событиями запуска преобразования. Тогда должно произойти преобразование старых данных из регистров хранения, поскольку новые еще не пришли. В этой ситуации формируется соответствующее событие “DMA underrun”. И прерывание, если оно разрешено. По этому событию можно изменить частоту запуска преобразования или запросов DMA, чтобы в дальнейшем не было такого конфликта. Затем потребуется заново запустить пересылку данных через модуль DMA.

Для начала рассмотрим простейший пример. Будем брать данные из массива 8-разрядных чисел и преобразовывать их в аналоговую величину. Для работы выбран канал 2 (выход PA5). Массив состоит из 16 чисел, на выходе получится синусоидальный сигнал. Сигнал, конечно, получится некрасивый, но тут более интересно получившееся значение выходной частоты сигнала. Настройки системы тактирования будут по умолчанию, то есть источник – MSI с частотой 2,097 МГц. В работе будут задействованы всего три регистра цифро-аналогового преобразователя:

  • DAC_CR — управляющий регистр, здесь основные настройки каналов 1 и 2
  • DAC_DHR8R2 – регистр хранения 8-разрядных данных канала 2
  • DAC_SWTRIGR – запуск преобразования

Настройки периферии и запуск преобразования довольно просты, вот основной текст программы с комментариями:

#include "stm32l1xx.h"

//Задаем массив значений для синусоиды
uint8_t sin[16] = {127, 176, 218, 245, 255, 245, 218, 176, 127, 79, 37, 10, 0,10, 37, 79}; 
uint8_t i; //Переменная для цикла

//Объявление функции инициализации периферии
void InitPeriph(void);

int main()
{
  InitPeriph(); //Вызываем функцию инициализации периферии
  while(1) //Бесконечный цикл формирования синусоиды
  {
  for (i=0; i<16; i++)
  {
    DAC->DHR8R2 = sin[i]; //Пишем в 8-разрядный регистр очередное значение массива
    DAC->SWTRIGR |= DAC_SWTRIGR_SWTRIG2; //Запуск преобразования
  }
  }
}

//Функция ининиализации периферии
void InitPeriph()
{
  //Настройка порта А
  RCC->AHBENR |= RCC_AHBENR_GPIOAEN; //Включаем тактирование порта А
  GPIOA->MODER |= GPIO_MODER_MODER5; //Аналоговый вход/выход линии PA5
  GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR5; //Отключаем подтягивающие резисторы
  
  //Настройка цифро-аналогового преобразователя
  RCC->APB1ENR |= RCC_APB1ENR_DACEN; //Включаем тактирование DAC
  DAC->CR |= DAC_CR_EN2; //Включаем канал 2 DAC
  DAC->CR |= DAC_CR_TEN2; //Разрешаем запуск преобразования в канале 2 DAC
  DAC->CR |= DAC_CR_TSEL2; //Выбираем источник запуска - программный
}

Примечание: при настройке линии порта в аналоговый режим (регистр MODER), можно еще управлять только подключением резисторов подтяжки (регистр PUPDR), другие регистры порта (скорость и т.д.) в этом режиме игнорируются и могут содержать любые значения.

Подключаем плату, запускаем выполнение программы. Вот какой сигнал получился на выходе PA5

DAC_output

Частота около 3 кГц. Ну что же, теперь надо бы посмотреть, что можно выжать при максимальной частоте шины APB1 (именно от нее тактируется модуль DAC). Также надо и работу совместно с DMA опробовать. Но это уже в следующий раз, как говорится, продолжение следует…

А по ссылкам ниже можно загрузить файл описания регистров цифро-аналогового преобразователя и архив с проектом программы в IAR.

PDF файл с описанием регистров

Архив проекта работы с цифро-аналоговым преобразователем

Другие статьи: