It is currently Wed Oct 17, 2018 3:41 am

НИЛ АСЭМ Научно - исследовательская лаборатория автоматизированных систем экологического мониторинга

Программируемый генератор колебаний на AD9833

by Admin » Wed Feb 28, 2018 9:21 am


Пример работы генератора (видео Tuomas Nylund).

Основные характеристики микросхемы:

• Программируемая через цифровой интерфейс частота и фаза.
• Низкое энергопотребление: 12.65 мВт при напряжении питания 3V.
• Диапазон выходной частоты от 0 до 12.5 МГц.
• 28-битная разрешающая способность по частоте: 0.1 Гц при опорной частоте тактов 25 МГц.
• Форма выходного сигнала может быть синусоидальная, треугольная и прямоугольная.
• Диапазон напряжений питания от 2.3 до 5.5V.
• Не требуется внешних компонентов (почти).
• 3-проводный интерфейс SPI.
• Расширенный температурный диапазон -40°C .. +105°C.
• Возможность выключения (Power-down).
• 10-выводный корпус типа MSOP.
• Дизайн рассчитан на мобильные, автономные приложения.

Области применения:

• Генерация сигналов и тактовых частот, генераторы качающейся частоты.
• Системы измерения потока жидкости и газа.
• Приложения сенсоров: сближение, движение, дефектоскопия.
• Потеря линии / подстройка под параметры линии.
• Оборудование тестирования, медицина.
• Приложения временной доменной рефлектометрии (Time domain reflectometry, TDR).

Микросхема AD9833 это программируемый генератор сигналов с низким потреблением тока, который может генерировать сигнал синусоидальной, треугольной и прямоугольной формы. Генерация сигнала определенной формы требуется для разных типов реализаций датчиков, актуаторов, приложений TDR. Выходная частота и фаза программируется под управлением внешнего микроконтроллера, что упрощает настройку генерации. Для запуска микросхемы в работу почти не требуется внешних компонентов (кроме внешнего генератора опорных тактов и блокирующих фильтрующих конденсаторов). Регистры частоты имеют разрядность 28 бит: при тактовой частоте 25 МГц может быть достигнута дискретность установки частоты 0.1 Гц; с тактовой частотой 1 МГц может быть достигнута дискретность 0.004 Гц.

Параметры записываются в AD9833 через 3-проводный последовательный интерфейс (SPI). Этот последовательный интерфейс может работать на частотах до 40 МГц, и он хорошо подходит для подключения к любому DSP и микроконтроллеру. Микросхема может работать от напряжения источника питания 2.3 .. 5.5V.

Image
Рис. 1. Функциональная блок-диаграмма AD9833.

Теория функционирования

Синусоидальные сигналы обычно представляют с точки зрения их амплитуды: a(t) = sin(ωt). Однако эти синусоидальные сигналы нелинейны, и их непросто генерировать, кроме как строить по кусочкам. С другой стороны, угловая информация по своей природе линейна. Таким образом, для определенной частоты угол фазы поворачивается на фиксированный угол для каждой единицы времени. Скорость изменения угла зависит от частоты сигнала по традиционному соотношению ω = 2πf.
Image
Рис. 2. Синусоидальный сигнал и закон изменения его фазы.

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

ΔPhase = ωΔt

Угол ω вычисляется как

ω = ΔPhase/Δt = 2πf

Если вычислить f и подставить опорную частоту для опорного периода (1/fMCLK = Δt), то получится формула

f = ΔPhase * fMCLK / 2π

AD9833 строит свой выходной сигнал на основе этого простого выражения. Простой чип DDS может реализовать это выражение тремя основными промежуточными узлами: управляемый через через цифровой интерфейс генератор (numerically controlled oscillator, NCO) и модулятор фазы, ПЗУ синуса (SIN ROM) и цифро-аналоговый преобразователь (digital-to-analog converter, DAC).

Управляющий код для микроконтроллера:

Code: Select all
Device = 16F877

XTAL = 20

Symbol DPin PORTC.4 'Data port DDS 1
Symbol CPin = PORTC.3 'Clock port DDS 1
Symbol DDS_CE1 = PORTC.2 'Chip Enble DDS 1
Symbol DDS_CE2 = PORTC.1 'Chip Enble DDS 2

