Ad9833 datasheet. AD9833: подробное руководство по использованию DDS-генератора сигналов

Как подключить и настроить AD9833 для генерации сигналов различной формы и частоты. Какие особенности имеет этот чип и как программировать его через SPI-интерфейс. На что обратить внимание при работе с AD9833 в проектах.

Обзор возможностей AD9833 как генератора сигналов

AD9833 — это программируемый генератор сигналов на основе технологии прямого цифрового синтеза (DDS). Он позволяет генерировать сигналы синусоидальной, треугольной и прямоугольной формы в широком диапазоне частот. Основные характеристики чипа:

  • Диапазон выходных частот: от 0 Гц до 12.5 МГц
  • Разрешение по частоте: 0.1 Гц при тактовой частоте 25 МГц
  • Формы сигнала: синус, треугольник, прямоугольник
  • Программирование через SPI-интерфейс
  • Низкое энергопотребление: 12.65 мВт при 3 В
  • Напряжение питания: 2.3-5.5 В

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


Подключение AD9833 к микроконтроллеру

Для работы с AD9833 его необходимо правильно подключить к управляющему микроконтроллеру. Типовая схема подключения включает следующие соединения:

  • VCC — напряжение питания 2.3-5.5 В
  • GND — общий провод
  • SDATA — линия данных SPI (подключается к MOSI)
  • SCLK — тактовая линия SPI
  • FSYNC — линия выбора устройства SPI (подключается к SS)
  • MCLK — вход тактового сигнала (обычно 25 МГц)
  • OUT — выход генерируемого сигнала

Важно обеспечить стабильное питание и правильное подключение линий SPI-интерфейса. Для надежной работы рекомендуется использовать развязывающие конденсаторы по питанию.

Программирование AD9833 через SPI

Управление AD9833 осуществляется путем записи 16-битных слов через SPI-интерфейс. Основные регистры для программирования:

  • Регистр управления — настройка режима работы
  • Регистры частоты (FREQ0 и FREQ1) — установка выходной частоты
  • Регистры фазы (PHASE0 и PHASE1) — установка начальной фазы

Для установки частоты необходимо рассчитать значение по формуле:


FREQ_REG = (desired_frequency * 2^28) / MCLK

Где FREQ_REG — 28-битное значение для записи в регистр частоты, MCLK — частота тактового сигнала.

Пример последовательности команд для установки частоты 1 кГц:


// Сброс
0x2100  
// Запись младших 14 бит частоты  
0x4000 | (FREQ_REG & 0x3FFF)
// Запись старших 14 бит частоты
0x4000 | ((FREQ_REG >> 14) & 0x3FFF)
// Выбор регистра FREQ0
0x2000

Генерация сигналов различной формы

AD9833 позволяет генерировать три основных типа сигналов:

  1. Синусоидальный — классическая синусоида
  2. Треугольный — симметричный треугольный сигнал
  3. Прямоугольный — меандр с частотой, равной 1/2 от заданной

Выбор формы сигнала осуществляется установкой соответствующих битов в регистре управления:

  • D1 = 0, D0 = 0 — синусоидальный
  • D1 = 0, D0 = 1 — треугольный
  • D1 = 1 — прямоугольный

Пример установки синусоидального сигнала:


// Сброс и выбор синусоиды
0x2000

Особенности работы на высоких частотах

При работе AD9833 на частотах выше 1 МГц необходимо учитывать ряд особенностей:


  • Снижение амплитуды выходного сигнала
  • Возможное искажение формы сигнала
  • Необходимость в качественной разводке платы
  • Важность стабильного тактового сигнала

Для получения качественного сигнала на высоких частотах рекомендуется:

  1. Использовать короткие сигнальные линии
  2. Обеспечить хорошую развязку по питанию
  3. Применять фильтрацию выходного сигнала
  4. Использовать качественный источник тактового сигнала

При соблюдении этих рекомендаций можно добиться генерации сигналов с приемлемым качеством вплоть до максимальной частоты 12.5 МГц.

Применение AD9833 в проектах

Благодаря своим возможностям, AD9833 находит применение во многих областях:

  • Генераторы тестовых сигналов
  • Синтезаторы частот в радиоаппаратуре
  • Системы сбора данных
  • Медицинское оборудование
  • Музыкальные синтезаторы

