Рассмотрим в данной статье как сделать генератор на 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);
}





Попробовал реализовать приведенный выше код на STM32F103C8T6, не работает. Сигнала на выходе модуля не наблюдается. Модуль рабочий, на Arduino работает.
Какие настройки SPI?