Output DDS_CE1 'Sets Pin to an Output
Output DDS_CE2 'Sets Pin to an Output


Dim Frequency As DWord 'Desired Frequency
Dim DDS_OP As Float 'DDS Output
Dim FTW As DWord 'Frequency Tunning word
Dim FTWLSB As FTW.WORD0 'First word LSB of the Frequency tuning word
Dim FTWMSB As FTW.WORD1 'Second word MSB of the Frequency tuning word
Dim FTWLSB1 As Word '
Dim DDS_Chip As Byte 'Selects DDS chip DDS1 = 1, DDS2 = 2
Dim DDS_Waveform As Byte 'Select Waveforms Type Sine = 1, Triangle = 2, Square = 3 (TTL)
Dim DDS_Control_Register As Word
Dim Freq_Reg As Bit 'Selects Frequency Register REG0 or REG1

Dim var1 As Byte
Dim key As Byte

'KEYPAD_PORT PORTB
Include "proton_4.inc"
Cls

'Initialise DDS1
DDS_CE1 = 0 'Activate DDS (Set Chip Enable Low)
SHOut DPin,CPin,5, [$2100\16] 'Apply Reset
SHOut DPin,CPin,5, [$2000\16] 'Remove reset
DDS_CE1 = 1 'Disable DDS (Set Chip Enable High)

'Initialise DDS2
DDS_CE2 = 0 'Activate DDS (Set Chip Enable Low)
SHOut DPin,CPin,5, [$2100\16] 'Apply Reset
SHOut DPin,CPin,5, [$2000\16] 'Remove reset
DDS_CE2 = 1 'Disable DDS (Set Chip Enable High)

DDS_Control_Register = $2100
DDS_Chip = 1

loop:
key = ""
var1 = InKey
key = LookUp var1,["1","2","3","A","4","5","6","B","7","8","9","C ","* ","0","#","D"]
Print At 1,1,key,

Select key

Case "1"
Print At 1,6,"Button 1"
Frequency = 1000 'Sets Desired Output Frequency
DDS_Waveform = 1 'Sets waveform type
Freq_Reg = 0 'Point to which register
DDS_Chip = 2 'DDS Chip 1

GoSub FTW_CALC:

Case "2"
Print At 1,6,"Button 2"
Frequency = 2000 'Sets Desired Output Frequency
DDS_Waveform = 1 'Sets waveform type
Freq_Reg = 0 'Point to which register
DDS_Chip = 2 'DDS Chip 1

GoSub FTW_CALC

Case "3"
Print At 1,6,"Button 3"
Frequency = 1000 'Sets Desired Output Frequency
DDS_Waveform = 1 'Sets waveform type
Freq_Reg = 1 'Point to which register
DDS_Chip = 2 'DDS Chip 1

GoSub FTW_CALC

Case "4"
Print At 1,6,"Button 4"
Frequency = 2000 'Sets Desired Output Frequency
DDS_Waveform = 1 'Sets waveform type
Freq_Reg = 1 'Point to which register
DDS_Chip = 2 'DDS Chip 1

GoSub FTW_CALC

Case "5"
Print At 1,6,"Button 5"
Frequency = 1000 'Sets Desired Output Frequency
DDS_Waveform = 3 'Sets waveform type
Freq_Reg = 1 'Point to which register
DDS_Chip = 2 'DDS Chip 2

GoSub FTW_CALC

Case "6"
Print At 1,6,"Button 6"
Frequency = 1000 'Sets Desired Output Frequency
DDS_Waveform = 1 'Sets waveform type
Freq_Reg = 1 'Point to which register
DDS_Chip = 2 'DDS Chip 2

GoSub FTW_CALC

Case "7"
Print At 1,6,"Button 7"
Frequency = 2000 'Sets Desired Output Frequency
DDS_Waveform = 1 'Sets waveform type
Freq_Reg = 1 'Point to which register
DDS_Chip = 2 'DDS Chip 2

GoSub FTW_CALC