Пример использования AD9833 для создания простого функционального генератора:

  1. Подключение AD9833 к микроконтроллеру Arduino
  2. Написание программы управления через SPI
  3. Добавление пользовательского интерфейса (кнопки, дисплей)
  4. Реализация выбора частоты и формы сигнала

Такой генератор может быть полезен для тестирования и отладки различных электронных схем.


Сравнение AD9833 с другими генераторами сигналов

AD9833 имеет ряд преимуществ по сравнению с другими методами генерации сигналов:

ХарактеристикаAD9833 (DDS)Аналоговый генераторМикроконтроллер + ЦАП
Диапазон частот0 — 12.5 МГцОграниченНизкие частоты
Точность частотыВысокаяСредняяЗависит от МК
СтабильностьВысокаяСредняяВысокая
ЭнергопотреблениеНизкоеВысокоеСреднее
Простота использованияСредняяВысокаяНизкая

Как видно из сравнения, AD9833 обеспечивает оптимальное сочетание характеристик для многих применений.

Типичные ошибки при работе с AD9833

При использовании AD9833 разработчики часто сталкиваются со следующими проблемами:

  • Неправильная инициализация SPI
  • Ошибки в расчете значений для регистров частоты
  • Игнорирование особенностей работы на высоких частотах
  • Недостаточная фильтрация выходного сигнала
  • Проблемы с тактовым сигналом

Для избежания этих ошибок рекомендуется:


  1. Внимательно изучить документацию на AD9833
  2. Использовать отладочные средства (осциллограф, логический анализатор)
  3. Начинать с простых конфигураций и постепенно усложнять
  4. Проверять корректность записи в регистры
  5. Уделять внимание качеству монтажа и разводки платы

Соблюдение этих рекомендаций поможет избежать большинства типичных проблем при работе с AD9833.


DDS Генератор сигналов, модуль на AD9833 From 164.98 UAH

Production > Constructors and kits > Arduino > DDS Генератор сигналов, модуль на AD9833

Product id: 165074

Manufacturer:
Описание: Цифровое программирование частоты и фазы. Диапазон выходных частот от 0 МГц до 12,5 МГц. Разрешение 28 бит (0.1 Гц при частоте опорного сигнала 25 МГц). Синусоидальные, треугольные и прямоугольные выходные колебания. Напряжение питания от 2,3 В до 5,5 В. Трехпроводной интерфейс SPI

Тип: Шилд

on stock: 83 pcs

75 pcs — stock Kyiv
2 pcs — RADIOMAG-Kyiv
3 pcs — RADIOMAG-Lviv
1 pcs — RADIOMAG-Kharkiv
1 pcs — RADIOMAG-Odesa
1 pcs — RADIOMAG-Dnipro

1+ 200 UAH
10+ 185.6 UAH
100+ 164. 98 UAH

Technical description DDS Генератор сигналов, модуль на AD9833

With this product buy

Отсек для батарей 1*18650
Product id: 89096

Manufacturer: China
Batteries, Batteries Rechargeable > Battery Holders, Clips
Описание: Отсек для одной батарейки размера 18650

Назначение: 18650
Количество элементов: 1

1000 pcs — waiting 08.05.2023

1+ 34.5 UAH
10+ 30.8 UAH
Джойстик для Arduino
Product id: 104003

Manufacturer: Arduino
Constructors and kits > Arduino
Описание: Джойстик 2х осевой X/Y для создания различных интерфейсов управления, 2 аналоговых выхода и 1 цифровой (кнопка). Питание: 5V
Тип: Шилд кнопки

58 pcs — stock Kyiv
8 pcs — RADIOMAG-Kyiv
9 pcs — RADIOMAG-Lviv
6 pcs — RADIOMAG-Dnipro

10 pcs — waiting

1+ 40 UAH
10+ 33.8 UAH
100+ 27.68 UAH
Кабель USB для arduino Nano
Product id: 126436

Constructors and kits > Arduino
Описание: USB mini кабель для прошивки и питания Arduino Nano
Тип: Кабель для прошивки

46 pcs — stock Kyiv
12 pcs — RADIOMAG-Kyiv
10 pcs — RADIOMAG-Lviv
8 pcs — RADIOMAG-Kharkiv
43 pcs — RADIOMAG-Dnipro

