Dds-генератор синусоидального сигнала

DDS-генератор синусоидального сигнала

В данном проекте рассмотрим изготовление генератора синусоидального сигнала при помощи метода прямого синтеза (DDS-метод). Для реализации этого проекта нам не потребуется какого-либо дополнительного оборудования кроме самого контроллера Arduino.

Частотный диапазон генератора от 0 до 16 кГц, с точностью до 1 мкГц! Данное устройство может пригодится не только для генерирования звуковых сигналов, но в тестовом и измерительном оборудовании радиолюбителя.

Например в телекоммуникационном оборудовании DDS генератор можно использовать для ЧМ и ФМ модуляции (FSK и PSK).

DDS-метод

В программной части проекта, для реализации DDS метода, нам понадобится 4 вещи: аккумулятор и tuning word, который в нашем случае состоит из двух long integer переменных; таблица значений синусоидального сигнала (один период); цифро-аналоговый преобразователь, который обеспечивается внутренним ШИМ Arduino (analogWrite); генератор тактовых импульсов (используем внутренний hard-таймер от ATMega).

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

Программное обеспечение

Для работы данного скетча на Arduino Diecimila или Duemilenove подключите потенциометр к аналоговому выводу 0 и к GND и +5В. Выход генератора находится на выводе 11, куда вы можете подключить активные колонки, или ФНЧ фильтр описанный ниже.

