Принципна диаграма на dds генератор на микроконтролер atmel. Функционален dds генератор на plc. Тест на режимите на работа на генератора след монтажа

Принципна диаграма на dds генератор на микроконтролер atmel.  Функционален dds генератор на plc.  Тест на режимите на работа на генератора след монтажа
Принципна диаграма на dds генератор на микроконтролер atmel. Функционален dds генератор на plc. Тест на режимите на работа на генератора след монтажа

Максимална честота - 65534 Hz ​​(и до 8 MHz HS изход с квадратна вълна). И тогава си помислих, че генераторът е отлична задача, където FPGA може да се покаже в най-добрия си вид. Като въпрос на спорт реших да повторя проекта на FPGA, като същевременно спазих крайните срокове в рамките на два уикенда и получих параметрите, които не са строго определени, а максимално възможните. Можете да разберете какво излезе от това под разреза.

Ден нула

Преди да настъпи уикенда, имах малко време да помисля за изпълнението. За да опростя задачата си, реших да направя генератора не като отделно устройство с бутони и LCD екран, а като устройство, което се свързва към компютър чрез USB. За това имам платка USB2RS232. Платката не изисква драйвери (CDC), следователно мисля, че ще работи под Linux (за някои това е важно). Освен това няма да крия, че вече съм работил с получаване на съобщения през RS232. Ще взема готови модули за работа с RS232 от opencores.com.

За да генерирате синусоидален сигнал, ще ви трябва DAC. Избрах типа DAC, както в оригиналния проект - R2R 8-bit. Той ще ви позволи да работите на високи честоти от порядъка на мегахерца. Убеден съм, че FPGA трябва да се справи с това

Мислех как да напиша програма за предаване на данни през COM порт. От една страна, можете да пишете в Delphi7; освен това размерът на изпълнимия файл няма да бъде голям. Също така се опитах да нахвърля нещо, което да работи със Serial под формата на java скрипт в html страница, но повече или по-малко работи само чрез серийния API на Chrome, но за това трябва да инсталирате плъгин... като цяло , също е изключено. Опитах PyQt5 като иновация за себе си, но когато разпространявате такъв проект, трябва да плъзнете куп библиотеки. След като се опитах да компилирам проект на PyQt в exe файл, се оказа, че е повече от 10 MB. Тоест няма да е по-добро от приложение, написано на C++\Qt5. Също така си струва да се има предвид, че нямам опит в разработването на python, но имам опит в Qt5. Следователно изборът падна върху Qt5. От петата версия се появи модул за работа със serial и вече съм работил с него. И приложение, базирано на Qt5, може да бъде прехвърлено на Linux и Mac (за някои това е важно), а от версия 5.2 приложенията, базирани на QWidgets, могат дори да бъдат прехвърлени на смартфон!

Какво още е необходимо? Естествено платката има FPGA. Имам две от тях (Cyclone iv EP4CE10E22C8N за 10 хиляди клетки и Cyclone ii EP2C5 за 5 хиляди клетки). Ще избера този отляво само и единствено заради по-удобния конектор. Като обем проектът няма намерение да бъде голям, така че ще се впише в едно от двете. Те не се различават по скорост на работа. И двете платки имат 50 MHz осцилатори на борда, а вътре в FPGA има PLL, с който мога да увелича честотата до планираните 200 MHz.

Първият ден

Поради факта, че вече бях направил DDS модула в моя проект за синтезатор, веднага хванах поялника и започнах да запоявам DAC с резистори. Взех прототипна платка. Монтажът е извършен с помощта на обвивка. Единствената промяна, която повлия на технологията, беше, че изоставих киселината F38N за калайдисване на стойките в полза на ТТ индикаторния флюс гел. Същността на технологията е проста: запоявам стелажи в печатна платка и запоявам резистори върху тях от страната на печатната платка. Правя липсващите връзки чрез усукване. Освен това стелажите са удобни, защото мога да ги вкарам директно в FPGA платката.

За съжаление вкъщи нямаше налични резистори от 1 и 2 килоома. Нямаше време да отида до магазина. Трябваше да се откажа от едно от правилата си и да премахна резистори от старата ненужна платка. Там бяха използвани 15K и 30K резистори. Резултатът е този Франкенщайн:


След като създадете проекта, трябва да зададете целевото устройство: Menu Assigments -> Device


В проекта кодирах неконтролируемия главен DDS модул на фиксирана честота.

1000 Hz генераторен модул

модул signal_generator(clk50M, signal_out); входен проводник clk50M; кабелен изход signal_out; проводник clk200M; osc osc_200M reg акумулатор; присвояване на signal_out = акумулатор; //опитайте се да генерирате 1000 Hz //50 000 000 Hz - тактова честота на външния генератор //2^32 = 4 294 967 296 - DDS битова дълбочина - 32 бита //разделяне на 1000Hz / 50 000 000 Hz / 2 * 4294967296 => 42949, 67296 винаги @ (posedge clk50M) започнете акумулатор<= accumulator + 32"d42949; end endmodule


След това щракнах върху „Стартиране на компилация“, така че средата за разработка да попита какви входни/изходни линии имаме в основния модул на проекта и с какви физически PIN кодове са свързани присвоете редовете, които се появяват на истинските PIN кодове на чипа FPGA:

Елемент от менюто Присвоения -> Pin Planner

Моля, игнорирайте редовете HS_OUT, key0 и key1 засега, те се появяват в проекта по-късно, но нямах време да направя екранна снимка в самото начало.

По принцип е достатъчно да „регистрирате“ само PIN_nn в колоната Location, а останалите параметри (I/O standard, Current Strench и Slew Rate) можете да оставите по подразбиране или да изберете същите, които се предлагат от по подразбиране (по подразбиране), така че да няма предупреждение "ов.

Как мога да разбера кой PIN отговаря на номера на конектора на платката?

Номерата на щифтовете на конектора са отбелязани на платката


А щифтовете на FPGA, към които са свързани контактите на конектора, са описани в документацията, която се доставя с платката FPGA.




След като щифтовете са присвоени, компилирам проекта отново и го флашвам с помощта на USB програматор. Ако нямате инсталирани драйвери за USB Byte blaster програматора, кажете на Windows, че те се намират в папката, в която сте инсталирали Quartus. Тогава тя сама ще го намери.

Програматорът трябва да бъде свързан към JTAG конектора. И елементът от менюто за програмиране е „Инструменти -> Програмист“ (или щракнете върху иконата в лентата с инструменти). Бутонът „Старт“, радостният „Успех“ и фърмуерът вече са вътре в FPGA и вече работят. Просто не изключвайте FPGA, в противен случай ще забрави всичко.

Инструменти -> Програмист


DAC е свързан към конектора на платката FPGA. Към изхода на DAC свързвам осцилоскоп S1-112A. Резултатът трябва да бъде "трион", тъй като частта от висок ред на DDS думата на фазовия акумулатор се извежда към 8-битовия изход. И винаги се увеличава, докато прелее.

Около 1,5 часа и за честота 1000 Hz виждам следната осцилограма:

Бих искал да отбележа, че „трионът“ има малка фрактура в средата. Това се дължи на факта, че резисторите имат диапазон от стойности.

Друг важен момент, който трябваше да се изясни, е максималната възможна честота, с която ще работи DDS генераторът. С правилно конфигурирани параметри на TimeQuest, след компилация в „Отчет за компилация“ можете да видите, че скоростта на веригата е над 200 MHz с марж. Това означава, че ще умножа честотата на генератора от 50 MHz с помощта на PLL, ще увелича стойността на DDS фазовия акумулатор с честота от 200 MHz. Крайният честотен диапазон, който може да се получи при нашите условия е 0 - 100 MHz. Точност на настройката на честотата:

200 000 000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
Тоест, по-добре е от ~0,05 Hz. Смятам, че точността от част от херца е достатъчна за генератор с такъв диапазон на работни честоти (0...100 MHz). Ако някой трябва да повиши точността, за да направите това, можете да увеличите дълбочината на битовете на DDS (не забравяйте да проверите TimeQuest Timing Analyzer, че работната скорост на логическата верига е в рамките на CLK = 200 MHz, защото това е суматор), или просто намалете тактовата честота, ако не е необходим такъв широк честотен диапазон.

Времеви анализатор TimeQuest


След като видях „видя“ на екрана, семейни дела ме принудиха да отида на село (беше почивен ден). Там косих, готвих, пекох и нямах представа за изненадата, която ме очакваше вечерта. По-близо до нощта, преди да си легна, реших да погледна формата на сигнала за други честоти.