Case "8"
Print At 1,6,"Button 8"
Frequency = 2500 'Sets Desired Output Frequency
DDS_Waveform = 2 'Sets waveform type
Freq_Reg = 1 'Point to which register
DDS_Chip = 2 'DDS Chip 2

GoSub FTW_CALC

Case "9"
Print At 1,6,"Button 9"
Case "0"
Print At 1,6,"Button 0"
Case "A"
Print At 1,6,"Button A"
Case "B"
Print At 1,6,"Button B"
Case "C"
Print At 1,6,"Button C"
Case "D"
Print At 1,6,"Button D"
Case "*"
Print At 1,6,"Button *"
Case "#"
Print At 1,6,"Button #"

Case Else
Cls
Print At 2,1, "No Button Press"
RSOut "hello"

EndSelect

GoTo loop

FTW_CALC: 'Calculates Frequency tuning words

DDS_OP = Frequency/0.03725290298 'Equation to produce DDS tuning word Master CLK / 2pwr28

'Extract LSB Tuning Word
FTW = DDS_OP 'DDS_OP (Float) = Freq tuning word (Dword) << bit shift doesn't work with float
FTWLSB1 = FTWLSB 'Extract LSB and put it in LSB1

'Extract MSB tuning word
FTW = FTW << 2 'Shift Bits Left twice

ProgrammeDDS:

Select Freq_Reg

Case 0
FTWLSB1.15 = 0 'Set LSB bit 15 & 14 to 01 (Code to write to DDS Freq Reg 0)
FTWLSB1.14 = 1
FTWMSB.15 = 0 'Set MSB bit 15 & 14 to 01 (Code to write to DDS Freq Reg 0)
FTWMSB.14 = 1
DDS_Control_Register.11 = 0 ' Tells DDS to use Frequency Register 0
Case 1
FTWLSB1.15 = 1 'Set LSB bit 15 & 14 to 10 (Code to write to DDS Freq Reg 1)
FTWLSB1.14 = 0
FTWMSB.15 = 1 'Set MSB bit 15 & 14 to 10 (Code to write to DDS Freq Reg 1)
FTWMSB.14 = 0
DDS_Control_Register.11 = 1 ' Tells DDS to use Frequency Register 1
EndSelect

Select DDS_Waveform 'Sets the control register code to produce coressponding waveforms

Case 1 'Sine
DDS_Control_Register.5 = 0 :DS_Control_Register.1 = 0
Case 2 'Triangle
DDS_Control_Register.5 = 0 :DS_Control_Register.1 = 1
Case 3 'Square
DDS_Control_Register.5 = 1 :DS_Control_Register.1 = 0 :DS_Control_Register.3 = 1
EndSelect

Select DDS_Chip

Case 1 'Programmes DDS 1

DDS_CE1 = 0 'Activate DDS (Set Chip Enable Low)
SHOut DPin,CPin,5, [FTWLSB1\16] 'Set Frequency
SHOut DPin,CPin,5, [FTWMSB\16]
DDS_Control_Register.8 = 0 'Removes reset from DDS chip
SHOut DPin,CPin,5, [DDS_Control_Register\16] 'Writes to Control Register removing reset
DDS_CE1 = 1 'Disable DDS (Set Chip Enable High)

Case 2 'Programmes DDS 2

DDS_CE2 = 0 'Activate DDS (Set Chip Enable Low)
SHOut DPin,CPin,5, [FTWLSB1\16] 'Set Frequency
SHOut DPin,CPin,5, [FTWMSB\16]
DDS_Control_Register.8 = 0 'Removes reset from DDS chip
SHOut DPin,CPin,5, [DDS_Control_Register\16] 'Writes to Control Register removing reset
DDS_CE2 = 1 'Disable DDS (Set Chip Enable High)

EndSelect

GoTo loop
End


Литература

1. Фирменная документация (даташит) от Analog Devices.
2. Проект Tuomas Nylund с PCB (для AVR).


На главную
Admin
Site Admin
 
Posts: 203
Joined: Wed Sep 20, 2017 9:55 am

Return to Промежуточные исследования и разработки

cron

User Menu

Login