Приветствую, сегодня подключим и напишем код программы для синтезатора частоты на основе микросхемы AD9833. AD9833 - это программируемый генератор сигналов с низким энергопотреблением. Позволяет генерировать сигналы с частотой до 12МГц синусоидальной, треугольной и прямоугольной формы. Программирование осуществляется с использованием SPI интерфейса.
- Основные характеристики микросхемы:
- Цифровое программирование частоты и фазы.
- Потребляемая мощность 12.65 мВт при напряжении 3 В.
- Диапазон выходных частот от 0 МГц до 12.5 МГц.
- Разрешение 28 бит (0.1 Гц при частоте опорного сигнала 25 МГц).
- Синусоидальные, треугольные и прямоугольные выходные колебания.
- Напряжение питания от 2.3 В до 5.5 В.
- Интерфейс SPI.
- Расширенный температурный диапазон: от –40°C до +105°C.
- Опция пониженного энергопотребления.
AD9833 состоит из следующих основных частей: два регистра выбора частоты, аккумулятор фазы, два регистра выбора фазы и сумматор смещения фазы (вместе эти компоненты составляют генератор с цифровым управлением - NCO, SIN ROM для преобразования информации о фазе в амплитуду и 10-разрядный цифро-аналоговый преобразователь.
Из схемы видно, что данные с интерфейса SPI передаются в управляющий регистр, регистры выбора фазы и частоты. Именно они определяют сигнал на выходе генератора. И программирование генератора сводится к изменению содержимого указанных регистров. B AD9833 всем этим заведует 16-разрядный управляющий регистр. Схема из даташита демонстрирует структуру управления регистра и назначение битов:
Описание битов 16-разрядного управляющего регистра.
№ бита | Описание | 0 | бит зарезервирован и должен быть установлен в 0. | 1 | бит MODE вместе с битом OPBITEN управляют выходом генератора. При OPBITEN = 1 бит MODE должен быть установлен в 0. Значение MODE = 0 позволяет получить на выходе генератора синусоидальный сигнал. При MODE = 1 на выходе будет треугольный сигнал. | 2 | бит зарезервирован и должен быть установлен в 0. | 3 | бит DIV2 используется в паре со значением OPBITEN = 1. При DIV2 = 1 значение старшего значащего бита данных с входа ЦАП подается напрямую на выход VOUT. DIV2 = 0 позволяет задействовать делитель частоты и уменьшить частоту выходного сигнала вдвое. При OPBITEN = 0 значение данного бита игнорируется. | 4 | бит зарезервирован и должен быть установлен в 0. | 5 | бит OPBITEN вместе с битом MODE управляют выходом генератора. При OPBITEN = 1 внутренний ЦАП отключается от выхода VOUT и для генерации выходного сигнала используется значение старшего значащего бита с входа ЦАП, что позволяет получить на выходе генератора прямоугольные импульсы. | 6 | бит SLEEP12 отключает и включает внутренний ЦАП. Это может быть полезно для генерации прямоугольных импульсов, при которой не требуется выполнение цифро-аналоговых преобразований. При SLEEP12 = 0 внутренний ЦАП активен. SLEEP12 = 1 внутренний ЦАП не активен. |
7 | бит SLEEP1 управляет внутренним тактированием. При SLEEP1 =1 приостанавливается работа NCO и выход генератора остается в своем текущем состоянии. При SLEEP1 = 0 тактирование разрешено. | 8 | бит RESET = 1 сбрасывает внутренние регистры генератора в 0. Сброс не затрагивает регистры управления, частоты и фазы. | 9 | бит зарезервирован и должен быть установлен в 0. | 10 | бит PSELECT определяет, данные какого из регистров PHASE0 или PHASE1 добавляются к выходу аккумулятора фазы. | 11 | бит FSELECT определяет, какой из регистров используется в аккумуляторе фазы – FREQ0 или FREQ1. | 12 | бит HLB определяет, какая из частей регистра частоты (младшая или старшая) будет перезаписана. Используется при B28 = 0. При B28 = 1 значение этого бита игнорируется. HLB = 1 позволяет обновить старшие 14 бит регистра частоты; HLB = 0 позволяет обновить младшие 14 бит регистра частоты. |
13 | регистры частоты AD9833 имеют разрядность 28 бит, поэтому для изменения их содержимого требуется передача двух 16-битных слов. Однако в некоторых случаях требуется изменить только старшую или младшую часть регистра частоты. Здесь и используется данный признак: B28 = 1 говорит о том, что необходимо обновить регистр частоты целиком и его новое значение будет передано двумя последовательными записями. Первая запись содержит 14 младших бит, вторая 14 старших бит. Первые два бита в обеих записях определяют регистр частоты, в который будет записано передаваемое значение и должны быть одинаковыми. Обновление регистра частоты происходит после получения полного слова, поэтому запись промежуточного значения в регистр исключена. B28 = 0 позволяет обновить отдельно старшую или младшую часть регистра. Какая именно часть будет изменена определяется управляющим битом HLB. | 14, 15 | чтобы AD9833 понял, что принятое по SPI 16-битное слово содержит новое значение для управляющего регистра, два старших бита в слове должны быть установлены в 0. |
Генератор AD9833 имеет 2 регистра частоты и 2 регистра фазы разрядностью 28 бит и 12 бит соответственно.
Выбор активного регистра частоты осуществляется установкой управляющего бита FSELECT: при FSELECT = 0 активным является FREQ0; при FSELECT = 1 активен регистр FREQ1. Результирующая частота на выходе генератора определяется следующим образом:
(FMCLK / 228) * FREQREG
где FMCLK – это опорная частота, FREQREG – значение, загруженное в активный регистр частоты. Таким образом, если мы хотим получить на выходе генератора сигнал с частотой 400Гц при опорной частоте 25МГц, в активный регистр должно быть загружено значение:
FREQREG = FOUT*228 / FMCLK = 400Гц * 228 / 25МГц ≈ 4295
Для того чтобы загрузить значение FREQREG в регистр частоты необходимо, старшие биты передаваемого по SPI значения установить в 01 для загрузки в FREQ0 или 10 для загрузки в FREQ1. Напомню, что общение с AD9833 осуществляется по SPI 16-битными словами.
Фаза выходного сигнала определяется следующим образом:
(2π / 212) * PHASEREG
соответственно, значение для регистра фазы вычисляется по формуле:
PHASEREG = PHASE*212 / 2π
В приведенных формулах PHASEREG – это значение активного регистра фазы. Выбор активного регистра осуществляется установкой управляющего бита PSELECT: при PSELECT = 0 активным является PHASE0; при PSELECT = 1 активен регистр PHASE1. При записи нового значения в регистр фазы старшие биты должны быть установлены в 11, а выбор регистра, в который должно быть записано значение, осуществляется установкой бита 13: при нулевом его значении будет обновлен регистр PHASE0; при установке указанного бита в 1 будет обновлен регистр PHASE1. 12й бит не используется, а биты с 0 по 11 содержат значение для регистра фазы. Разрядность регистра частоты в 28 бит при опорной частоте 25МГц обеспечивает шаг 0.1Гц для установки частоты сигнала на выходе. А 12-битный регистр фазы обеспечивает разрешение 2π/4096.
Таблица с допустимыми комбинациями битов и формой сигналов на выходе.
OPBITEN | MODE | DIV2 | Сигнал на выходе VOUT | 0 | 0 | X | синусоидальный | 0 | 1 | X | треугольный | 1 | 0 | 0 | прямоугольный с частотой F/2 | 1 | 0 | 1 | прямоугольный с частотой F | 1 | 1 | X | зарезервирован |
Ну а теперь напишем тестовую программу в среде BASCOM AVR.
$Regfile = "m32def.dat" $Crystal = 16000000
SDATA alias portb.0 : Config SDATA = output SCLK alias portb.1 : Config SCLK = output FSYNC alias portb.2 : Config FSYNC = output : FSYNC = 1
const SINE = &h2000 '0010 0000 0000 0000 - Синусоидальный сигнал const SQUARE = &h2028 '0010 0000 0010 1000 - OPBITEN=1, DIV2=1 - Прямоугольный(MSB) const SQUARE2 = &h2020 '0010 0000 0010 0000 - OPBITEN=1 - Прямоугольный (MSB/2) const TRIANGLE = &h2002 '0010 0000 0000 0010 - MODE=1 - Треугольный
Send_AD9833 &h2108 '0010 0001 0000 0000 - Reset + DB28 + DAC_MSB Send_AD9833 &h4000 '0101 0000 1100 0111 - Freq0 LSB (0) Send_AD9833 &h4000 '0100 0000 0000 0000 - Freq0 MSB (0) Send_AD9833 &hC000 '1100 0000 0000 0000 - Phase0 (0) Send_AD9833 &h2000 '0010 0000 0000 0000 - Exit Reset
Do Set_Frec_AD9833 1 , SQUARE2 '0010 0000 0000 0000 - Синусоидальный сигнал wait 5 Set_Frec_AD9833 100 , TRIANGLE '0010 0000 0000 0010 - MODE=1 - Треугольный wait 5 Set_Frec_AD9833 100 , SQUARE '0010 0000 0010 1000 - OPBITEN=1, DIV2=1 - Прямоугольный (MSB) wait 5 Loop
End
Sub Send_AD9833(byval dat as word) FSYNC = 0 waitms 1 shiftout SDATA , SCLK , dat , 0 , 16 FSYNC = 1 End sub
Sub Set_Frec_AD9833(byval frequency as dword , byval form as word) local temps as single local correction as single local FREQ as long local MSB as word local LSB as word
'Формула по расчету выходной частоты: FREG = (Fout*2^28)/Mclk, где Fout - желаемая частота 'К примеру если ваш тактовый генератор будет Mclk = 25.0 МГц 'то коэффициент в формуле следует заменить на 2^28/25000000 = 1073/100
correction = 236 * frequency correction = correction / 1000000 'коррекция: 236 герц на каждый 1 МГц
If frequency > 3000000 then temps = frequency / 10 temps = temps - correction temps = temps * 1074 FREQ = temps / 10 else temps = frequency - correction 'FREQ =((Freq - correction) * 1074) / 100 temps = temps * 1074 FREQ = temps / 100 End if
LSB = FREQ and &h3FFF LSB = LSB or &h4000 '14 LSBs shift FREQ , right , 14 MSB = FREQ MSB = MSB or &h4000 '14 MSBs Send_AD9833 LSB Send_AD9833 MSB Send_AD9833 form
End sub |
|