1+ 42 UAH
10 kOhm 1% 0,25W 200V 1206 (RC1206FR-10KR-Hitano) (резистор SMD)
Product id: 387

Manufacturer: Yageo
Resistors SMD > 1206
Номинал: 10 kOhm
Точность: ±1% F
Рном,W: 0,25 W
Uраб,V: 200 V
Типоразмер: 1206

2595 pcs — RADIOMAG-Kyiv
2800 pcs — RADIOMAG-Lviv
2100 pcs — RADIOMAG-Odesa
3200 pcs — RADIOMAG-Dnipro
30000 pcs — waiting

100+ 0. 22 UAH
1000+ 0.16 UAH
10000+ 0.13 UAH
1N4148
Product id: 7711

Manufacturer: Yangjie
Diodes, Bridge Rectifiers > Superfast Diodes


Корпус: DO-35 (DO-204AH, SOD27)
Vrr, V: 100 V
Iav, A: 0,2 A
Время обратного восстановления Trr, ns: 8 ns
Примечание: 1N4448
Монтаж: THT

1 pcs — RADIOMAG-Kharkiv

available 1508313 pcs — show price and lead time

1+ 1.5 UAH
10+ 0.6 UAH
100+ 0.4 UAH
1000+ 0.3 UAH
Possible replacement
1N4448 (DO-35, Yangjie)
Product id: 20338
Possible replacement
1N4148
Product id: 176824

USB функциональный генератор на AD9833

Один из инструментов, без которого я бы пропал в своей домашней лаборатории, является функциональный генератор. Он довольно дорогой, поэтому я не купил его. Я подумал, что можно попытаться сделать его самостоятельно. Нашел довольно распространенную DDS (Direct Digital Synthesis, прямой цифровой синтез) микросхему AD9833. Теперь надо добавить только USB-совместимый AVR микроконтроллер и возможно немного аналоговых элементов.

Эта плата не обеспечивает регулировку амплитуды или смещения сигнала. Выход устанавливается 0-4В. Я планирую сделать ещё одну полностью аналоговую плату для регулировки амплитуды и смещения.

Элементы

Неотъемлемой частью этой конструкции является DDS микросхема AD9833 от Analog Devices. Микросхема имеет входной тактовый сигнал 25 МГц, внутреннюю фазовую автоподстройку частоты, таблица поиска синусов и АЦП. Контролируя её по интерфейсу SPI, вы можете получить на выходе синусоидальный, пилообразный и прямоугольный сигнал с частотным диапазоном от 0,01 Гц до 3 МГц. Частота может быть выше, до ~7 МГц, но на такой высокой частоте синусоидальный сигнал выглядит ужасно.

Для управления этой микросхемой, я использовал дешевый USB-совместимый AVR микроконтроллер Atmel AT90USB162. Он будет обеспечивать виртуальный последовательный интерфейс по USB и интерпретировать команды переданные по этому интерфейсу для изменения выходного сигнала DDS надлежащим образом.

OPA357 используется для усиления выходного сигнала DDS. Номинальное напряжение на выходе AD9833 0.6Vpp, со средним значение 0.3В. OPA357 была выбрана потому, что она поддерживает необходимые высокие частоты и её можно получить в качестве бесплатного образца от компании Texas Instruments.

Схема

Схема и печатная платы были разработаны в KiCad, довольно приличном EDA (EDA, автоматизация проектирования электронных приборов) с открытым исходным кодом. Здесь приведены некоторые части схемы. Если вас интересует более подробная схема, её можно скачать ниже в формате PDF.

Устройство может питаться или от USB, или от отдельного источника +5В. Два диода Шоттки установлены, чтобы напряжения нашли друг на друга, если они поступаю из обоих входов.

Схема построена на DDS AD9833. Блокировочные конденсаторы и их номиналы взяты из даташита. Источник тактового сигнала может быть выбран при помощи JP1. Может использоваться встроенный генератор и внешний источник тактового сигнала через BNC разъем. Выход из DDS сначала проходит через ФНЧ и затем усиливается. На выходе есть резистор 50 Ом, чтобы обеспечить выходное сопротивление 50 Ом. По всему пути прохождения сигнала есть контрольные точки, что обеспечивает удобство тестирования.

Печатная плата

Разводка довольно проста. Вот скриншот платы в 3D-виде KiCad:

Вы можете видеть BNC разъем для подачи внешнего тактового сигнала на этом скриншоте, но у меня не было необходимости его припаивать.

Я разработал плату для использования генератора для поверхностного монтажа, но у меня не было генератора нужной частоты. У меня был подходящий генератор в DIP корпусе, поэтому я припаял его к плате так:

Немного некрасиво, но работает не хуже.

У меня также была небольшая ошибка в оригинальной разводке.  VUSB контакт AVR должен быть подключен к источнику питания, а не к USB VUSB. В таком случае, если я питаю устройство от внешнего источника, USB периферия все равно получает питание и может инициализироваться. Перерезать дорожку и припаять перемычку достаточно, что бы исправить это. К статье прилагается исправленная версия платы.

Протокол

Плата подключена к компьютеру через виртуальный последовательный порт по USB. Должен быть стандартный способ обмена информацией, поэтому я написал простой стандарт перед тем, как я начал писать код. Я решил использовать ASCII для включения человека при написании команд во время тестирования и для облегчения отладки и читабельности кода.

sf1 [freq] #в Гц
sf2 [freq] #в Гц
sp1 [phase] #в градусах
sp2 [phase] #в градусах
sfo [1/2/m(modulation)] #frequency output
spo [1/2/m(modulation)] #phase output
so [o(off-выключен)/s(sine-синусоида)/t(triangle-треугольник)/q(square-прямоугольный сигнал)] #режим выхода
sm [freq] #частота модуляции

Все команды должны заканчиваться возвратом каретки-новой строкой.

Так например, для установки выходной частоты от 1 до 100 Гц, вы должны отправить «sf1 100 \r\n».

Программа для AVR

Функциональность USB была предоставлена ​​отличной LUFA USB библиотекой для микроконтроллеров AVR. Я повторил код, который я написал, прежде чем обмениваться информацией по SPI и относительно функциональную библиотеку для AD9833. Потом я написал код, преобразовывающий команды, посылаемые через последовательный интерфейс в обращение к функции библиотеки AD9833.

Я получил проблему, используя Doxygen для комментирования своего кода и создания документации. Подробнее об этом можно узнать, перейдя по ссылке.

Программное обеспечение для ПК

Программное обеспечение написано на Python3. Я начал изучать его пару месяцев назад и до сих пор использую его для создания простых интерфейсов. Я использовал графическую основу tkinter для создания графического интерфейса пользователя и pyserial для последовательного соединения. Код пользовательского интерфейса не очень хорош, я ещё не совсем разобрался с Python. Это прекрасный язык, но я предпочитаю работать с микроконтроллерами и писать код на С.

Пользовательский интерфейс оказался весьма хорошим и хорошо работающим. Есть некоторые вещи, которые я хотел-бы сделать по-другому. Например, выбор модуляции выходного сигнала должен иметь собственные кнопки. Если бы я хотел добавить кнопку сдвига амплитуды, то её было бы просто некуда поставить. Возможно, я попытаюсь разместить её где то.

Работа очень проста: приложение просто посылает соответствующие команды на виртуальный последовательный порт USB, когда любое значение изменяется в пользовательском интерфейсе.

Результат

Я снял короткое видео, демонстрирующее работу функционального генератора. Кажется, он работает довольно хорошо!

Проект на github, документация для AVR-кода

Список радиоэлементов
ОбозначениеТипНоминалКоличествоПримечаниеМагазинМой блокнот
U2МК AVR 8-бит

AT90USB162

1Поиск в магазине ОтронВ блокнот
U3Программируемый генераторAD98331Поиск в магазине ОтронВ блокнот
U1Линейный регулятор

LM1117-N

1Поиск в магазине ОтронВ блокнот
U4Операционный усилитель

OPA357

1Поиск в магазине ОтронВ блокнот
X1Кварцевый резонатор?1Поиск в магазине ОтронВ блокнот
X2Генератор?1Поиск в магазине ОтронВ блокнот
D1, D2Диод Шоттки?2Поиск в магазине ОтронВ блокнот
D3, D4Светодиод2Поиск в магазине ОтронВ блокнот
С1-С3Конденсатор1 мкФ3Поиск в магазине ОтронВ блокнот
C4Электролитический конденсатор4. 7 мкФ1Поиск в магазине ОтронВ блокнот
C5, C7, C12-C15Конденсатор100 нФ6Поиск в магазине ОтронВ блокнот
C6Электролитический конденсатор10 мкФ1Поиск в магазине ОтронВ блокнот
C9Конденсатор?1Поиск в магазине ОтронВ блокнот
C10, C11Конденсатор22 пФ2Поиск в магазине ОтронВ блокнот
R1, R3Резистор

