Рассмотрим в данной статье как сделать генератор на AD9833. Микросхеме от компании Analog Devices. Данная микросхема позволяет генерировать синусоидальный, прямоугольный и треугольный сигналы с частотой до 12.5 Мгц.
Характеристики AD9833
- Низкое потребление энергии. Всего 12,6 мВт при напряжении 3 В.
- Диапазон изменяемой частоты от 0 до 12500000 Гц. С шагом 1 Гц.
- Формирует такие формы сигнала как, треугольник, синус, меандр.
- Напряжение питание от 2,3 до 5,5 В.
- Диапазон рабочих температур от -40 до +105 °C.
- Десяти выводной корпус.
- Управление микросхемой через SPI интерфейс до 40 МГц.
Функциональная диаграмма
Цоколевка и описание выводов
№ вывода | Название | Назначение |
1 | COMP | Здесь подключается блокировочный конденсатор, который защищает от помех напряжение смещения. |
2 | VDD | Общее питание аналоговой и цифровой частей микросхемы. Так же необходимо подключить развязывающие конденсаторы 0.1 мкФ и 10 мкФ между VDD и AGND. |
3 | CAP/2.5V | Так как цифровая часть работ от напряжения 2,5В, то когда это напряжение превышает 2,7В необходимо подключать развязывающий конденсатор на 100нф. Он подключается между выводом CAP/2.5V и DGND. Если напряжение питания меньше или равно 2,7В то вывод CAP/2.5V подключается напрямую к VDD. |
4 | DGND | Земля цифровой части микросхемы |
5 | MCLK | Вход тактируемой частоты. На основе ее рассчитывается выходная частота. |
6 | SDATA | Вход данных по SPI. Принимает по 16 бит данных. |
7 | SCLK | Тактирование интерфейса SPI |
8 | FSYNC | CS сигнал SPI. Логический 0 указывает, что в микросхему загружается слово. |
9 | AGND | Земля аналоговой части микросхемы |
10 | VOUT | Выход сигнала. В зависимости от того, какой режим выбран, вфходной сигнал либо цифровой либо аналоговый. Так же на этом выходе имеется резистор 200 Ом. По этому внешнюю нагрузку не нужно делать. |
Регистр управления ad9833
Регистр управление представляет собой 16 битное слово. Установив биты D14 и D15 в 0 указываем микросхеме, что регистр изменился и необходимо сделать новые установки.
В таблице описаны назначения битов регистра управления микросхемы AD9833.
Бит | Имя | Описание функций |
D13 | B28 | Так как за раз мы можем загрузить 16 бит, то для загрузки частоты нам необходимо сделать 2 раза запись. Установив B28 = 1 микросхема ожидает полную загрузку значения частоты. Это достигается записью в микросхему двух частей значения частоты. Сначала записываем 14 младших бит (LSB), затем 14 старших бит (MSB). Биты 15 и 16 содержат информацию, какой регистр частоты загружается, первый или второй. Установка частоты произойдет только после того как микросхема получит 2 части значения этой частоты. |
D12 | HLB | Установка этого бита в 1 дает возможность отдельно загрузить либо старшую либо младшую часть частоты. Для этого необходимо установить бит B28 в 0. Бит HLB показывает какая часть, старшая или младшая должна быть загружена. HLB = 1 записывается старшая часть слова частоты, HLB = 0 — записывается младшая часть слова частоты. Если B28 = 1, то этот бит игнорируется и записывать и старшая и младшая часть частоты. |
D11 | FSELECT | Бит FSELECT указывает, какой из регистров частоты используется в данное время — FREQ0 или FREQ1. |
D10 | PSELECT | Бит PSELECT указывает, какой из регистров фазы используется в данное время -PHASE0 или PHASE1. |
D9 | зарезервирован | Должен быть 0 |
D8 | Reset | Reset = 1 сбрасывает внутренние регистры в 0, что соответствует появлению на выходе среднего уровня. При этом регистры фазы, частоты и управления не сбрасываются. |
D7 | SLEEP1 | Данный бит отключает MCLK. Для этого нужно установить SLEEP1 = 1. после отключения MCLK, DAC сохраняет свое текущее состояние. SLEEP1 = 0 — разрешает работу MCLK. |
D6 | SLEEP12 | Бит SLEEP12 = 1 выключает встроенный ЦАП. После чего микросхема формирует прямоугольный сигнал. Когда SLEEP12 = 0 то ЦАП работает в штатном режиме. |
D5 | OPBITEN | Этот бит устанавливает, какой формы сигнал будет на VOUT. Работает вместе с битом D1. Если OPBITEN = 1, то встроенный DAC выключен и на VOUT появляется либо старший бит данных либо частота MSB/2. (Прямоугольный сигнал). Если OPBITEN = 0, DAC подключается к выходу VOUT и с помощью бита D1 устанавливаем форму сигнала — синусоиду или треугольник. |
D4 | зарезервирован | Должен быть 0 |
D3 | DIV2 | DIV2 используется в связке с битом D5 (OPBITEN). Если DIV2 = 1, старший бит данных DAC (MSB) напрямую выводится на вывод VOUT. Если DIV2 = 0, на выводе VOUT формируется меандр MSB/2. |
D2 | зарезервирован | Должен быть 0 |
D1 | Mode | Этот бит работает вместе с битом OPBITEN. Если OPBITEN = 1, то бит mode должен быть установлен в 0, так как DAC отключен. Если OPBITEN = 0, то при mode = 0 на выходе синусоидальный сигнал, если mode = 1, то на выходе сигнал треугольной формы. |
D0 | зарезервирован | Должен быть 0 |
Настройка сна для AD9833
SLEEP1 | SLEEP12 | Описание |
0 | 0 | Работают все цепи микросхемы |
0 | 1 | DAC выключен |
1 | 0 | Отключено внутреннее тактирование. MCLK не работает. |
1 | 1 | Максимальная экономия энергии. Выключен DAC и MCLK. |
Пример библиотеки на STM32
Ниже представлен программный код, для обмена данными между STM32 и микросхемой DDS AD9833.
#include "AD9837.h" #include "spi.h" #include "math.h" #define LOW(x) (x & 0xFF) #define HIGH(x) ((x >> 8) & 0xFF) int32_t Freq; void SetFreqAD9837(int32_t freq) { __disable_irq(); Freq = calcDDSTuningWord(freq); sineWave(Freq); __enable_irq(); } int32_t calcDDSTuningWord(int32_t frequency) { // Частота кварца 16 Мгц int32_t FTW; // stepSize = 2^28 / 16 = 16.777216 float stepSize = 16.777216; FTW = stepSize * frequency; return FTW; } void sineWave(int32_t FTW) { uint32_t MSB; uint32_t LSB; uint32_t phase = 0; MSB = (uint32_t)((FTW & 0xFFFC000)>>14); //14 bits LSB = (uint32_t)(FTW & 0x3FFF); //Set control bits DB15 ande DB14 to 0 and one, respectively, for frequency register 0 LSB |= 0x4000; MSB |= 0x4000; phase &= 0xC000; //WriteRegister(0x2100); //sin //WriteRegister(0x2102); //triangle WriteRegister(0x2168); //square WriteRegister(LSB); //lower 14 bits WriteRegister(MSB); //upper 14 bits //WriteRegister(0xC001); //mid-low WriteRegister(0xC000); //Power it back up WriteRegister(0x2068); //square //WriteRegister(0x2000); //sin //WriteRegister(0x2002); //triangle } //Запись в регистр микросхемы AD9837 void WriteRegister(uint16_t dat) { uint8_t LL = (dat >> 8) & 0xFF; uint8_t HH = dat; SS_EN(); //Set FSYNC low HAL_SPI_Transmit(&hspi4,&LL,1,10); HAL_SPI_Transmit(&hspi4,&HH,1,10); SS_DIS(); //Set FSYNC high } void SS_EN(void) { HAL_GPIO_WritePin(CS_Sintezator_GPIO_Port, CS_Sintezator_Pin, 0); } void SS_DIS(void) { HAL_GPIO_WritePin(CS_Sintezator_GPIO_Port, CS_Sintezator_Pin,1); }