За честота 100 kHz

За честота 250 kHz

За честота 500 kHz

За 1 MHz честота

Втори ден

Поради факта, че беше интересно как DAC ще работи на резистори от 100 и 200 ома, веднага взех поялника. Този път DAC се оказа по-точен и отне по-малко време за инсталирането му.

Поставяме DAC на FPGA платката и го свързваме към осцилоскопа

Проверка на 1 MHz - VO! Това е съвсем друга работа!

Видях 10 MHz

Видях 25 MHz


Формата на 10 MHz трион все още е подобна на правилната. Но при 25 MHz вече изобщо не е „красиво“. C1-112a обаче има честотна лента 10 MHz, така че в този случай причината може вече да е в осцилоскопа.

По принцип този въпрос с DAC може да се счита за приключен. Сега нека вземем вълнови форми на високоскоростния изход. За да направим това, ще изведем най-значимия бит към отделен PIN на FPGA. Ще вземем данните за този ред от най-значимия бит на DDS акумулатора.

Присвояване hs_out = акумулатор;

Правоъгълна вълна 1 MHz

Правоъгълна вълна 5 MHz

Правоъгълна вълна 25 MHz

Правоъгълната вълна от 50 MHz вече е почти невидима


Но мисля, че изходът на FPGA трябва да бъде зареден със съпротива. Може би фронтовете ще са по-стръмни.

Синусът се извършва според таблицата. Размерът на таблицата е 256 стойности от 8 бита. Можеше да взема повече, но вече имах готов mif файл. С помощта на съветника създаваме ROM елемент с данни от синусовата таблица от mif файла.

Създаване на ROM - Инструменти -> Mega Wizard Plugin manager


Изберете 1 порт ROM и дайте име на модула

Ние сме съгласни

И тук сме съгласни

Използвайки преглед, намираме нашия mif файл със синусовата таблица

И тук нищо не променяме.

Премахнете отметката от модула sine_rom_bb.v - не е необходим. Следващ финал. Quartus ще поиска да добави модул към проекта - съгласни сме. След това модулът може да се използва точно като всеки друг модул във Verilog.


Горните 8 бита на DDS акумулаторната дума ще се използват като ROM адрес, а изходните данни ще бъдат синусовата стойност.

Код

//синус rom проводник sine_out; sine_rom sine1(.clock(clk200M), .address(акумулатор), .q(sine_out));


Осцилограмата на синусоида при различни честоти изглежда... еднакво.

Ако желаете, можете да обмислите проблеми с DAC, свързани с разпространението на резистора:

Е, това е краят на уикенда. Но софтуер за управление от компютър все още не е написан. Принуден съм да призная факта, че не спазих планираните срокове.

Ден трети

Има много малко време, така че пишем програмата набързо (в най-добрите традиции). На някои места, за да се намали броят на буквите и да се улесни въвеждането на информация от клавиатурата, се използва филтър за събития от името на джаджата. Моля, разберете и простете.

Интерфейс

Връзки с аналози

Не е пълен списък
Функционален DDS генератор. Създаден на базата на AVR. Честоти 0... 65534 Hz.
Преглед на DDS генератор GK101. Създаден с помощта на Altera MAX240 FPGA. Честоти до 10 MHz.
Многофункционален генератор на PIC16F870. Честотен обхват: 11 Hz - 60 kHz.
генератори Добавете тагове

Максимална честота - 65534 Hz ​​(и до 8 MHz HS изход с квадратна вълна). И тогава си помислих, че генераторът е отлична задача, където FPGA може да се покаже в най-добрия си вид. Като въпрос на спорт реших да повторя проекта на FPGA, като същевременно спазих крайните срокове в рамките на два уикенда и получих параметрите, които не са строго определени, а максимално възможните. Можете да разберете какво излезе от това под разреза.

Ден нула

Преди да настъпи уикенда, имах малко време да помисля за изпълнението. За да опростя задачата си, реших да направя генератора не като отделно устройство с бутони и LCD екран, а като устройство, което се свързва към компютър чрез USB. За това имам платка USB2RS232. Платката не изисква драйвери (CDC), следователно мисля, че ще работи под Linux (за някои това е важно). Освен това няма да крия, че вече съм работил с получаване на съобщения през RS232. Ще взема готови модули за работа с RS232 от opencores.com.

За да генерирате синусоидален сигнал, ще ви трябва DAC. Избрах типа DAC, както в оригиналния проект - R2R 8-bit. Той ще ви позволи да работите на високи честоти от порядъка на мегахерца. Убеден съм, че FPGA трябва да се справи с това

Мислех как да напиша програма за предаване на данни през COM порт. От една страна, можете да пишете в Delphi7; освен това размерът на изпълнимия файл няма да бъде голям. Също така се опитах да нахвърля нещо, което да работи със Serial под формата на java скрипт в html страница, но повече или по-малко работи само чрез серийния API на Chrome, но за това трябва да инсталирате плъгин... като цяло , също е изключено. Опитах PyQt5 като иновация за себе си, но когато разпространявате такъв проект, трябва да плъзнете куп библиотеки. След като се опитах да компилирам проект на PyQt в exe файл, се оказа, че е повече от 10 MB. Тоест няма да е по-добро от приложение, написано на C++\Qt5. Също така си струва да се има предвид, че нямам опит в разработването на python, но имам опит в Qt5. Следователно изборът падна върху Qt5. От петата версия се появи модул за работа със serial и вече съм работил с него. И приложение, базирано на Qt5, може да бъде прехвърлено на Linux и Mac (за някои това е важно), а от версия 5.2 приложенията, базирани на QWidgets, могат дори да бъдат прехвърлени на смартфон!

Какво още е необходимо? Естествено платката има FPGA. Имам две от тях (Cyclone iv EP4CE10E22C8N за 10 хиляди клетки и Cyclone ii EP2C5 за 5 хиляди клетки). Ще избера този отляво само и единствено заради по-удобния конектор. Като обем проектът няма намерение да бъде голям, така че ще се впише в едно от двете. Те не се различават по скорост на работа. И двете платки имат 50 MHz осцилатори на борда, а вътре в FPGA има PLL, с който мога да увелича честотата до планираните 200 MHz.

Първият ден

Поради факта, че вече бях направил DDS модула в моя проект за синтезатор, веднага хванах поялника и започнах да запоявам DAC с резистори. Взех прототипна платка. Инсталацията е извършена с помощта на . Единствената промяна, която повлия на технологията, беше, че изоставих киселината F38N за калайдисване на стойките в полза на ТТ индикаторния флюс гел. Същността на технологията е проста: запоявам стелажи в печатна платка и запоявам резистори върху тях от страната на печатната платка. Правя липсващите връзки чрез усукване. Освен това стелажите са удобни, защото мога да ги вкарам директно в FPGA платката.

За съжаление вкъщи нямаше налични резистори от 1 и 2 килоома. Нямаше време да отида до магазина. Трябваше да се откажа от едно от правилата си и да премахна резистори от старата ненужна платка. Там бяха използвани 15K и 30K резистори. Резултатът е този Франкенщайн:


След като създадете проекта, трябва да зададете целевото устройство: Menu Assigments -> Device


В проекта кодирах неконтролируемия главен DDS модул на фиксирана честота.

1000 Hz генераторен модул

модул signal_generator(clk50M, signal_out); входен проводник clk50M; кабелен изход signal_out; проводник clk200M; osc osc_200M reg акумулатор; присвояване на signal_out = акумулатор; //опитайте се да генерирате 1000 Hz //50 000 000 Hz - тактова честота на външния генератор //2^32 = 4 294 967 296 - DDS битова дълбочина - 32 бита //разделяне на 1000Hz / 50 000 000 Hz / 2 * 4294967296 => 42949, 67296 винаги @ (posedge clk50M) започнете акумулатор<= accumulator + 32"d42949; end endmodule


След това щракнах върху „Стартиране на компилация“, така че средата за разработка да попита какви входни/изходни линии имаме в основния модул на проекта и с какви физически PIN кодове са свързани присвоете редовете, които се появяват на истинските PIN кодове на чипа FPGA:

Елемент от менюто Присвоения -> Pin Planner

Моля, игнорирайте редовете HS_OUT, key0 и key1 засега, те се появяват в проекта по-късно, но нямах време да направя екранна снимка в самото начало.