22 Ом

2Поиск в магазине ОтронВ блокнот
R2, R7Резистор

20 кОм

2Поиск в магазине ОтронВ блокнот
R4Резистор

10 кОм

1Поиск в магазине ОтронВ блокнот
R5, R9, R11Резистор

1 кОм

3Поиск в магазине ОтронВ блокнот
R6Резистор?1Поиск в магазине ОтронВ блокнот
R8Резистор

150 кОм

1Поиск в магазине ОтронВ блокнот
R10, R12Резистор

50 Ом

2Поиск в магазине ОтронВ блокнот
J1РазъёмMini USB1на платуПоиск в магазине ОтронВ блокнот
P2, P5РазъёмBNC2на платуПоиск в магазине ОтронВ блокнот
JP1РазъёмPLS-3R1для перемычкиПоиск в магазине ОтронВ блокнот
CON1РазъёмPLD-61ISPПоиск в магазине ОтронВ блокнот
P1Разъём2 контакта1питаниеПоиск в магазине ОтронВ блокнот
P3РазъёмPLS-81Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Оригинал статьи

Теги:
  • DDS
  • USB
  • Микроконтроллер
  • AVR
  • Kicad
  • Перевод

#148 Базовый демонстрационный цикл AD9833

Запустите демонстрацию базовой формы сигнала с модулем AD9833

Примечания

Я купил Модуль AD9833 от продавца на aliexpress с намерением использовать его для создания генератора функций, чтобы добавить его в мою коллекцию тестового оборудования.

Этот проект является первым тестом для изучения:

  • протокол SPI, который он поддерживает
  • различных сигналов, которые он может произвести
  • управление частотой

Заключение:

  • Как только вы правильно настроите SPI, он будет работать очень хорошо, и им очень легко управлять.
  • точность на частотах менее 1 МГц или около того очень хорошая
  • Точность
  • выше 1 МГц неубедительна .. Мне нужно провести еще несколько испытаний

Интерфейс модуля

Вот модуль с припаянными пинами (с моей несовершенной пайкой, так что не вините производителя!):

Немного необычная маркировка контактов. Вот определение контактов и то, как они подключаются к Arduino Uno для аппаратного SPI:

Штифт Использование SPI-контакт Arduino
ВКЦ от 2,3 В до 5,5 В  
ДГНД цифровая земля  
SDATA Данные SPI (MOSI) 11 МОСИ
СКЛК Часы SPI 13 ССК
ФСИНХР Выбор подчиненного устройства SPI (SS) 10 нержавеющая сталь
АГНД аналоговая земля  
ВЫХОД выходной сигнал  

Примечание: «аналоговая земля» внутренне связана с «цифровой землей» в соответствии с электрической схемой модуля.

Особенности SPI

Модуль работает в SPI_MODE2 с MSBFIRST:

  • данные сдвинуты по заднему фронту
  • На выводе FSYNC активен низкий уровень,
  • сначала принимает старший бит (MSB) каждой передачи.
  • Также указано, что вывод SCLK должен оставаться высоким, когда он не используется

Демонстрационная форма сигнала

Сценарий BasicDemoCycle.ino представляет собой простую неинтерактивную демонстрацию, которая работает с различными сигналами.

Он использует новый синтаксис SPI.beginTransaction/SPI.endTransaction, хотя, поскольку сценарий работает только с одним устройством SPI, излишне оборачивать каждую последовательность команд в транзакцию. Но это хороший тест на «правильный способ сделать это». NB: многие другие сценарии, найденные в сети, предшествуют этому синтаксису.

Он работает на очень низких частотах для создания визуальной демонстрации. Он отправляет измеренный сигнал на последовательный порт. LEAP#090 PlotNValues ​​(простой скетч Processing) считывает данные из последовательного порта и отображает выходное значение в зависимости от времени с некоторыми эффектами окраски, добавленными для наглядности.

