Янв 072013
 

Есть у меня один вялотекущий проект – хочу собрать генератор с программируемой установкой частоты, индикацией и прочими прелестями интерфейса “человек – машина”. Примерно с год валялась у меня в столе на работе эта микросхема. Получил ее в качестве бесплатного образца (сэмпла) от фирмы Analog Devices. Я частенько заказываю у них сэмплы, шлют без вопросов и телефонных звонков, может потому, что делаю заказы от фирмы. Пока попробовал только “оживить” эту микросхему, программируя ее с помощью микроконтроллера STM32. Оживил и понял, что основная работа только впереди, поскольку в дальнейшем потребуется грамотно развести плату, а также хорошенько подумать над схемой выходного фильтра. Но это в будущем, пока же расскажу об этой микросхеме и поделюсь результатами первых экспериментов с ней.

DDS (direct digital synthesis) – метод прямого цифрового синтеза. Этот метод подразумевает формирование периодических аналоговых сигналов из цифровых отсчетов, следующих с определенной тактовой частотой. Итак, для чего же предназначена эта микросхема и какие у нее основные характеристики?

  • AD9834 способна формировать сигналы синусоидальной и треугольной формы, а также прямоугольный сигнал, причем последний можно сформировать как внутри микросхемы, так и подачей сигнала произвольной формы на внешний вход, для этого схема имеет встроенный компаратор.
  • Диапазон допустимых напряжений питания от 2,3В до 5,5В.
  • Максимальная частота выходного сигнала равна 37,5 Мгц при максимальной частоте внешнего тактового сигнала в 75 Мгц (естественно, что нормальную синусоиду такой частоты получить нереально).
  • Программирование частоты и фазы сигнала по трехпроводному интерфейсу SPI.
  • Внешний вывод SLEEP для перевода микросхемы в режим Power-down.
  • Малое потребление мощности, при напряжении питания 3В составляет 20мВт. 

Теперь разберемся с принципом работы и внутренним устройством AD9834. Для этого посмотрим на схему и пройдемся по ней.

AD9834_block diagram

MCLK – вход для внешнего тактового сигнала. Максимальное значение частоты сигнала на этом входе равно 75 Мгц. Это основная тактовая частота всего устройства. Любое значение частоты выходного аналогового сигнала получается делением этой частоты на 2 в степени N.

Через модуль последовательного интерфейса производится запись значений во внутренние регистры частоты, фазы, а также команд управления.

Два регистра частоты предназначены для программирования двух возможных значений частоты выходного сигнала. Для работы всегда используется значение только одного регистра, выбор рабочего регистра можно осуществлять программно, либо управлением через внешний вход FSELECT. Как видите, эти регистры 28-разрядные. Частота выходного сигнала, частота сигнала на входе MCLK и содержимое регистров частоты жестко взаимосвязаны. Чтобы узнать значение, которое требуется записать в счетный регистр, для получения нужной  частоты выходного сигнала, необходимо воспользоваться формулой:

Формула частоты

Запись 28-разрядного значения в регистр частоты производится за 2 раза, с помощью двух 16-разрядных слов, принимаемых через последовательный интерфейс от внешнего микроконтроллера. При этом, в каждом слове значащими являются 14 младших разрядов, а 2 старших бита выделены для выбора регистра частоты. Пока на этом остановимся, и пойдем далее по схеме, чтобы изучить общие принципы формирования сигналов методом DDS.

Следующие основные модули, участвующие  в формировании выходного аналогового сигнала – это аккумулятор фазы, сумматор, ПЗУ с таблицей синуса и цифро-аналоговый преобразователь.

Аккумулятор фазы – это обычный двоичный счетчик. С приходом каждого импульса тактовой частоты MCLK его содержимое увеличивается на число, записанное в регистр частоты. Таким образом, мы каждый раз получаем приращение фазы сигнала. А в действительности, двоичное число – содержимое аккумулятора фазы, является адресом для обращения к определенной ячейке ПЗУ, значение из которой передается цифро-аналоговому преобразователю. В ПЗУ записана таблица двоичных значений синусоидального сигнала. И с каждым периодом тактовой частоты получается новый адрес из таблицы синуса. Чем больше значение в регистре частоты, тем больше увеличивается число в аккумуляторе фазы, и тем быстрее происходит прохождение всех значений в таблице синуса, записанной в ПЗУ. Если снова взглянуть на формулу, приведенную выше, то можно увидеть что частота выходного сигнала имеет прямую зависимость от величины значения регистра частоты, а максимальная ее величина будет равна половине тактовой частоты, при максимальном значении содержимого частотного регистра.

Сумматор в этой схеме позволяет прибавить к содержимому аккумулятора фазы некую константу – начальный сдвиг фазы. Это значение записывается в регистры фазы, их тоже два, и также можно выбирать эти регистры с внешнего входа PSELECT.

Как можно догадаться, на выходе аккумулятора фазы будет последовательность возрастающих значений, и в какой-то момент произойдет переполнение счетчика (аккумулятора фазы) и снова счет начнется сначала. Временной промежуток между переполнениями счетчика как раз и будет равен периоду выходного сигнала (возможно, всего лишь четверти периода, поскольку таблица синуса содержит значения только для одной четверти периода синуса, три последующих четверти периода симметричны первой). А если теперь сигналы с аккумулятора фазы пустить мимо ПЗУ с таблицей синуса, сразу на ЦАП, тогда мы увидим на выходе пилообразный сигнал (видите на схеме после ПЗУ расположен мультиплексор, он как раз и предназначен для выбора формы выходного сигнала между синусом и треугольником).

Как бы поступил программист при формировании синусоиды на выходе микроконтроллера? Создал бы массив констант – таблицу синуса и в цикле последовательно вызывал бы каждое значение массива. А для изменения частоты задействовал бы таймер, к примеру, формируя задержку для цикла или прерывание. Здесь же отличие в том, что тактовая частота всегда одинакова, то есть выбор значений из массива всегда происходит с одной и той же частотой. Но значения массива (таблица синуса в ПЗУ) вызываются не последовательно друг за другом, приращение адреса при вызове нового элемента массива в этом методе и является величиной, определяющей частоту выходного сигнала (а соответственно, и приращение амплитуды и фазы сигнала).

Модуль Full-scale control задает максимальную величину выходного тока. Делается это с помощью внешнего резистора, подключаемого между выводами FS ADJUST и AGND, типовое значение – 6,8 кОм. На выходах IOUT и IOUTB сигнал противофазный. Это токовые выходы, по даташиту нагружены на резисторы сопротивлением 200 Ом. SIGN BIT OUT – выход прямоугольного сигнала. В зависимости от состояния определенных разрядов в регистре управления, на этом выходе может формироваться сигнал либо от внутреннего источника, либо в качестве исходного может быть взят сигнал со входа VIN (см. схему).

Далее рассмотрим назначение разрядов регистра управления.

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

DB13 (B28)

  • 1 – значение в регистр частоты загружается целиком, за две последовательных операции записи, сначала записываются 14 младших разрядов LSB, затем 14 старших MSB.
  • 0 – старшие разряды MSB и младшие разряды LSB регистра частоты можно изменять независимо друг от друга.

DB12 (HLB) работает в связке с разрядом DB13. Когда разрешена запись старших и младших значений регистра частоты по отдельности (DB13 = 0), этот разряд задает выбор старших или младших разрядов для операции записи.

  • 1 – разрешена запись в старшие разряды MSB регистра частоты.
  • 0 – разрешена запись в младшие разряды LSB регистра частоты.

DB11 (FSEL) – задает рабочий регистр частоты. Выбор регистра частоты может определяться состоянием этого бита или логическим уровнем на входе FSELECT. Выбор варианта управления зависит от состояния бита PIN/SW. Все доступные варианты приведены в таблице:

Выбор регистра частоты

 DB10 (PSEL) – выбор регистра фазы. Также может управляться с помощью этого разряда или уровня на внешнем входе PSELECT. Как и для регистра частоты выбор вариантов управления зависит от разряда PIN/SW, см. таблицу:

Выбор регистра фазы

DB9 (PIN/SW) – управление выбором регистров частоты и фазы.

  • 1 – выбор с внешних входов установкой логического уровня
  • 0 – выбор через разряды регистра управления.

DB8 (RESET) – 1 в этом разряде производит сброс внутренних регистров.

DB7 (SLEEP1) – 1 в этом разряде отключает тактовый сигнал внутри микросхемы. При этом выход ЦАП сохраняет уровень, который был до установки разряда.

DB6 (SLEEP12) – переводит ЦАП спящий режим. Этот режим можно использовать при формировании только прямоугольного сигнала.

DB5 (OPBITEN) 

  • 1 — разрешает использование выхода SIGN BIT OUT.
  • 0 – вывод SIGN BIT OUT находится в состоянии высокого импеданса.

DB4 (SIGN/PIB)

  • 1 – встроенный компаратор соединен с выходом SIGN BIT OUT. Для формирования прямоугольного сигнала используется внешний вход.
  • 0 – выход SIGN BIT OUT соединен с разрядом MSB или MSB/2 входного сигнала цифро-аналогового преобразователя. Выбор между MSB или MSB/2 осуществляется через разряд DIV2.

DB3 (DIV2)

  • 1 – MSB соединен с SIGN BIT OUT
  • 0 – MSB/2 соединен с SIGN BIT OUT

DB2 – зарезервирован, всегда должен содержать 0.

DB1 (MODE) – задает форму сигнала на выходах  IOUT и IOUTB.

  • 1 – треугольник
  • 0 – синусоида

DB0 – зарезервирован, всегда должен содержать 0.

Для формирования последовательности команд и данных, передаваемых по последовательному интерфейсу, на сайте Analog Devices есть онлайн-помощник Configuration Assistent.

AD9834 Device Configuration Assistant

Программа несложная, задаем требуемые частоты и фазы, и получаем последовательность 16-разрядных слов, которые надо передать микросхеме. Как видно на рисунке, получена последовательность из 8 слов. Я программировал только один регистр частоты и один регистр фазы, поэтому последовательность сократилась у меня до 5 слов.  Схему собрал практически по даташиту, немного упростив. О том как формируется последовательность управляющих сигналов можно узнать в документе AN-1070. Все эти кодовые посылки подробно расшифрованы там всего на одной странице. Архив с этими документами можно загрузить ПО ЭТОЙ ССЫЛКЕ.

На рисунке ниже приведена временная диаграмма, поясняющая процесс приема посылок данных микросхемой AD9834.

Временная диаграмма

Сигналы SDATA и SCLK – это, соответственно сигналы данных и синхронизации интерфейса SPI. Вход FSYNC является входом выбора кристалла, перепад из высокого уровня в низкий на этом входе сообщает микросхеме, что сейчас ей начнут передаваться данные. На этом входе должен сохраняться низкий уровень во время передачи слова данных. Как я уже упоминал, AD9834 я программировал от STM32, через интерфейс SPI. Для этого использовал отладочную плату STM32VL-DISCOVERY. Привожу код программы:

#include "stm32f10x.h"

uint16_t control_word[5] ={0x2100, 0x637C, 0x4021, 0xC000, 0x2000};

//Инициализация GPIO
void gpio_init()
{ 
  //Линии SPI1 (Master)
  RCC->APB2ENR |= (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN); //Тактирование порта А и альтернативных функций
  GPIOA->CRL &= ~(GPIO_CRL_CNF7 | GPIO_CRL_CNF5 | GPIO_CRL_CNF3); //Очистка бит выбора режима 
  GPIOA->CRL |= (GPIO_CRL_CNF7_1 | GPIO_CRL_CNF5_1); //PA7(MOSI - SDATA), PA5(SCK - SCLK) - AF, Output, PP
  GPIOA->CRL |= (GPIO_CRL_MODE7 | GPIO_CRL_MODE5 | GPIO_CRL_MODE3); //Выходы MOSI, SCK, Slave Select - 50MHz
  GPIOA->CRL |= GPIO_CRL_MODE3_0;//PA3(Slave Select - FSYNC)- Output, PP
  GPIOA->BSRR |= GPIO_BSRR_BS3;//Устанавливаем высокий уровень на FSYNC
}

//Инициализация SPI1
void spi_init()
{ 
  /*Настройка SPI1 (Master)
  16 бит данных, MSB передается первым*/
  RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //Тактирование модуля SPI1
  SPI1->CR1 |= SPI_CR1_BR_2; //Baud rate 
  SPI1->CR1 |= SPI_CR1_CPOL; //Полярность тактового сигнала
  SPI1->CR1 &= ~SPI_CR1_CPHA; //Фаза тактового сигнала
  SPI1->CR1 |= SPI_CR1_DFF; //16 бит данных
  SPI1->CR1 &= ~SPI_CR1_LSBFIRST; //MSB передается первым
  SPI1->CR1 |= SPI_CR1_MSTR; //Режим Master
  SPI1->CR1 |= SPI_CR1_SPE; //Включаем SPI1
}

//Основной цикл программы
int main()
{
  gpio_init(); //Вызов функции инициализации портов
  for(uint32_t j=0; j<0x000001FF; j++);//На всякий случай ввел задержку после установки высокого уровня на FSYNC
  spi_init(); //Вызов функции инициализации модулей SPI 
  for(uint8_t i=0; i<5; i++)//Начинаем цикл передачи 5 16-разрядных слов
    {
      GPIOA->BSRR |= GPIO_BSRR_BR3;//На входе FSYNC низкий уровень
      SPI1->DR = control_word[i];//Передаем данные
      while(!(SPI1->SR & SPI_SR_TXE));//Ждем окончания передачи
      while(SPI1->SR & SPI_SR_BSY);//Ждем окончания занятости модуля SPI
    }
  GPIOA->BSRR |= GPIO_BSRR_BS3;//На входе FSYNC высокий уровень
  while(1);
}

Элемент массива control_word[0] = 0x2100 – заносит необходимые настройки в регистр управления. Следующие два элемента массива (0x637C и 0x4021) программируют первый регистр частоты. Какая именно частота задана этими двумя числами, я уже не помню, менял их не один раз. Следующее число – 0xC000 заносится в первый регистр фазы (нулевой фазовый сдвиг). И последнее слово 0x2000 снова заносится в регистр управления, после этого микросхема начинает формирование синусоиды.

Ниже осциллограммы синуса с различными частотами, полученные мной

100 Гц

1_100 Гц

10 кГц

2_10 кГц

32 768 Гц

3_32 768 Гц

100 кГц – схема уже значительно шумит, поскольку она была собрана по быстрому, на макетной плате.

5_100 кГц_2

С помощью внешних входов FSELECT, PSELECT выбора регистров частоты и фазы можно сформировать сигналы с частотной или фазовой манипуляцией, записав в регистры различные значения, и подав на эти входы модулирующий прямоугольный сигнал. Достоинство данной микросхемы в том, что переходы между разными значениями частоты или фазы будут мгновенными, при этом не будет абсолютно никаких шумов, вызванных переключением частот или фаз сигнала.

На этом заканчиваю описание своего первого опыта работы с данной микросхемой. Выльется ли это со временем в готовую конструкцию генератора, я пока и сам не знаю.

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

  4 Responses to “DDS синтезатор AD9834”

  1. Почаще радуйте таким детальным разбором микросхем, очень познавательно!
    Китайцы уже штампуют готовые модули генераторов на 9850 модельке.