По принцип е достатъчно да „регистрирате“ само PIN_nn в колоната Location, а останалите параметри (I/O standard, Current Strench и Slew Rate) можете да оставите по подразбиране или да изберете същите, които се предлагат от по подразбиране (по подразбиране), така че да няма предупреждение "ов.

Как мога да разбера кой PIN отговаря на номера на конектора на платката?

Номерата на щифтовете на конектора са отбелязани на платката


А щифтовете на FPGA, към които са свързани контактите на конектора, са описани в документацията, която се доставя с платката FPGA.




След като щифтовете са присвоени, компилирам проекта отново и го флашвам с помощта на USB програматор. Ако нямате инсталирани драйвери за USB Byte blaster програматора, кажете на Windows, че те се намират в папката, в която сте инсталирали Quartus. Тогава тя сама ще го намери.

Програматорът трябва да бъде свързан към JTAG конектора. И елементът от менюто за програмиране е „Инструменти -> Програмист“ (или щракнете върху иконата в лентата с инструменти). Бутонът „Старт“, радостният „Успех“ и фърмуерът вече са вътре в FPGA и вече работят. Просто не изключвайте FPGA, в противен случай ще забрави всичко.

Инструменти -> Програмист


DAC е свързан към конектора на платката FPGA. Към изхода на DAC свързвам осцилоскоп S1-112A. Резултатът трябва да бъде "трион", тъй като частта от висок ред на DDS думата на фазовия акумулатор се извежда към 8-битовия изход. И винаги се увеличава, докато прелее.

Около 1,5 часа и за честота 1000 Hz виждам следната осцилограма:

Бих искал да отбележа, че „трионът“ има малка фрактура в средата. Това се дължи на факта, че резисторите имат диапазон от стойности.

Друг важен момент, който трябваше да се изясни, е максималната възможна честота, с която ще работи DDS генераторът. С правилно конфигурирани параметри на TimeQuest, след компилация в „Отчет за компилация“ можете да видите, че скоростта на веригата е над 200 MHz с марж. Това означава, че ще умножа честотата на генератора от 50 MHz с помощта на PLL, ще увелича стойността на DDS фазовия акумулатор с честота от 200 MHz. Крайният честотен диапазон, който може да се получи при нашите условия е 0 - 100 MHz. Точност на настройката на честотата:

200 000 000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
Тоест, по-добре е от ~0,05 Hz. Смятам, че точността от част от херца е достатъчна за генератор с такъв диапазон на работни честоти (0...100 MHz). Ако някой трябва да повиши точността, за да направите това, можете да увеличите дълбочината на битовете на DDS (не забравяйте да проверите TimeQuest Timing Analyzer, че работната скорост на логическата верига е в рамките на CLK = 200 MHz, защото това е суматор), или просто намалете тактовата честота, ако не е необходим такъв широк честотен диапазон.

Времеви анализатор TimeQuest


След като видях „видя“ на екрана, семейни дела ме принудиха да отида на село (беше почивен ден). Там косих, готвих, пекох и нямах представа за изненадата, която ме очакваше вечерта. По-близо до нощта, преди да си легна, реших да погледна формата на сигнала за други честоти.

За честота 100 kHz

За честота 250 kHz

За честота 500 kHz

За 1 MHz честота

Втори ден

Поради факта, че беше интересно как DAC ще работи на резистори от 100 и 200 ома, веднага взех поялника. Този път DAC се оказа по-точен и отне по-малко време за инсталирането му.

Поставяме DAC на FPGA платката и го свързваме към осцилоскопа

Проверка на 1 MHz - VO! Това е съвсем друга работа!

Видях 10 MHz

Видях 25 MHz


Формата на 10 MHz трион все още е подобна на правилната. Но при 25 MHz вече изобщо не е „красиво“. C1-112a обаче има честотна лента 10 MHz, така че в този случай причината може вече да е в осцилоскопа.

По принцип този въпрос с DAC може да се счита за приключен. Сега нека вземем вълнови форми на високоскоростния изход. За да направим това, ще изведем най-значимия бит към отделен PIN на FPGA. Ще вземем данните за този ред от най-значимия бит на DDS акумулатора.

Присвояване hs_out = акумулатор;

Правоъгълна вълна 1 MHz

Правоъгълна вълна 5 MHz

Правоъгълна вълна 25 MHz

Правоъгълната вълна от 50 MHz вече е почти невидима


Но мисля, че изходът на FPGA трябва да бъде зареден със съпротива. Може би фронтовете ще са по-стръмни.

Синусът се извършва според таблицата. Размерът на таблицата е 256 стойности от 8 бита. Можеше да взема повече, но вече имах готов mif файл. С помощта на съветника създаваме ROM елемент с данни от синусовата таблица от mif файла.

Създаване на ROM - Инструменти -> Mega Wizard Plugin manager


Изберете 1 порт ROM и дайте име на модула

Ние сме съгласни

И тук сме съгласни

Използвайки преглед, намираме нашия mif файл със синусовата таблица

И тук нищо не променяме.

Премахнете отметката от модула sine_rom_bb.v - не е необходим. Следващ финал. Quartus ще поиска да добави модул към проекта - съгласни сме. След това модулът може да се използва точно като всеки друг модул във Verilog.


Горните 8 бита на DDS акумулаторната дума ще се използват като ROM адрес, а изходните данни ще бъдат синусовата стойност.

Код

//синус rom проводник sine_out; sine_rom sine1(.clock(clk200M), .address(акумулатор), .q(sine_out));


Осцилограмата на синусоида при различни честоти изглежда... еднакво.

Ако желаете, можете да обмислите проблеми с DAC, свързани с разпространението на резистора:

Е, това е краят на уикенда. Но софтуер за управление от компютър все още не е написан. Принуден съм да призная факта, че не спазих планираните срокове.

Ден трети

Има много малко време, така че пишем програмата набързо (в най-добрите традиции). На някои места, за да се намали броят на буквите и да се улесни въвеждането на информация от клавиатурата, се използва филтър за събития от името на джаджата. Моля, разберете и простете.

Интерфейс

Връзки с аналози

Не е пълен списък
Функционален DDS генератор. Създаден на базата на AVR. Честоти 0... 65534 Hz.
Преглед на DDS генератор GK101. Създаден с помощта на Altera MAX240 FPGA. Честоти до 10 MHz.
Многофункционален генератор на PIC16F870. Честотен обхват: 11 Hz - 60 kHz.
генератори
  • Qt5
  • Добави тагове

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

    Така че в моя случай списъкът с това оборудване далеч не беше пълен и липсваше генератор на сигнали.

    Генератор на сигналиОказа се, че е лесно да си направите сами от налични радио елементи и в крайна сметка не е скъпо. Така че, след като се разрових в Интернет, намерих голям брой схеми за различни генератори, включително по-модерни модели с DAC, но вече скъпи за производство. Като начало се спрях на простия. DDS генератор на сигналина микроконтролера ATMEGA8 от Atmel. Това не съм подобрил или променил нищо - оставих всичко както е, просто създадох копие и освен това не претендирам за авторството на това устройство.

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

    Показване на информация в генератор на сигналипроизведени на 16x2 символен LCD дисплей с HD44780 контролер. Трябва да се отбележи, че за да се спестят портовете на микроконтролера, LCD дисплеят се управлява само чрез три проводника; това е постигнато с помощта на регистър за изместване - прочетете как да свържете дисплей чрез три проводника.

    Необходимо е запазване на портове, 8 порта се използват за резистивен DAC, 7 порта за бутони. В оригиналната статия авторът обеща да използва PWM модулация, но очевидно не я е завършил, тъй като е започнал да разработва по-усъвършенствана версия на ATMEGA16.

    Принципна схема на генератор на DDS сигналии печатна платка.

    Веригата и платките са показани в оригинала;

    За DAC специално купих прецизни резистори с грешка ±0,05%, но както се оказа, простите с грешка ±5% са напълно достатъчни. Формата на сигнала беше доста приемлива за всички видове сигнали.

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

    Работата с устройството е проста - изберете формата на сигнала, задайте желаната честота и можете да промените стъпката на настройка на честотата с граници от 1 - 10 - 100 - 1000 Hz на стъпка. След това щракнете върху Старт и генераторът започва да работи. Трябва да се отбележи, че когато генераторът се стартира, честотата и формата на сигнала не могат да бъдат променени, това се дължи на факта, че програмата преминава в безкраен цикъл и за да се увеличи максималната честота на генериране, процедурата за запитване на бутона трябваше да бъдат премахнати. За да спрете генерирането, щракнете върху стоп/нулиране, това рестартира програмата и тя се връща в менюто с настройки. Ето го нюанса.

    Отделно бих искал да ви разкажа за производството на корпуса на генератора. Можете да закупите готов калъф в магазин или да използвате подходящ от друго устройство, но аз реших да го направя изцяло сам. Парче двустранно фибростъкло лежеше празно, което дарих на тялото.

    Първо, трябва да вземете всички измервания, размерите на LCD дисплея и платката на генератора на сигнали, захранването, конекторите и бутоните, след което да го поставите върху лист хартия, както ще бъде вътре в кутията. Въз основа на получените размери можете да започнете производството.

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

    Схематична диаграма на генератора на MK

    Настройки на устройството

    • Честотен обхват: 10 Hz - 60 kHz
    • Цифрово регулиране на честотата в 3 различни стъпки
    • Вълнови форми: синусоида, триъгълник, квадрат, трион, H-импулс, L-импулс, взрив, размахване, шум
    • Изходен диапазон: 15V за синус и триъгълник, 0-5V за други режими
    • Има изход за импулсна синхронизация

    Устройството се захранва от 12 волта AC, което осигурява достатъчно високо (над 18 V) постоянно напрежение, необходимо за нормална работа на 78L15 и 79L15, които образуват биполярна 15 V верига. Това се прави, за да може микросхемата LF353 да изведе пълен набор от сигнали към товара 1 kOhm.

    Използван контролер за ниво ALPS SRBM1L0800. Веригата трябва да използва резистори с ±1% толеранс или по-добро. LED токоограничители - резистори от серия 4306R. Яркостта може да се увеличи в зависимост от предпочитанията на изпълнителя. Генераторът е сглобен в пластмасов корпус 178x154x36 мм с алуминиеви преден и заден панел.

    Много контактни компоненти са монтирани на предния и задния панел (бутони, копчета, RCA конектори, LED модули, захранващ конектор). Печатните платки са закрепени към корпуса с болтове с пластмасови разделители. Всички останали елементи на генератора са монтирани на печатни платки - захранването е отделно. Левият бутон в средата е за промяна на режима, десният е за избор на честота на режима.

    Генераторът издава различни сигнали и работи в три режима, които се избират с бутона "Избор" и се индикират от трите горни (на схемата) светодиода. Въртящият се контрол променя параметрите на сигнала според следната таблица:

    Веднага след настройка в режим 1 се получава генериране на синус. Началната честота обаче е доста ниска и е необходимо поне едно щракване на енкодера, за да се увеличи. Платката има контакт за свързване на устройството за програмиране, което ви позволява бързо да промените функционалността на генератора на сигнали, ако е необходимо. Всички файлове на проекта - PIC16F870 фърмуер, чертежи на платка, са разположени

    Този DDS функционален генератор (версия 2.0) на сигнали е сглобен на AVR микроконтролер, има добра функционалност, има контрол на амплитудата и също е сглобен на едностранна печатна платка.

    Този генератор е базиран на алгоритъма за генериране на Jesper DDS, програмата е модернизирана за AVR-GCC C с вмъквания на код за сглобяване. Генераторът има два изходни сигнала: първият е DDS сигнали, вторият е високоскоростен (1..8 MHz) „правоъгълен“ изход, който може да се използва за съживяване на MK с неправилни мъхове и за други цели.
    Високоскоростният HS (High Speed) сигнал се взема директно от микроконтролера Atmega16 OC1A (PD5).
    DDS сигналите се генерират от други MC изходи чрез резистивна R2R матрица и чрез чип LM358N, който позволява регулиране на амплитудата и отместването на сигнала. Отместването и амплитудата се регулират с помощта на два потенциометъра. Офсетът може да се регулира в диапазона +5V..-5V, а амплитудата е 0...10V. Честотата на DDS сигналите може да се регулира в диапазона от 0... 65534 Hz, това е повече от достатъчно за тестване на аудио вериги и други радиолюбителски задачи.

    Основни характеристики на DDS генератор V2.0:
    - проста схема с обикновени и евтини радиоелементи;
    - едностранна печатна платка;
    - вградено захранване;
    - отделен високоскоростен изход (HS) до 8 MHz;
    - DDS сигнали с променлива амплитуда и отместване;
    - DDS сигнали: синус, правоъгълник, трион и обратен трион, триъгълник, ЕКГ сигнал и шумов сигнал;
    - 2×16 LCD екран;
    - интуитивна клавиатура с 5 бутона;
    - стъпки за настройка на честотата: 1, 10, 100, 1000, 10000 Hz;
    - запомняне на последното състояние след включване на захранването.

    Блоковата диаграма по-долу показва логическата структура на генератор на функции:

    Както можете да видите, устройството изисква няколко захранващи напрежения: +5V, -12V, +12V. Напреженията +12V и -12V се използват за регулиране на амплитудата и отместването на сигнала. Захранването е проектирано с помощта на трансформатор и няколко стабилизатора на напрежението:

    Захранването е сглобено на отделна платка:

    Ако не искате сами да сглобявате захранването, можете да използвате обикновено ATX захранване от компютър, където вече има всички необходими напрежения. Оформление на ATX конектора.

    LCD екран

    Всички действия се показват на LCD екран. Генераторът се управлява с пет клавиша

    Бутоните нагоре/надолу се използват за придвижване през менюто, бутоните наляво/надясно се използват за промяна на стойността на честотата. При натискане на централния клавиш избраният сигнал започва да се генерира. Повторното натискане на бутона спира генератора.

    Предоставя се отделна стойност за задаване на стъпката на промяна на честотата. Това е удобно, ако трябва да промените честотата в широк диапазон.

    Генераторът на шум няма никакви настройки. Той използва обичайната функция rand(), която непрекъснато се подава към изхода на DDS генератора.

    Високоскоростният HS изход има 4 честотни режима: 1, 2, 4 и 8 MHz.

    Схематична диаграма

    Веригата на генератора на функции е проста и съдържа лесно достъпни елементи:
    - Микроконтролер AVR Atmega16, с външен кварц на 16 MHz;
    - стандартен LCD екран тип HD44780 2×16;
    - R2R DAC матрица от обикновени резистори;
    - операционен усилвател LM358N (домашен аналог на KR1040UD1);
    - два потенциометъра;
    - пет ключа;
    - няколко конектора.

    Плащане:

    Функционалният генератор е сглобен в пластмасова кутия:


    Софтуер

    Както казах по-горе, базирах програмата си на алгоритъма за генератор на Jesper DDS. Добавих няколко реда код за сглобяване, за да реализирам спирането на генерирането. Сега алгоритъмът съдържа 10 CPU цикъла, вместо 9.

    void static inline Signal_OUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0)(
    asm volatile("eor r18, r18 ;r18<-0″ "\n\t"
    "eor r19, r19 ;r19<-0″ "\n\t"
    "1:" "\n\t"
    "добавете r18, %0 ;1 цикъл" "\n\t"
    "adc r19, %1 ;1 цикъл" "\n\t"
    "adc %A3, %2 ;1 цикъл" "\n\t"
    "lpm ;3 цикъла" "\n\t"
    "излиза %4, __tmp_reg__ ;1 цикъл" "\n\t"
    "sbis %5, 2; 1 цикъл, ако няма пропускане" "\n\t"
    "rjmp 1b ;2 цикъла. Общо 10 цикъла" "\n\t"
    :
    :"r" (ad0),,"r" (ad1),,"r" (ad2),,"e" (сигнал),,"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR ))
    :"r18″, "r19″
    );}

    Таблицата с DDS сигнални форми се намира във флаш паметта на MK, чийто адрес започва с 0xXX00. Тези секции са дефинирани в make-файла, в подходящите места в паметта:
    #Дефиниране на секции, където да се съхраняват таблици със сигнали
    LDFLAGS += -Wl,-section-start=.MySection1=0x3A00
    LDFLAGS += -Wl,-section-start=.MySection2=0x3B00
    LDFLAGS += -Wl,-section-start=.MySection3=0x3C00
    LDFLAGS += -Wl,-section-start=.MySection4=0x3D00
    LDFLAGS += -Wl,-section-start=.MySection5=0x3E00
    LDFLAGS += -Wl,-section-start=.MySection6=0x3F00