Вот пример трассировки. Он показывает несколько циклов каждой формы волны. Слева:

  • синусоида
  • прямоугольная волна (нормальное время цикла)
  • треугольная волна
  • прямоугольная волна (время цикла уменьшено вдвое, т.е. в два раза быстрее)
  • выход выключен

Обратите внимание, что прямоугольные сигналы являются рельсовыми, поскольку они обходят ЦАП. Согласно техническому описанию, пик других сигналов составляет 0,65 В.

Точность частоты?

Несколько быстрых измерений частотомером дали очень хорошие результаты на частотах ниже нескольких МГц. Но когда я начал работать в диапазоне 6–12,5 МГц, точность заметно упала.

Это может быть просто следствием запуска модуля на макетной плате. Надо попробовать на печатной плате.

А пока вот некоторые результаты (трассы осциллографа со связью по переменному току) с синусоидальной формой волны в макете.

На частоте 1 МГц все еще приличный выход:

На частоте 8 МГц форма сигнала сильно искажена и нестабильна, но все еще находится на частоте:

На частоте 12 МГц он превратился в сильно модулированный беспорядок:

Строительство

NB: я создал Пользовательская часть Fritzing доступна здесь для этих диаграмм.

Работает на частоте 300 кГц, довольно точно!

Кредиты и ссылки

  • Спасибо Микаэлю по электронной почте за идею «выключить» шаг в демонстрационном цикле
  • Модуль от продавца на aliexpress
  • Технический паспорт AD9833
  • Ссылка на Arduino SPI
  • Отправка правильных сигналов — информативный обзор различных модулей генератора сигналов
  • Почтовый ящик Джулиана: №41 — Генератор сигналов AD9833 — мое вдохновение попробовать это устройство!
  • Генератор сигналов AD9833 — хорошее описание проекта
  • Генерация сигналов с помощью AD9833 и SPI — еще несколько полезных деталей
  • Интерфейс

— Как я понимаю связь AD9833 SPI с использованием Python с моей малиной?

Эту задачу можно разделить на несколько подзадач.

  1. Значения для отправки
  2. Значения последовательности отправлены в
  3. Как значения передаются через SPI

Как указал SamMaster, есть примечания по применению от Analog Devices, в которых показана последовательность значений, которые необходимо отправить, чтобы установить частоту на 400 Гц

https://www.analog.com/media/en/technical-documentation/application-notes/AN-1070.pdf

Они суммируют пять значений для отправки и в каком порядке в следующей таблице:

Если я посмотрю на код, написанный SamMaster, он запишет правильные значения в правильном порядке (у меня нет оборудования, но я могу распечатать значения).

 отправка: [0x21, 0x00]
отправка: [0x50, 0xc7]
отправка: [0x40, 0x00]
отправка: [0xc0, 0x00]
отправка: [0x20, 0x00]
 

Остается только пункт 3, вызывающий проблемы.

Тот факт, что вы получаете изменения, происходящие на оборудовании, предполагает, что происходит какой-то обмен данными, но не правильные значения.

Глядя на ограниченную документацию на https://pypi.org/project/spidev/, можно увидеть две возможные команды: xfer или xfer2 .

Разница между ними заключается в значении вывода выбора микросхемы между блоками.

Рисунок 4 в техническом паспорте, я думаю, говорит о том, что выбор микросхемы не должен быть освобожден между двумя байтами.

https://www.analog.com/media/en/technical-documentation/data-sheets/ad9833.pdf

Это предполагает, что для отправки блоков следует использовать xfer2 , а не xfer , как это сделал SamMaster. Хотя SamMaster, кажется, предполагает, что он заработал с xfer , и вы смогли успешно установить значение на 400 Гц. Вам понадобится ваш анализатор области/логики, чтобы увидеть, правильно ли работает GPIO на оборудовании.

На каком-то этапе разработки вы, похоже, изменили последовательность отправляемых значений. Должно быть:

 send_data(0x2100) # Старт
send_data(LSB) # Частота 14 бит (LSB)
send_data(MSB) # Частота 14 бит (MSB)
send_data(phase) # Значение фазы
send_data(0x2000) # Конец
 

Это может быть еще одним источником вашей ошибки.

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

 Для частоты: 400
Установка частоты: 4295 = 0x10c7 = 0001000011000111
        send_data (0x2100)
        send_data (0x50c7)
        send_data (0x4000)
        send_data (0xc000)
        send_data (0x2000)