/* * * DDS Sine Generator mit ATMEGS 168 * Timer2 generates the 31250 KHz Clock Interrupt * * KHM 2009 / Martin Nawrath * Kunsthochschule fuer Medien Koeln * Academy of Media Arts Cologne */ #include “avr/pgmspace.h” // table of 256 sine values / one sine period / stored in flash memory
PROGMEM prog_uchar sine256[] = { 127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240, 242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223, 221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78, 76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31, 33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124 };
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) int ledPin = 13; // LED pin 7
int testPin = 7;
int t2Pin = 6;
byte bb; double dfreq;
// const double refclk=31372.549; // =16MHz / 510
const double refclk=31376.6; // measured // variables used inside interrupt service declared as voilatile
volatile byte icnt; // var inside interrupt
volatile byte icnt1; // var inside interrupt
volatile byte c4ms; // counter incremented all 4ms
volatile unsigned long phaccu; // pahse accumulator
volatile unsigned long tword_m; // dds tuning word m void setup()
{ pinMode(ledPin, OUTPUT); // sets the digital pin as output Serial.begin(115200); // connect to the serial port Serial.println(“DDS Test”); pinMode(6, OUTPUT); // sets the digital pin as output pinMode(7, OUTPUT); // sets the digital pin as output pinMode(11, OUTPUT); // pin11= PWM output / frequency output Setup_timer2(); // disable interrupts to avoid timing distortion cbi (TIMSK0,TOIE0); // disable Timer0 !!! delay() is now not available sbi (TIMSK2,TOIE2); // enable Timer2 Interrupt dfreq=1000.0; // initial output frequency = 1000.o Hz tword_m=pow(2,32)*dfreq/refclk; // calulate DDS new tuning word }
void loop()
{ while(1) { if (c4ms > 250) { // timer / wait fou a full second c4ms=0; dfreq=analogRead(0); // read Poti on analog pin 0 to adjust output frequency from 0..1023 Hz cbi (TIMSK2,TOIE2); // disble Timer2 Interrupt tword_m=pow(2,32)*dfreq/refclk; // calulate DDS new tuning word sbi (TIMSK2,TOIE2); // enable Timer2 Interrupt Serial.print(dfreq); Serial.print(” “); Serial.println(tword_m); } sbi(PORTD,6); // Test / set PORTD,7 high to observe timing with a scope cbi(PORTD,6); // Test /reset PORTD,7 high to observe timing with a scope } }
//******************************************************************
// timer2 setup
// set prscaler to 1, PWM mode to phase correct PWM, 16000000/510 = 31372.55 Hz clock
void Setup_timer2() { // Timer2 Clock Prescaler to : 1 sbi (TCCR2B, CS20); cbi (TCCR2B, CS21); cbi (TCCR2B, CS22); // Timer2 PWM Mode set to Phase Correct PWM cbi (TCCR2A, COM2A0); // clear Compare Match sbi (TCCR2A, COM2A1); sbi (TCCR2A, WGM20); // Mode 1 / Phase Correct PWM cbi (TCCR2A, WGM21); cbi (TCCR2B, WGM22);
} //******************************************************************
// Timer2 Interrupt Service at 31372,550 KHz = 32uSec
// this is the timebase REFCLOCK for the DDS generator
// FOUT = (M (REFCLK)) / (2 exp 32)
// runtime : 8 microseconds ( inclusive push and pop)
ISR(TIMER2_OVF_vect) { sbi(PORTD,7); // Test / set PORTD,7 high to observe timing with a oscope phaccu=phaccu+tword_m; // soft DDS, phase accu with 32 bits icnt=phaccu >> 24; // use upper 8 bits for phase accu as frequency information // read value fron ROM sine table and send to PWM DAC OCR2A=pgm_read_byte_near(sine256 + icnt); if(icnt1++ == 125) { // increment variable c4ms all 4 milliseconds c4ms++; icnt1=0; } cbi(PORTD,7); // reset PORTD,7
}

Результат

Ниже представлена осциллограмма, на верхней части которой изображен ШИМ-сигнал на 11 выходе, а в нижней части этот же сигнал после фильтра низких частот (ФНЧ). Синусоида выглядит не очень чистой, но это в основном из-за ограниченной разрешающей способности цифрового осциллографа.

Спектрограмма показала неожиданно хороший результат. Большой пик – это на частоте около 1000 Гц. Все нежелательные искажения находятся ниже 50 дБ, возникшие из-за того, что использовался 8 битный ЦАП (1/256 = 48 дБ).

Выходной фильтр низких частот

Для начала, вы можете подсоединить 11 пин контроллера к активным колонкам. Но скорее всего, вам еще понадобится ФНЧ-фильтр, который также будет отфильтровывать частоту дискретизации 32 кГц. Ниже представлена схема такого фильтра с частотой среза 12 кГц.

Аппаратная реализация DDS

Данная программная реализация алгоритма DDS имеет некоторые недостатки, связанные с ограниченной скоростью алгоритма программы, а также возможностями микроконтроллера ATMega. Специализированные DDS-микросхемы лишены этих недостатков и покрывают диапазон от 0 до 100 МГц.

WSPR

Извещатель о прохождении слабого сигнала (Weak Signal Propagation Reporter) – программное обеспечение позволяющее передавать и принимать сигналы радиомаяков, задействуя не только передатчик, но и интернет. При помощи данного DDS-генератора можно генерировать 4 тоновых последовательности частотой 1497.8 1499.3 1500.7 1502.2 Гц.

Оригинал статьи на английском языке (перевод Колтыков А.В. для сайта cxem.net)

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

Источник: http://cxem.net/arduino/arduino16.php

DDS генератор синусоидального сигнала

Январь оказался достаточно продуктивным, в плане практического опыта. Основная цель: прокачать свои навыки в области разработки и сборки законченных устройств. Побочная задача: использовать мозги микроконтроллера в связке с быстродействующей ПЛИС. Как результат сделать себе годный DDS генератор.

Когда то давно я уже пробовал, сделать себе DDS генератор, случилось это еще во времена, когда еще и сайт не существовал, да и в микроконтроллерах ничего не понимал.

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

Частота изменялась значением регистра совпадения OCRnx. Этот подход описан уже в 7 уроке, генерация звука.

На тот момент, получившийся результат меня полностью устроил. На выходе регулируемый меандр с частотой до 20кГц, а вот синус получился ужасным, около 2кГц уже выдавал фигню. На практике мне было достаточно меандра на нескольких частотах до 10кГц, поэтому данный генератор много лет выполнял свои функции. Кроме того, на крайний случай у меня на работе был нормальный генератор.

Первое о чем я подумал, когда начал разбираться с ПЛИСинами, это то что хочу перепилить генератор заново.

Каким образом? Идея пришла не сразу, но в итоге мое понимание вылилось в то, что обработка интерфейса пользователя будет висеть на микроконтроллере, а молотить будет ПЛИСина.

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

Именно поэтому изначально решено, что это будет atmega8+epm240, дисплейчик wh0802 и энкодер для управления.

Блок питая городил свой из транса и кучи кренок. В итоге 3.3В для питания мк и плис, 5 на дисплей, +-12 для усилителя.

Схему усилителя приводить нет смысла — обычный инвертирующий усилитель на lm324. В итоге с железом все вышло достаточно просто. Задающая плата:

«Железный» подготовительный этап длился достаточно долго, но не сказать, чтобы было много проблем. А вот софтовая часть… Случилось то чего я больше всего боялся, но кто не рискует, тот не пьет шампанское

Самый прикол ожидал меня с самого начала. Опыта построения подобных девайсов у меня нет, поэтому я взял генератор для тактирования ПЛИС пожирнее, аж 100МГц. Начал вспоминать опыт первого генератора, попробовал и ничего не вышло.

Представим себе на 100МГц, если сделать счетчик, допустим считать до 1 и инвертировать ногу, это будет 50МГц на выходе. Если считать до 2х, то на выходе будет 25МГц, воу воу, но мы же юзаем резисторную матрицу, а это значит что результат нужно поделить еще на 8.

Но в любом случае получается большая дискретность шага.

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

В общем, принцип объяснить на пальцах действительно не так просто.

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

Правильный же DDS работает совсем иначе, значение из таблицы подставляется каждый такт, каждый. Да да, тут никакой ошибки нет. Попробую объяснить, представим что тактовая 1Гц, таблица из 8 значений. Значит подставляя значения из таблицы, можно получить частоту 1/8 = 0.125Гц. Выглядело бы это наверно так:

Как же регулируется частота? Тут есть маленькая хитрость. Cчетчик инкрементируется не на 1, а на какое то более мелкое число, таким образом можно уменьшить частоту, например в 10 раз:

while(1)
PORTD = sin[i = i + 0.1];

Или увеличить в 2 раза:

while(1)
PORTD = sin[i = i + 2];

Знаю, знаю для мк этот пример совсем не корректен, ибо операции будут выполняться разное количество тактов, но если утрированно взглянуть на код, то суть можно понять, кроме того в ПЛИС можно несколько операций выполнять по настоящему параллельно, т.е. для нее такой проблемы с тактами не существует!

В итоге вся теория выливается в две важных формулы: 1. Какой нам нужен шаг перестройки частоты.

Fdelta = Fclk/(2^N)

Обычно народ любит говорить о 0.01 или даже 0.001, честно мне по жизни не приходилось сталкиваться с тем, чтобы была нужна такая точность, но на всякий случай заложил поболееВычисляем так: тактовая Fclk = 100МГц, Fdelta нужна 0.01Гц, в итоге 0.01 = 100*10^6/(2^N), хехе вспоминаем математику, это обычный логарифм
n = log2 (100*10^8) = 33

2. Вычисление тактовой частоты fout=m*(Fclk/n_tabl)/(2^n) где m это число которое мы должны получить, fout требуемая на выходе частота, n_tabl количество табличных значений синуса(128), n — разрешение синуса, то что считали выше. Скажу сразу, для удобства я взял 32 бита, ибо это 4 байта.

fout=m*(100 000 000/128)/(2^32)

В итоге после всех сокращений получилось так:
m = f_out/0.000181898940354585647583;

Со стороны мк все совсем просто, крутим энкодер видим циферки на дисплее, как только циферка установлена, нажимаем кнопку энкодера, когда все циферки установлены — отсылаем 4 байта по spi:

#include
#include
#include
#include
#include
 
const float x = 0.000181898940354585647583;
volatile long int m;
volatile int NewState,OldState,upState,downState;
volatile char posX = 0, ps = 0;
volatile char temp_freq[6]={0,0,0,0,5,0};
volatile long int f_out = 50;
 
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{ NewState=PINB & 0b00000011;
if(NewState!=OldState)
{
switch(OldState) { case 2: { if(NewState == 3) upState++; if(NewState == 0) downState++; break; }
  case 0: { if(NewState == 2) upState++; if(NewState == 1) downState++; break; } case 1: { if(NewState == 0) upState++; if(NewState == 3) downState++; break; } case 3: { if(NewState == 1) upState++; if(NewState == 2) downState++; break; } } OldState=NewState;
}
TCNT1H=0x00;
TCNT1L=0x00;
}
 
void main(void)
{
char lcd_buf[17];
 
DDRC = (0

Источник: http://avr-start.ru/?p=2848

Простой и качественный генератор синусоидального сигнала на мосту Вина

В радиолюбительской практике часто возникает необходимости создать генератор синусоидальных колебаний. Применения ему можно найти самые разнообразные. Рассмотрим вариант создания генератор синуса на ОУ со стабильной амплитудой и частотой.

Наиболее удобным, с точки зрения сборки и наладки, вариантом генератора синусоидального сигнала является генератор, построенный на мосту Вина, на современном Операционном Усилителе (ОУ).

Мост Вина

Сам по себе мост Вина является полосовым фильтром, состоящим из двух RC фильтров(ссыла). Т.е. он выделяет центральную частоту и подавляет остальные частоты. Мост придумал, Макс Вин еще в 1891 году. На принципиальной схеме, сам мост Вина обычно изображается следующим образом:

Картинка взята из Википедии

На таком мосту часто строят автогенераторы и измерители индуктивности. Для удобства используют R1=R2=R и C1=C2=C. При этом основная частота моста рассчитывается из соотношения

f=1/2πRC

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

Zc=1/ωC=1/2πC

где ω (омега) — циклическая частота

Мост Вина обладает отношением выходного напряжения ко входному b=1/3 . Это важный момент, т.к. этот коэффициент определяет условия стабильной генерации.

Мост Вина и операционный усилитель

Сам по себе мост Вина не является генератором сигнала. Для возникновения генерации его следует разместить в цепи положительной обратной связи операционного усилителя. Такой автогенератор можно построить и на транзисторе, но использование ОУ явно упростит жизнь и даст лучшие характеристики.

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

Коэффициент на троечку

Выше было сказано, что мост Вина имеет коэффициент пропускания b=1/3. Поэтому условием генерации является то, что ОУ должен обеспечивать коэффициент усиления равный трем. В таком случает произведение коэффициентов пропускания моста Вина и усиления ОУ даст 1. И будет происходить стабильная генерация выбранной частоты.

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

K=1+R2/R1

Но увы, мир не идеален…. На практике оказывается, что для запуска генерации необходимо, чтобы в самый начальный момент коэфф. усиления был немного больше 3-х, а далее для стабильной генерации он поддерживался равным 3.

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

Поэтому, строя генератор на мосте Вина, прибегают к использованию нелинейного элемента в цепи отрицательной обратной связи, регулирующего коэффициент усиления. Т.е. генератор будет сам себя уравновешивать и поддерживать генерацию на одинаковом уровне.

Стабилизация амплитуды на лампе накаливания

В самом классическом варианте генератора на мосте Вина на ОУ, применяется миниатюрная низковольтная лампа накаливания, которая устанавливается вместо резистора.

При включении такого генератора, в первый момент, спираль лампы холодная и ее сопротивление мало. Это способствует запуску генератора (K>3). Затем, по мере нагрева, сопротивление спирали увеличивается, а коэффициент усиления снижается, пока не дойдет до равновесия (K=3).

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

Идея использования лампочки, в качестве управляющего элемента очень интересна и используется по сей день. Но у лампочки, увы, есть ряд недостатков.

Во первых требуется ее найти и подобрать подходящие токоограничивающий резистор R*.

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

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

Стабилизация амплитуды на светодиодах

Эффективным методом стабилизации амплитуды выходного напряжения генератора синусоидальных сигналов является применение в цепи отрицательной ОС светодиодов (VD1 и VD2).

Основной коэффициент усиления задается резисторами R3 и R4. Остальные же элементы (R5, R6 и светодиоды) регулируют коэффициент усиления в небольшом диапазоне, поддерживая генерацию стабильной. Резистором R5 можно регулировать величину выходного напряжения в интервале примерное 5-10 вольт.

В дополнительной цепи ОС желательно использование низкоомных резисторов (R5 и R6). Это позволит пропускать значительный ток (до 5мА) через светодиоды и они будут находиться в оптимальном режиме. Даже будут светиться 🙂

На показанной выше схеме, элементы моста Вина рассчитаны для генерации на частоте 400 Гц, однако они могут быть легко пересчитаны для любой другой частоты по формулам, представленным в начале статьи.

Качество применяемых элементов

Важно, чтобы операционный усилитель мог обеспечить необходимый для генерации ток и обладал достаточной полосой пропускания по частоте. Использование в качестве ОУ народных TL062 и TL072 дало очень печальные результаты на частоте генерации 100кГц. Форму сигнала было трудно назвать синусоидальной, скорее это был треугольный сигнал. Использование TDA 2320 дало еще более худший результат.

А вот NE5532 показа себя с отличной стороны, выдав на выходе сигнал очень похожий на синусоидальный. LM833 так же справилась с задачей на отлично. Так что именно NE5532 и LM833 рекомендуются к использованию как доступные и распространенные качественные ОУ. Хотя с понижением частоты гораздо лучше себя будут чувствовать и остальные ОУ.

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

В авторском варианте были применены резистор типа С2-13 ±0.2% и слюдяные конденсаторы точностью ±2%. Применение резисторов указанного этого типа обусловлено их малой зависимостью сопротивления от температуры. Слюдяные конденсаторы так же мало зависят от температуры и имеют низкий ТКЕ.

Минусы светодиодов

На светодиодах стоит остановиться отдельно. Их использование в схеме синус генератора вызвано величиной падения напряжения, которое обычно лежит в интервале 1.2-1.5 вольта. Это позволяет получать достаточно высокое значение выходного напряжения.

После реализации схемы, на макетной плате, выяснилось, что из-за разброса параметров светодиодов, фронты синусоиды на выходе не симметричны. Это заметно даже на приведенной выше фотографии. Помимо этого присутствовали небольшие искажения формы генерируемого синуса, вызванные недостаточной скоростью работы светодиодов для частоты генерации 100 кГц.

Диоды 4148 и переменный резистор

Светодиоды были заменены на всеми любимые диоды 4148. Это быстродействующие сигнальные диоды со скоростью переключения менее 4 нс.

Схема при этом осталась полноценно работоспособной, от описанных выше проблем не осталось и следа, а синусоида приобрела идеальный вид.

На следующей схеме элементы моста вина рассчитаны на частоту генерации в 100 кГц. Переменный резистор R5 был заменен на постоянные, но об этом позже.

В отличие от светодиодов, падение напряжения на p-n переходе обычных диодов составляет 0.6 -0.7 В, поэтому величина выходного напряжения генератора составила около 2.5 В. Для увеличения выходного напряжения возможно включение нескольких диодов последовательно, вместо одного, например вот так:

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

Теперь о подстроечном резисторе. Изначально в качестве резистора R5 был применен многооборотный подстроечный резистор на 470 Ом, который позволял точно регулировать величину выходного напряжения.

Использование переменного резистора в подобных цепях нежелательно по двум основным причинам.

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

Дополнительное усиление

Т.к. Синус генератор был собран на сдвоенном ОУ, то половина микросхемы осталась висеть в воздухе. Она была задействована под регулируемый усилитель напряжения.

Это позволило перенести переменный резистор из дополнительной цепи ОС генератора в каскад усилителя напряжения для регулировки выходного напряжения.

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

Коэффициент усиления каскада задается соотношением:

K=1+R2/R1

Было необходимо получение выходного синусоидального напряжения в 10 вольт. Имея с генератора 2.5 вольта, требовалось усиление в 4 раза. Элементы выбирались с перекрытием требуемого коэффициента, который при указанных номиналах варьируется от 2.2 до 5.7.

Умощнение выхода

Генератор предполагался для работы на низкоомную нагрузку в несколько Ом. Разумеется ни один маломощный ОУ не сможет выдать необходимый ток. По этой причине было решено умощнить выход повторителем на микросхеме TDA2030. Все вкусности такого применения этой микросхемы описаны в статье “ Схема повторителя напряжение на ОУ. Мощный повторитель напряжения на TDA2030. ”. 

А вот так собственно выглядит схема всего синусоидального генератора с усилителем напряжения и повторителем на выходе:

Генератор на мосту Вина может быть построен и на самой TDA2030 в качестве ОУ. Все зависит от требуемой точности и выбранной частоты генерации. Если у вас нет особых требований к качеству генерации, а требуемая частота не превышает 80-100 кГц и при этом предполагается работа на низкоомную нагрузку, то этот вариант вам
Идеально подойдет.

Заключение

Генератор на мосту вина — не единственный способ генерации синусоиды. Если вы нуждаетесь в высокоточной стабилизации частоты то лучше смотреть в сторону генераторов с кварцевым резонатором.

Однако, описанная схема, подойдет для подавляющего большинства случаев, когда требуется получение стабильного, как по частоте так и по амплитуде, синусоидального сигнала.

При этом схема проста в повторении и не требует наладки.

Источник: http://audiogeek.ru/sinus-generator/

Функциональный DDS rенератор на ПЛИС

Недавно я увидел проект генератора сигналов на микроконтроллере AVR. Принцип генерации — DDS, на базе библиотеки Jesper максимальная частота — 65534 Гц (и до 8 МГц HS выход с меандром).

И тут я подумал, что генератор — отличная задача, где ПЛИС сможет показать себя в лучшем виде.

В качестве спортивного интереса я решил повторить проект на ПЛИС, при этом по срокам уложиться в два выходных дня, а параметры получить не строго определенные, а максимально возможные. Что из этого получилось, можно узнать под катом

День нулевой

До того, как наступят выходные, у меня было немного времени подумать над реализацией. Чтобы упростить себе задачу, решил сделать генератор не в виде отдельного устройства с кнопками и LCD экраном, а в виде устройства, которое подключается к ПК через USB. Для этого у меня есть плата USB2RS232.

Плата драйверов не требует (CDC), поэтому, я думаю, что и под Linux будет работать (для кого-то это важно). Так же, не буду скрывать, что с приемом сообщений по RS232 я уже работал. Модули для работы с RS232 буду брать готовые c opencores.com.

Для генерации синусоидального сигнала потребуется ЦАП. Тип ЦАП я выбрал, как и в исходном проекте — R2R на 8 бит.

Он позволит работать на высоких частотах, порядка мегагерц. Убежден, что ПЛИС с этим должна справиться

По поводу того, на чем написать программу для передачи данных через COM порт я задумался. С одной стороны, можно написать на Delphi7, опыт написания такой программы уже есть, к тому же размер исполняемого файла будет не большим.

Еще попробовал набросать что-то для работы с Serial в виде java скрипта в html страничке, но более менее заработало только через Chrome serial API, но для этого надо устанавливать плагин… в общем тоже отпадает. В качестве новшества для себя попробовал PyQt5, но при распространении такого проекта, нужно тащить кучу библиотек.

Попробовав собрать PyQt проект в exe файл, получилось больше 10 мб. То есть, будет ничем не лучше приложения, написанного на c++Qt5. Стоит еще учесть, что опыта разработки на python у меня нет, а вот на Qt5 — есть. Поэтому выбор пал на Qt5. С пятой версии там появился модуль для работы с serial и я с ним уже работал.

А еще приложение на Qt5 может быть перенесено на Linux и Mac (для кого-то это важно), а с 5.2 версии, приложения на QWidgets может быть перенесено даже на смартфон!

Что еще нужно? Естественно плата с ПЛИС. У меня их две (Cyclone iv EP4CE10E22C8N на 10 тыс. ячеек, и Cyclone ii EP2C5 на 5 тыс. ячеек). Я выберу ту, что слева, исключительно по причине более удобного разъема.

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

Обе платы имеют «на борту» генераторы 50 МГц, а внутри ПЛИС есть PLL, с помощью которого я смогу увеличить частоту до запланированных 200 МГц.

День первый

В связи с тем, что модуль DDS я уже делал в своем синтезаторном проекте, то я сразу взялся за паяльник и начал паять ЦАП на резисторах. Плату взял макетную. Монтаж делал с применением накрутки. Единственное изменение, которое коснулось технологии — я отказался от кислоты Ф38Н для лужения стоек в пользу индикаторного флюс-геля ТТ.

Суть технологии проста: в печатную плату впаиваю стойки, на них со стороны печатного монтажа припаиваю резисторы. Недостающие соединения выполняю накруткой. Еще, стойки удобны тем, что я их могу вставить прямо в плату ПЛИС. К сожалению, дома в наличии не оказалось резисторов 1 и 2 килоома. Ехать в магазин было некогда.

Пришлось поступиться одним из своих правил, и выпаять резисторы из старой не нужной платы. Там применялись резисторы 15К и 30К.

Получился вот такой франкенштейн:
Дальше я запустил Quartus, создал проектПосле создания проекта нужно задать целевое устройство: Меню Assigments -> DeviceДалее там же нажимаю кнопочку «Device and Pin options» потому что некоторые пины настроены так, что работать не будут.

Настраиваю все, как «Use as regular I/O»В проекте я «нахадркодил» неуправляемый главный модуль DDS на фиксированную частоту.

Модуль генератора на 1000 Гцmodule signal_generator(clk50M, signal_out); input wire clk50M;
output wire [7:0] signal_out; wire clk200M;
osc osc_200M reg [31:0] accumulator; assign signal_out = accumulator[31:31-7]; //пробуем генерировать 1000 Гц
//50 000 000 Hz – тактовая частота внешнего генератора
//2^32 = 4 294 967 296 – разрядность DDS – 32 бита
//делим 1000Hz / 50 000 000 Hz / 2 * 4294967296 => 42949,67296
always @(posedge clk50M) begin accumulator Pin PlannerНа линии HS_OUT, key0 и key1 прошу пока не обращать внимание, они появляются в проекте потом, но скрин в самом начале я сделать не успел.В принципе, достаточно «прописать» только PIN_nn в столбце Location, а остальные параметры (I/O standart, Current Strench и Slew Rate) можно оставить по умолчанию, либо выбрать такие же, что предлагаются по умолчанию (default), чтобы не было warning'ов.Как узнать какому PIN соответствует номер разъема на плате?Номера контактов разъема подписаны на платеА пины ПЛИС, к которым подключены контакты разъема, описаны в документации, которая идет в комплекте с платой ПЛИС.

После того, как пины назначены, компилирую проект еще раз и прошиваю с помощью USB программатора. Если у вас не установлены драйверы для программатора USB Byte blaster, то укажите Windows, что они находятся в папке, куда у вас установлен Quartus. Дальше она сама найдет. Подключать программатор нужно к разъему JTAG. А пункт меню для программирования «Tools -> Programmer» (либо нажать значек на панели инструментов). Кнопка «Start», радостное «Success» и прошивка уже внутри ПЛИС и уже работает. Только не выключайте ПЛИС, а то она все забудет.Tools -> ProgrammerЦАП подключен к разъему платы ПЛИС. К выходу ЦАП подключаю осциллограф С1-112А. В результате должна получиться «пила» потому что на выход 8 бит выводится старшая часть слова DDS аккумулятора фазы. А оно всегда увеличивается, пока не переполнится. Каких-то 1.5 часа и для частоты в 1000 Гц я вижу следующую осциллограмму:Хочу заметить, что «пила» по середине имеет небольшой перелом. Он связан с тем, что резисторы имеют разброс значений. Еще один важный момент, который нужно было выяснить — это максимально возможная частота, с которой будет работать DDS генератор. При правильно настроенных параметрах TimeQuest, после компиляции в «Compilation Report» можно увидеть, что скорость работы схемы выше 200 МГц с запасом. А это значит, что частоту генератора 50 МГц я буду умножать с помощью PLL на 4. Увеличивать значение аккумулятора фазы DDS буду с частотой 200 МГц. Итоговый диапазон частот, который можно получить в наших условиях 0 — 100 МГц. Точность установки частоты: 200 000 000 Гц (clk) / 2^32 (DDS) = 0,047 ГцТо есть, это лучше, чем ~0.05 Гц. Точность в доли герца для генератора с таким диапазоном рабочих частот (0…100 МГц) считаю достаточной. Если кому-то потребуется повысить точность, то для этого можно увеличить разрядность DDS (при этом не забыть проверить TimeQuest Timing Analyzer, что скорость работы логической схемы укладывалась в CLK=200 МГц, ведь это сумматор), либо просто снизить тактовую частоту, если такой широкий диапазон частот не требуется.TimeQuest Timing AnalyzerПосле того, как я увидел на экране «пилу», семейные дела заставили меня ехать на дачу (выходной же). Там я косил, варил, жарил шашлык и не подозревал о том сюрпризе, что ждал меня вечером. Уже ближе к ночи, перед сном, я решил посмотреть форму сигнала для других частот.Для частоты 100 КГцДля частоты 250 КГцДля частоты 500 КГцДля частоты 1 МГцНе буду скрывать, что форма сигналов меня расстроила, особенно на 1МГц (жалкий, никчемный мегагерц!). Я планировал получить частоты несколько других порядков. Почитав про R2R ЦАП стала ясна причина проблемы — паразитные емкости. Поэтому в планах на следующий день было решено сделать ЦАП на резисторах 100 и 200 Ом, которые у меня есть в наличии, а этот ЦАП оставить для будущих разработок, не требующих работы на таких высоких частотах, ведь в гладкости пилы тоже есть свой плюс.

День второй

В связи с тем, что было интересно, как будет работать ЦАП на резисторах 100 и 200 Ом, я сразу взялся за паяльник. На этот раз ЦАП получился более аккуратным, а времени на его монтаж ушло меньше.

Ставим ЦАП на плату ПЛИС и подключаем к осциллографуПроверяем 1 МГц — ВО! Совсем другое дело!Пила 10 МГцПила 25 МГцФорма пилы на 10 МГц еще похожа на правильную. Но на 25 МГц она уже совсем «не красивая». Однако, у С1-112а полоса пропускания — 10 МГц, так что в данном случае причина может быть уже в осциллографе.

В принципе, на этом вопрос с ЦАП можно считать закрытым. Теперь снимем осциллограммы высокоскоростного выхода. Для этого, выведем старший бит на отдельный PIN ПЛИС. Данные для этой линии будем брать со старшего бита аккумулятора DDS.

assign hs_out = accumulator[31];
Меандр 1 МГцМеандр 5 МГцМеандр 25 МГцМеандр 50 МГц уже практически не виденНо считаю, что выход ПЛИС стоило бы нагрузить на сопротивление. Возможно, фронты были бы круче. Синус делается по таблице. Размер таблицы 256 значений по 8 бит.

Можно было бы взять и больше, но у меня уже был готовый mif файл. С помощью мастера создаем элемент ROM с данными таблицы синуса из mif-файла.

Создание ROM – Tools -> Mega Wizard Plugin managerВыбираем 1 портовую ROM и задаем название модулюСоглашаемсяТут тоже соглашаемсяС помощью browse находим наш mif файл с таблицей синусаТут тоже ничего не меняемСнимаем галочку с модуля sine_rom_bb.v — он не нужен. Дальше finish. Квартус спросит добавить модуль в проект — соглашаемся.

После этого, модуль можно использовать так же, как любой другой модуль в Verilog.Старшие 8 бит слова аккумулятора DDS будут использоваться в качестве адреса ROM, а выход данных — значение синуса.Код//sine rom
wire [7:0] sine_out;
sine_rom sine1(.clock(clk200M), .address(accumulator[31:31-7]), .q(sine_out));Осциллограмма синуса на разных частотах выглядит… одинаково.При желании, можно рассмотреть проблемы ЦАП, связанные с разбросом резисторов:Чтож, на этом выходные кончились. А ведь еще не написано ПО для управления с ПК. Вынужден констатировать факт, что в запланированные сроки я не уложился.

День третий

Времени совсем мало, поэтому программу пишем на скорую руку (в лучших традициях). Местами, чтобы сократить количество букв и удобство ввода информации с клавиатуры, применяется фильтр событий по имени виджета. Прошу понять и простить. Интерфейс

Исходный код на GitHub. Там же есть уже собранное под windows приложение.

Код прост, как 5 копеек. В файл проекта .pro кроме всего прочего нужно добавить модуль serialport:QT += core gui serialport
Открытие COM порта QSerialPort serial; … serial.setPortName(ui->lbSerialPortInfo->currentText()); serial.setBaudRate(QSerialPort::Baud115200); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.setFlowControl(QSerialPort::NoFlowControl); serial.open(QIODevice::ReadWrite);Формирование и отправка сообщения QByteArray source; QDataStream stream(&source, QIODevice::ReadWrite); stream

Источник: https://habr.com/post/260999/

DDS Модуль генератора сигналов синусоидального сигнала Sawtooth Wave Signal

Эта гарантия и политика возврата доступна только для подкатегорий Arduino совместимые SCM и DIY наборы, 3D Принтер и принадлежности, Электронные аксессуары и гаджеты

В течение 180 дней

Если есть проблемы с качеством продукта, которые не вызваны искусственными факторами, такими как демонтаж, неправильное использование, падение или падение, повреждение водой, неофициальные прошивки, модификации программного обеспечения или любые другие причины повреждения, мы будем покрывать расходы по доставке, основанные на квитанцию о доставке, которую вы предоставите, только если эти расходы стоят менее US$40. 

Если повреждение связано с экраном, эта ситуация не должна считаться включенной в сферу действия настоящей гарантии.

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

Мы отправим вам счет с указанием всех сборов, которые мы должны заплатить, прежде чем отправлять их вам.

Через 180 дней после доставки

Все гарантийные заявки будут отклонены после 180 дней с момента доставки.(3D-принтеры и электронные книги имеют гарантийный срок 1 год)

Политика возврата

DOA (Мертвые по прибытии) предметы

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

О неудовлетворительных продуктах

Если вы не удовлетворены своей покупкой, вы можете вернуть ее в течение 3 дней с даты доставки, чтобы получить возмещение вашей покупки за вычетом сборов за доставку или обмен.

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

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

Проблема с 3D-принтером

Если ваш 3D-принтер окажется дефектным, пожалуйста, предоставьте нам следующую информацию:

  • ID номер продукта;
  • Номер заказа;
  • Некоторые фотографии, видео или скриншот проблемы;
  • Описание проблемы;

Ваш 3D-принтер еще работает правильно:

В комплект входит множество частей. Если какие-либо части были повреждены при доставке, свяжитесь с нами, чтобы повторно отправить вам эти части. Если вы можете купить их в своей стране, пожалуйста, сообщите нам, и мы вернем вам деньги.

Ваш 3D-принтер работает неправильно:

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

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

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

Проблема с электронной книгой

Если ваша электронная книга работает неправильно, пришлите нам следующую информацию:

  • ID номер продукта;
  • Номер заказа;
  • Некоторые фотографии, видео или скриншот проблемы;
  • Описание проблемы;

В течение одного года бесплатного обслуживания для проблем с качеством (за исключением повреждения экрана), за исключением личного повреждения (например, для обслуживания груза требуется техническое обслуживание персонального повреждения).

45 дней проблем с качеством могут обмениваться новой машиной (за исключением личного повреждения (например, повреждения экрана))

Ущерб экрана относится к персональному ущербу. Клиент должен заплатить за оплату обслуживания (смены экрана) и нести фрахт.

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

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

Заметки:

  • 1. Пожалуйста, внимательно прочитайте описания перед покупкой. Если описания недостаточно ясны, свяжитесь с нами.
  • 2. Эта категория (Arduino SCM & 3D Принтер Acc) включает в себя множество наборов DIY, и мы не можем полностью помочь вам в случае, если повреждение вызвано неправильной сваркой, строительством или любыми другими проблемами в цепи.
  • 3. Если вы обнаружили, что продукт поврежден, не разбирайте его самостоятельно (например, электронные книги, программисты, анализаторы логических сигналов и другие преднастроенные части), так как это может повлиять на ваш запрос на возврат.

Источник: https://www.banggood.com/ru/DDS-Function-Signal-Generator-Module-Sine-Square-Sawtooth-Wave-Signal-p-1215203.html?rmmds=buy

Функциональный DDS генератор на базе микросхемы AD9833

» Схемы » Генераторы · Применение микроконтроллеров

23-04-2012

AD9833

На страницах сайта Радиолоцман, в разделе «Схемы», опубликовано множество схем DDS генераторов, от простых, на одном микроконтроллере, до сложных на базе ПЛИС с богатыми функциональными возможностями.

Мы рассмотрим еще одну конструкцию такого прибора, функцию DDS синтеза аналогового сигнала в котором выполняет специализированная микросхема AD9833, производства компании Analog Devices, являющейся одним из лидеров в этой области.

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

  • Выходная частота от 1 Гц до 5 МГц;
  • Точность 0.1 Гц;
  • Форма выходного сигнала: прямоугольные, треугольные, синус;
  • Возможность регулировки скважности импульсов;
  • 5 В ТТЛ выход;
  • Аналоговый выходной сигнал с размахом от +15 В до –15 В;
  • Возможность подстройки постоянного смещения в пределах от +15 В до –15 В;
  • Пользовательский интерфейс: двухстрочный ЖК индикатор и 16-кнопочная клавиатура.

Прямой цифровой синтез (DDS) – метод, позволяющий получить аналоговый сигнал за счет генерации временной последовательности цифровых отсчетов и их дальнейшего преобразования в аналоговую форму посредством цифро-аналогового преобразователя.

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

На сегодняшнем уровне развития схемотехники DDS синтезаторы представляют собой очень компактные микросхемы с низким потреблением.

Выбор микросхемы AD9833 основан на следующих ее преимуществах:

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

Расположение выводов микросхемы AD9833

В качестве источника тактовых импульсов для микросхемы синтезатора необходимо использовать осциллятор со встроенным генератором, простой кварцевый резонатор не подходит для использования совместно с микросхемой. В техническом описании на микросхему указано значение тактовой частоты 25 МГц, но автор применил генератор на 50 МГц, при тестировании устройства никаких проблем не было выявлено.

Прибор снабжен ЖК индикатором, клавиатурой для управления и настройки и переменными резисторами для регулирования уровня, смещения и симметрии. Управление микросхемой DDS синтезатора и всей периферией осуществляет микроконтроллер Atmel AVR ATmega32.

Условно схема DDS генератора разбита на несколько частей: схема питания, микроконтроллерная часть, модуль DDS на микросхеме AD9833, выходная аналоговая часть и пользовательский интерфейс.

Схема питания построена на интегральных регуляторах напряжения и обеспечивает двуполярное напряжение ±15 В для выходной аналоговой части и напряжение +5 В для питания микроконтроллера и периферии.

Микроконтроллер тактируется от встроенного RC осциллятора 8 МГц. Стандартный двухстрочный ЖК индикатор на базе контроллера HD44780 подключен к порту C (Port C) микроконтроллера по 4-битному интерфейсу. Резистор R1 предназначен для регулировки контрастности.

К сигнальной линии PC7/TOSC2 подключен звуковой излучатель (буззер), который используется для звукового оповещения пользователя при переключении режимов и настройке. Потенциометр R2, подключенный к каналу ADC0 встроенного АЦП микроконтроллера, используется для цифровой регулировки уровня выходного аналогового сигнала.

Регулировка уровня выполнена на базе микросхемы цифрового потенциометра MCP41010 (см. схему выходной аналоговой части), которая управляется микроконтроллером по интерфейсу SPI.

Схема микроконтроллерной части DDS генератора

Нажмите для увеличения

Управление микросхемой DDS синтезатора осуществляется по линиям микроконтроллера PD0 (DDSDATA), PD1 (DDSFSYNC), PD2 (DDSCLK). Микросхема DDS, осциллятор и несколько пассивных компонентов обвязки конструктивно составляют отдельный подключаемый модуль, что позволит использовать его в других конструкциях или в экспериментах.

Схема DDS модуля генератора на микросхеме AD9833

Нажмите для увеличения

К аналоговой выходной части генератора предъявляются особые требования, т.к. не так просто усилить сигнал с амплитудой 400 мВ до уровня ±15 В, с выходным током 300 мА на частоте 5 МГц.

Поэтому был применен сверхбыстродействующий операционный усилитель LM7171 с обратной связью по напряжению и схема двухтактного транзисторного усилителя мощности.

Блокировочные конденсаторы по питанию операционных усилителей на печатной плате должны быть расположены как можно ближе к микросхемам.

Кроме того, в зависимости от формы генерируемого сигнала (прямоугольные импульсы или синусоида) включаются разные схемы предварительного усиления и нормализации сигнала. Переключение этих схем выполнено на реле, которое управляется микроконтроллером, в зависимости от режима работы генератора (транзисторы Q6 и Q7).

На выводе микроконтроллера PD7 генерируются прямоугольные импульсы, которые поступают через буфер на микросхеме 74HC14 на ТТЛ выход генератора.

Схема выходной аналоговой части DDS генератора

Нажмите для увеличения

ТТЛ выход генератора

Нажмите для увеличения

Модуль готовой матричной клавиатуры с организацией 4×4 подключается к порту B (Port B). Строки матрицы клавиатуры подключены к линиям порта PB0-PB3, столбцы – подключены к линиям PB4-PB7.

Загрузки

Исходный код и прошивка микроконтроллера – скачать

microsyl.com

Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Фрагменты обсуждения: Полный вариант обсуждения »
  • Ошибка: Вместо микроконтроллерной части схемы скачивается схема DDS. Жаль что и тут и у автора очень скудное описание проекта
  • Эта разработка, вероятно, относится к измерительной технике, которая должна иметь кроме прочих иметь метрологические характеристики воспроизводимого сигнала. Например: – выходное сопротивление, которое зависит от частоты при наличии усилительного каскада на транзисторах; – коэффициент гармоник при воспроизвелении синусоиды; – время установления для прямоуголоного сигнала; – линейность (отклонение от линейности) для треугольного сигнала. Эти требования прописаны в соответствующих ГОСТ-ах и ТУ. Метрологию и метрологов, к сожалению, не изучают, а многие просто не знают о её существовании.
  • Ошибку исправили – скачивается схема микроконтроллерной части генератора.
  • Ктото пробовал собирать данный DDS. У меня пока сним прблемы,на схеме мега32 а исходнике мега324,они не совместимы.
  • а где можно найти печатные платы.
  • Какие платы, схема и прошивка не рабочие,всё нужно переделывать. Использовать как направление,чем сейчас и занимаюсь. Схема меге32 а прошивка мега 324,а они не совместимы и так дальше,везде глюки.
  • а который можно взять генератор чтобы там были основные сигналы (синус треугольный и меандир можно еще шум) очень надо
  • Если по-быстрому ,используй 174ГФ2(не указал,правда ,диапазон перестройки и прочие парам.(наприм.Точность,уход частоты,и пр..)
  • чем получше до 2-5 МГц
  • Если ГФ2 достанешь-подойдёт…
  • Не факт что схема и прошивка не рабочие… Или вы проверяли прошиву именно на ATmega324. Уточните, если не затруднит. На схеме действительно указана mega32. Но автор проекта на своем сайте в комментариях к этому проекту уточнил, что в схеме должен использоваться микроконтроллер ATmega324… Однако в схеме эта ошибка пока не устранена…
  • Перепутаны столбцы и строки клавиатуры. TTL выход вобще не зделан.Уровень прямоугольного сигнала 5V,синус и пила 0.6V.
  • Кстати да, за какое время устаканивается работа синтезатора после записи управляющего слова в регистры чипа AD9833? Даташит смотрел, но не нашел нужных цифр. Наверное плохо смотрел.
  • камрад, Вам большой салям из 2012 года! 🙂
  • Да хоть из 2002_го 🙂 Что касаемо времени, нашел в даташите, что время задержки установки частоты у AD9833 равняется 7 или 8 периодам тактовой частоты.
  • Вопрос вдогонку – кто-нибудь пробовал модулировать получаемый с AD9833 сигнал по амплитуде? Есть у нее выход наружу от ИОН с которого подается определенное напряжение на ЦАП. Вывод для конденсатора, для сглаживания возможных пульсаций напряжение опорного источника. Что, если шунтировать этот вывод, изменяя напряжение опорника? Возможно изменение амплитуды напряжения на выходе ЦАП таким образом?
  • Если бы был внешний ИОН (или возможность программного переключения на него), то можно было бы менять напряжение на выходе. А так, пытаясь “просадить” опору, ничего путного получить не удастся. Нужен внешний каскад для модуляции…
  • Жаль. Я было подумал, что может получится как в AD9850/9851, у которых имеется возможность АМ модуляции сигнала путем изменения тока ЦАП. Цена у 9850 раза в 3 выше чем 9833. Надеялся, что получится сэкономить. Ну ладно, тогда возьму AD9850. Мутить внешний АМ модулятор не буду, хотелось “красивого” решения без лишних навесов на синтезатор.
Полный вариант обсуждения »

При перепечатке материалов с сайта прямая ссылка на РадиоЛоцман обязательна.

Приглашаем авторов статей и переводов к публикации материалов на страницах сайта.

Источник: https://www.rlocman.ru/shem/schematics.html?di=128164

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}