Для частоты: 500
Установка частоты: 5369= 0x14f9 = 0001010011111001
        send_data (0x2100)
        send_data (0x54f9)
        send_data (0x4000)
        send_data (0xc000)
        send_data (0x2000)
Для частоты: 600
Установка частоты: 6442 = 0x192a = 0001100100101010
        send_data (0x2100)
        send_data (0x592a)
        send_data (0x4000)
        send_data (0xc000)
        send_data (0x2000)
Для частоты: 1000
Установка частоты: 10737 = 0x29f1 = 0010100111110001
        send_data (0x2100)
        send_data (0x69f1)
        send_data (0x4000)
        send_data (0xc000)
        send_data (0x2000)
 

И, наконец, я провел рефакторинг кода, чтобы упростить тестирование различных частей кода. Я разделяю его здесь для вашей информации. Мне пришлось закомментировать все части связи spi, потому что у меня нет аппаратного обеспечения.

 время импорта
импорт спидев
# активируем модуль spidev и настройки SPI
автобус = 0
устройство = 1
spi = spidev.SpiDev()
spi.open(шина, устройство)
spi.max_speed_hz = 976000
определение выходной_частоты (hz_value):
 вернуть целое число (раунд ((hz_value * 2 ** 28) / 25e6))
определение freq_change_start():
 ctrl_reg = 0
 ctrl_reg += 2**13 # установить DB13 (28-битная частота)
 ctrl_reg += 2**8 # установить DB8 (сброс)
 вернуть ctrl_reg
определение freq_reg_lsb (freq_reg):
 четырнадцать_бит_маск = 0b0011111111111111
 значение_записи = 0
 write_value += 2**14 # установить DB14
 lsb = freq_reg и четырнадцатибитная_маска
 write_value += младший бит
 вернуть значение_записи
определение freq_reg_msb (freq_reg):
 четырнадцать_бит_маск = 0b0011111111111111
 значение_записи = 0
 write_value += 2**14 # установить DB14
 msb = freq_reg >> 14 & четырнадцатибитная_маска
 write_value += старший бит
 вернуть значение_записи
определение фазы_регистра():
 # В настоящее время всегда одно и то же значение
 значение_записи = 0
 # Установить адрес фазового регистра
 write_value += 2 ** 15 # установить DB15
 write_value += 2 ** 14 # установить DB14
 вернуть значение_записи
определение freq_change_end():
 ctrl_reg = 0
 ctrl_reg += 2**13 # установить DB13 (28-битная частота)
 вернуть ctrl_reg
определение word_split (word16):
 tx_msb = слово16 >> 8
 tx_lsb = слово16 и 0xFF
 вернуть tx_msb, tx_lsb
защита send_spi_sequence (последовательность):
 для слова 16 последовательно:
 two_bytes = слово_разделить (слово16)
 print(f"\tsending:[{two_bytes[0]:#02x}, {two_bytes[1]:#02x}]")
 печать(f"\tsend_data({word16:#06x})")
 spi. xfer(два_байта)
 # spi.xfer2(two_bytes)
определение change_freq (freq_hz):
 # Расчетные значения для отправки
 print("Для частоты:", freq_hz)
 freq_reg = выходная_частота (частота_Гц)
 print(f"Настройка частоты: {freq_reg} = {freq_reg:#04x} = {freq_reg:016b}")
 ctrl_start = freq_change_start()
 print(f"Регистр управления записью: {ctrl_start:#04x}")
 lsb_value = freq_reg_lsb(freq_reg)
 print(f"значение младшего бита: {значение_меньшего бита:#04x}")
 msb_value = freq_reg_msb(freq_reg)
 print(f"значение младшего бита: {msb_value:#04x}")
 Phase_reg = Phase_register ()
 print(f"Запись регистра фаз: {phase_reg:#04x}")
 ctrl_end = freq_change_end()
 print(f"Регистр управления записью: {ctrl_end:#04x}")
 # Записываем значения в spi
 send_spi_sequence([ctrl_start, lsb_value, msb_value, Phase_reg, ctrl_end])
деф основной():
 show_freq_for = 20
 change_freq(400)
 time.sleep (show_freq_for)
 change_freq(500)
 time.sleep (show_freq_for)
 change_freq(600)
 time.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *