- Шта је ДДС генератор функција?
- Разумевање рада ИЦ функције генератора функција АД9833
- Компоненте потребне за изградњу генератора функција заснованог на АД9833
- Генератор функција заснован на АД9833 - шематски дијаграм
- Генератор функција заснован на АД9833 - Ардуино код
- Тестирање генератора функција заснованог на АД9833
- Даља побољшања
Ако сте љубитељ електронике попут мене и желите да се прилагодите различитим електронским колима, поседовање пристојног генератора функција понекад постаје обавезно. Али поседовање једног је проблем јер таква основна опрема може коштати богатство. Изградња сопствене опреме за тестирање није само јефтинија већ и одличан начин да побољшате своје знање.
Дакле, у овом чланку ћемо изградити једноставан генератор сигнала са Ардуином и АД9833 ДДС функцијским модулом генератора који могу да производе синусне, квадратне и троугласте таласе са максималном фреквенцијом од 12 МХз на излазу. И на крају, тестираћемо излазну фреквенцију уз помоћ нашег осцилоскопа.
Претходно смо изградили једноставан генератор синусних таласа, генератор квадратних таласа и генератор таласа троугла уз помоћ основних аналогних кола. Можете их провјерити ако тражите неке основне кругове генератора таласних облика. Такође, ако желите да направите јефтинији генератор Ардуино функције без коришћења АД9833 модула, можете погледати пројекат „Направи сам Ардуино таласни генератор“.
Шта је ДДС генератор функција?
Као што и само име говори, функцијски генератор је уређај који може подесити одређени таласни облик са одређеном фреквенцијом по подешавању. На пример, узмите у обзир да имате ЛЦ филтер за који желите да тестирате свој излазни фреквенцијски одзив, то можете лако учинити уз помоћ генератора функција. Све што треба да урадите је да подесите жељену излазну фреквенцију и таласни облик, а затим га можете окретати према доле или горе да бисте тестирали одговор. Ово је био само један пример, с тим можете да радите више ствари како се листа наставља.
ДДС је скраћеница од Дирецт Дигитал Синтхесис. То је тип генератора таласних облика који користи дигитално аналогне претвараче (ДАЦ) за изградњу сигнала од темеља. Ова метода се посебно користи за стварање синусног таласа. Али ИЦ који користимо може произвести квадратне или трокутасте таласне сигнале. Операције које су се догодиле унутар ДДС чипа су дигиталне, тако да може врло брзо пребацити фреквенцију или се врло брзо пребацити са једног сигнала на други. Овај уређај има фину фреквенцијску резолуцију са широким фреквенцијским спектром.
Разумевање рада ИЦ функције генератора функција АД9833
Срж нашег пројекта је ИЦ9898 програмабилни ИЦ генератор генератора таласа који су дизајнирани и развијени од аналогних уређаја. То је програмирљиви генератор таласних облика мале снаге, способан да производи синусни, троугласти и квадратни талас са максималном фреквенцијом од 12 МХз. То је врло јединствена ИЦ која је способна да промени излазну фреквенцију и фазу помоћу само софтверског програма. Има 3-жични СПИ интерфејс, због чега комуникација са овом ИЦ постаје врло једноставна и лака. Дијаграм функционалних блокова овог ИЦ приказан је у наставку.
Рад ове ИЦ је врло једноставан. Ако погледамо горњи функционални блок дијаграм, приметићемо да имамо фазни акумулатор чији је задатак да ускладишти све могуће дигиталне вредности синусног таласа, почевши од 0 до 2π. Даље, имамо СИН РОМ чији је посао претварање информација о фази које се касније могу директно пресликати у амплитуду. СИН РОМ користи дигиталне информације о фази као адресу табели за претраживање и претвара информације о фази у амплитуду. И на крају, имамо 10-битни дигитални у аналогни претварач чији је задатак да прима дигиталне податке са СИН РОМ-а и претвара их у одговарајуће аналогне напоне, то је оно што добијамо на излазу. На излазу имамо и прекидач који можемо укључити или искључити са само мало софтверског кода. О томе ћемо говорити касније у чланку.Детаљи које видите горе су врло огољена верзија онога што се дешава унутар ИЦ-а, а већина детаља које видите горе преузети су из табеле података АД9833, а можете је погледати и за додатне информације.
Компоненте потребне за изградњу генератора функција заснованог на АД9833
Компоненте потребне за изградњу генератора функција заснованих на АД9833 наведене су у наставку, ово коло смо дизајнирали са врло генеричким компонентама, што поступак репликације чини врло једноставним.
- Ардуино Нано - 1
- АД9833 ДДС функцијски генератор - 1
- 128 Кс 64 ОЛЕД екран - 1
- Генерички ротациони кодер - 1
- ДЦ бачва Јацк - 1
- ЛМ7809 Регулатор напона - 1
- Кондензатор 470уФ - 1
- Кондензатор 220уФ - 1
- Кондензатор 104пФ - 1
- Отпорник 10К - 6
- Тактилни прекидачи - 4
- Вијчана стезаљка 5.04мм - 1
- Женско заглавље - 1
- Извор напајања 12В - 1
Генератор функција заснован на АД9833 - шематски дијаграм
Комплетна шема кола за АД9833 и генератор функција заснованих на Ардуину приказана је у наставку.
Користићемо АД9833 са Ардуином за генерисање жељене фреквенције. И у овом одељку ћемо објаснити све детаље уз помоћ шеме; даћу вам кратак преглед онога што се дешава са струјним кругом. Почнимо са модулом АД9833. Модул АД9833 је модул генератора функција и повезан је са Ардуином у складу са шемом. За напајање кола користимо ИЦ ЛМ7809 регулатор напона са пристојним кондензатором за одвајање, што је неопходно, јер шум напајања може ометати излазни сигнал што резултира нежељеним излазом. Као и увек, Ардуино ради као мозак за овај пројекат. Да бисмо приказали подешену фреквенцију и друге драгоцене информације, повезали смо 128 Кс 64 ОЛЕД модул за приказ. Да бисмо променили фреквенцијски опсег, користимо три прекидача. Први подешава фреквенцију на Хз, други подешава излазну фреквенцију на КХз, а трећи подешава фреквенцију на МХз, имамо и друго дугме помоћу којег се може омогућити или онемогућити излаз. Коначно, имамо ротациони кодер,и уз њега морамо да прикачимо неки отпорник за извлачење, у супротном ти прекидачи неће радити јер проверавамо догађај притиска тастера на методи удруживања. Ротацијски кодер се користи за промену фреквенције, а тактилни прекидач унутар ротационог кодера користи се за одабир подешеног таласног облика.
Генератор функција заснован на АД9833 - Ардуино код
Комплетни код који се користи у овом пројекту налази се на дну ове странице. Након додавања потребних датотека заглавља и изворних датотека, требали бисте бити у могућности да директно компајлирате датотеку Ардуино. Можете преузети ад9833 Ардуино библиотеку и друге библиотеке са доње везе, или можете користити методу управника одбора да бисте инсталирали библиотеку.
- Преузми библиотеку АД9833, аутор Билл Виллиамс
- Преузмите ССД1306 ОЛЕД библиотеку компаније Адафруит
- Преузмите библиотеку Адафруит ГФКС
Објашњење кода у ино. датотека је следећа. Прво започињемо укључивањем свих потребних библиотека. Библиотеку за АД9833 ДДС модул прво прати библиотека за ОЛЕД, а математичка библиотека је потребна за неке од наших прорачуна.
#инцлуде // ЛИбрари за АД9833 Модуле #инцлуде
Даље, дефинишемо све потребне улазне и излазне пинове за дугмад, прекидач, ротациони кодер и ОЛЕД-ове.
#дефине СЦРЕЕН_ВИДАТА_ПИНХ 128 // ОЛЕД ширина екрана у пикселима #дефине СЦРЕЕН_ХЕИГХТ 64 // ОЛЕД висина екрана, у пикселима #дефине СЕТ_ФРЕКУЕНЦИ_ХЗ А2 // тастер за подешавање фреквенције у Хз #дефине СЕТ_ФРЕКУЕНЦИ_КХЗ АХ // СЕТ дугме ХЗФ_ХЗФ_ХЗФ_ХЗФ_ХЗФ_ХЗФ_ХЗФ_ХЗФ_ХЗФ_ХЗФ_ХЗФ_ХЗФ_ХЗФ_ХЗФ_ХЗФ_ХЗФ_ХЗФ_ХЗФ_ХЗФ_КВЗФ_КВЗФ_КВЗФ.ЗА ЧВ.З.Ф.З.З.З.З.З.З.Ч.З.Ч.З.З.Ч.З.З..Ч..З…З…..Д. А6 // Тастер за подешавање фреквенције у МХз #дефине ЕНАБЛЕ_ДИСАБЛЕ_ОУТПУТ_ПИН А7 // Тастер за омогућавање / онемогућавање излаза #дефине ФНЦ_ПИН 4 // Фсинц захтева АД9833 модул #дефине ЦЛК_ПИН 8 // Цлоцк Пин оф тхе Енцодер #Пин 7 / Подаци за кодирање #дефине БТН_ПИН 9 // Интерно дугме на кодеру
Након тога дефинишемо све потребне променљиве које су потребне у овом коду. Прво дефинишемо бројач променљивих целобројних вредности који ће сачувати вредност ротационог кодера. Следеће две променљиве цлоцкПин и цлоцкПинСтате чувају статуу пин-а која је потребна за разумевање смера кодера. Имамо временску променљиву која садржи тренутне вредности бројача тајмера. Ова променљива се користи за отказивање тастера. Даље, имамо непотписани дугачки променљиви модулеФрекуенци који садржи израчунату фреквенцију која ће се применити. Даље, имамо одлагање отказивања. Ово кашњење се може прилагодити према потреби. Даље, имамо три логичке променљиве сет_фрекуенци_хз,сет_фрекуенци_Кхз и сет_фрекуенци_Мхз ове три променљиве се користе за одређивање тренутне поставке модула. О томе ћемо детаљније говорити касније у чланку. Даље, имамо променљиву која чува статус излазног таласног облика, задати излазни таласни облик је синусни талас. И на крају, имамо променљиву енцодер_бтн_цоунт која садржи број дугмета кодера која се користи за подешавање излазног таласног облика.
инт бројач = 1; // Ова вредност бројача ће се повећати или смањити ако се ротациони кодер окрене инт цлоцкПин; // Плацехолдер за статус пина који користи ротациони кодер инт цлоцкПинСтате; // Плацехолдер за статус пина који користи ротациони кодер унсигнед лонг тиме = 0; // Користи се за уклањање непотписаних дугих модулеФрекуенци; // користи се за подешавање излазне фреквенције лонг дебоунце = 220; // Одгода одбијања боол бтн_стате; // користи се за омогућавање онемогућавања излаза модула АД98333 боол сет_фрекуенци_хз = 1; // Учесталост сметњи модула АД9833 боол сет_фрекуенци_кхз; боол сет_фрекуенци_мхз; Стринг вавеСелецт = "СИН"; // Стартни таласни облик модула инт енцодер_бтн_цоунт = 0; // користи се за проверу притиска на дугме кодера Даље, имамо наша два објекта један је за ОЛЕД екран, а други за АД9833 модул.Екран Адафруит_ССД1306 (СЦРЕЕН_ВИДАТА_ПИНХ, СЦРЕЕН_ХЕИГХТ, & Вире, -1); АД9833 ген (ФНЦ_ПИН);
Даље, имамо нашу функцију сетуп (), у тој функцији подешавања почињемо са омогућавањем Сериал-а за отклањање грешака. Модул АД9833 иницијализујемо помоћу методе бегин (). Даље, поставили смо све додељене пинове ротационог кодера као улаз. А вредност пин-а сата чувамо у променљивој цлоцкПинСтате, ово је неопходан корак за ротациони кодер.
Даље, постављамо све пинове дугмета као улаз и омогућавамо ОЛЕД екран помоћу методе дисплаи.бегин () , а такође проверавамо да ли има грешака помоћу наредбе иф . Када је то готово, обришемо екран и исписујемо почетни екран, додајемо кашњење од 2 секунде, што је уједно и кашњење за почетни екран, и на крају позивамо функцију упдате_дисплаи () која брише екран и ажурира поново приказати. О детаљима методе упдате_дисплаи () биће речи касније у чланку.
воид сетуп () {Сериал.бегин (9600); // Омогући Сериал @ 9600 бауд ген.Бегин (); // Ово МОРА бити прва наредба након проглашења АД9833 објекта пинМоде (ЦЛК_ПИН, ИНПУТ); // Постављање пинова као улазног пинМоде (ДАТА_ПИН, ИНПУТ); пинМоде (БТН_ПИН, ИНПУТ_ПУЛЛУП); цлоцкПинСтате = дигиталРеад (ЦЛК_ПИН); пинМоде (СЕТ_ФРЕКУЕНЦИ_ХЗ, ИНПУТ); // Постављање пинова као улазног пинМоде (СЕТ_ФРЕКУЕНЦИ_КХЗ, ИНПУТ); пинМоде (СЕТ_ФРЕКУЕНЦИ_МХЗ, ИНПУТ); пинМоде (ЕНАБЛЕ_ДИСАБЛЕ_ОУТПУТ_ПИН, ИНПУТ); иф (! дисплаи.бегин (ССД1306_СВИТЦХЦАПВЦЦ, 0к3Ц)) {// Адреса 0к3Д за 128к64 Сериал.принтлн (Ф („ССД1306 алокација није успела“)); за (;;); } дисплаи.цлеарДисплаи (); // обришите приказ екрана.сетТектСизе (2); // Постављање величине текста дисплаи.сетТектЦолор (БЕЛА); // поставља ЛЦД екран у боји.сетЦурсор (30, 0); // Постављање приказа курсора дисплаи.принтлн ("АД9833"); // Испис овог текстуалног приказа.сетЦурсор (17, 20); // Постављање приказа курсора дисплаи.принтлн ("Функција"); // испис овог текста дисплаи.сетЦурсор (13, 40); // Постављање приказа курсора дисплаи.принтлн ("Генератор"); // испис овог текста дисплаи.дисплаи (); // Ажурирање кашњења приказа (2000); // Кашњење 2 СЕЦ упдате_дисплаи (); // Позив упдате_дисплаи функција}
Даље, имамо своју функцију лооп (), све главне функционалности су написане у одељку петље.
Прво читамо Цлоцк пин ротационог кодера и чувамо га у променљивој цлоцкПин који смо раније декларисали. Даље, у изјави иф проверавамо да ли су претходна вредност пин-а и тренутна вредност пин-а сличне или не, а такође проверавамо и тренутну вредност пин-а. Ако је све тачно, проверавамо да ли постоји пин података, ако је тачно, то значи да се кодер ротира у смеру кретања казаљке на сату и вредност бројача смањујемо помоћу команде цоунтер--. Иначе повећавамо вредност бројача помоћу наредбе цоунтер ++. На крају, стављамо још једну наредбу иф да поставимо минималну вредност на 1. Затим ажурирамо цлоцкПинСтате тренутним цлоцкПинвредност за будућу употребу.
воид лооп () {цлоцкПин = дигиталРеад (ЦЛК_ПИН); иф (цлоцкПин! = цлоцкПинСтате && цлоцкПин == 1) {иф (дигиталРеад (ДАТА_ПИН)! = цлоцкПин) {цоунтер -; } елсе {цоунтер ++; // Енкодер ротира ЦВ тако да се повећава} иф (цоунтер <1) цоунтер = 1; Сериал.принтлн (бројач); упдате_дисплаи (); }
Даље, имамо свој код за откривање притиска на дугме. У овом одељку смо открили дугме унутар кодера уз помоћ неких угнеждених иф наредби, ако (дигиталРеад (БТН_ПИН) == ЛОВ && миллис () - тиме> деноунце), у овој изјави прво проверавамо да ли је дугме пин је низак или није, ако је низак, онда је притиснут. Затим поново проверавамо вредност тајмера са одлагањем кашњења, ако су обе изјаве истините, онда то проглашавамо успешном акцијом притиска дугмета ако тако повећавамо вредност енцодер_бтн_цоунт. Даље, декларишемо још један иф израз за постављање максималне вредности бројача на 2, потребан нам је јер га користимо за подешавање излазног таласног облика.Узастопне три наредбе иф то раде, ако је вредност нула, одабран је синусни таласни облик, ако је један, то је квадратни талас, а ако је вредност 2, то је троугласти талас. У све три ове наредбе иф, ажурирамо приказ функцијом упдате_дисплаи () . И на крају, ажурирамо временску променљиву тренутном вредностом бројача тајмера.
// Ако откријемо ЛОВ сигнал, притисне се дугме иф (дигиталРеад (БТН_ПИН) == ЛОВ && миллис () - тиме> дебоунце) {енцодер_бтн_цоунт ++; // Повећавамо вредности иф (енцодер_бтн_цоунт> 2) // ако је вредност већа од 2 ресетујте је на 0 {енцодер_бтн_цоунт = 0; } иф (енцодер_бтн_цоунт == 0) {// ако је вредност 0 одабран је синусни талас вавеСелецт = "СИН"; // ажурирање променљиве низа са грешком вредност упдате_дисплаи (); // ажурирање приказа} иф (енцодер_бтн_цоунт == 1) {// ако је вредност 1 квадратни талас је одабран вавеСелецт = "СКР"; // ажурирање променљиве низа са СКР вредношћу упдате_дисплаи (); // ажурирамо приказ} иф (енцодер_бтн_цоунт == 2) {// ако је вредност 1 одабран је троугласти талас вавеСелецт = "ТРИ"; // ажурирање променљиве низа са ТРИ вредношћу упдате_дисплаи ();// ажурирање приказа} време = милис (); // ажурирање временске променљиве}
Даље, дефинишемо сав потребан код потребан за подешавање свих дугмади са кашњењем прекида. Како су тастери повезани на аналогне пинове Ардуина, користимо аналогну команду за читање да бисмо идентификовали притискање тастера ако вредност аналогног очитања досегне испод 30, тада откривамо његово успешно притискање дугмета и чекамо 200 мс да проверите да ли је то стварно притискање тастера или само звук. Ако је ова изјава тачна, додељујемо логичке променљиве са вредностима које се користе за подешавање вредности Хз, Кхз и Мхз генератора функција. Даље, ажурирамо приказ и ажурирамо временску променљиву. То радимо за сва четири дугмета повезана са Ардуином.
иф (аналогРеад (СЕТ_ФРЕКУЕНЦИ_ХЗ) <30 && миллис () - тиме> дебоунце) {сет_фрекуенци_хз = 1; // ажурирање логичких вредности сет_фрекуенци_кхз = 0; сет_фрекуенци_мхз = 0; упдате_дисплаи (); // ажурирај време приказа = милис (); // ажурирај временску променљиву} иф (аналогРеад (СЕТ_ФРЕКУЕНЦИ_КХЗ) <30 && миллис () - тиме> дебоунце) {сет_фрекуенци_хз = 0; // ажурирање логичких вредности сет_фрекуенци_кхз = 1; сет_фрекуенци_мхз = 0; модулеФрекуенци = бројач * 1000; упдате_дисплаи (); // ажурирај време приказа = милис (); // ажурирај временску променљиву} иф (аналогРеад (СЕТ_ФРЕКУЕНЦИ_МХЗ) <30 && миллис () - тиме> дебоунце) {// провери аналогни пин са кашњењем дебоунце сет_фрекуенци_хз = 0; // ажурирање логичких вредности сет_фрекуенци_кхз = 0; сет_фрекуенци_мхз = 1; модулеФрекуенци = бројач * 1000000; упдате_дисплаи ();// ажурирање приказа времена = милис (); // ажурирање временске променљиве} иф (аналогРеад (ЕНАБЛЕ_ДИСАБЛЕ_ОУТПУТ_ПИН) <30 && миллис () - тиме> дебоунце) {// провера аналогног пина са кашњењем дебоунцеа бтн_стате =! бтн_стате; // Обрни стање дугмета ген.ЕнаблеОутпут (бтн_стате); // Омогући / онемогући излаз генератора функција у зависности од стања дугмета упдате_дисплаи (); // ажурирај време приказа = милис (); // ажурирај временску променљиву}}// ажурирање временске променљиве}}// ажурирање временске променљиве}}
Коначно, имамо нашу функцију упдате_дисплаи (). У овој функцији учинили смо много више од самог ажурирања овог екрана, јер се одређени део екрана не може ажурирати у ОЛЕД-у. Да бисте је ажурирали, морате је поново сликати новим вредностима. То много отежава поступак кодирања.
Унутар ове функције почињемо са брисањем екрана. Даље, поставили смо потребну величину текста. Након тога поставили смо курсор и одштампали Генератор функција са дисплаи.принтлн ("Функција Функција"); команда. Поново смо поставили величину текста на 2, а курсор на (0,20) уз помоћ функције дисплаи.сетЦурсор (0, 20).
Овде исписујемо информације за који талас се ради.
дисплаи.цлеарДисплаи (); // Прво очистите екран дисплаи.сетТектСизе (1); // постављање величине текста дисплаи.сетЦурсор (10, 0); // Постављање приказа курсора дисплаи.принтлн ("Генератор функција"); // испис текста тект.сетТектСизе (2); // постављање величине текста дисплаи.сетЦурсор (0, 20); // постављање положаја курсора
Даље, проверавамо логичке променљиве за детаље о фреквенцији и ажурирамо вредност у променљивој модулеФрекуенци. То радимо за вредности Хз, кХз и МХз. Даље, проверавамо променљиву вавеСелецт и идентификујемо који је талас одабран. Сада имамо вредности за подешавање типа и фреквенције таласа.
иф (сет_фрекуенци_хз == 1 && сет_фрекуенци_кхз == 0 && сет_фрекуенци_мхз == 0) {// проверите да ли је притиснуто дугме за подешавање фреквенције у Хз модулеФрекуенци = цоунтер; // ажурирај променљиву модулеФрекуенци са тренутном вредностом бројача} иф (сет_фрекуенци_хз == 0 && сет_фрекуенци_кхз == 1 && сет_фрекуенци_мхз == 0) {// проверите да ли је притиснуто дугме за подешавање фреквенције у КХз модулеФрекуенци = цоунтер * 1000; // ажурирај променљиву модулеФрекуенци са тренутном вредностом бројача, али множимо 1000 да бисмо је поставили на КХЗ} ако (сет_фрекуенци_хз == 0 && сет_фрекуенци_кхз == 0 && сет_фрекуенци_мхз == 1) {// проверити да ли је притиснуто дугме за подешавање фреквенције у МХз модулеФрекуенци = бројач * 1000000; иф (модулеФрекуенци> 12000000) {модулеФрекуенци = 12000000;// не дозволите да фреквенција буде већа од бројача од 12 МХз = 12; }} иф (вавеСелецт == "СИН") {// Одабран је синусни талас дисплаи.принтлн ("СИН"); ген.АпплиСигнал (СИНЕ_ВАВЕ, РЕГ0, модулеФрекуенци); Сериал.принтлн (модулеФрекуенци); } иф (вавеСелецт == "СКР") {// Одабран је Скр талас дисплаи.принтлн ("СКР"); ген.АпплиСигнал (СКУАРЕ_ВАВЕ, РЕГ0, модулеФрекуенци); Сериал.принтлн (модулеФрекуенци); } иф (вавеСелецт == "ТРИ") {// Три талас је изабран дисплаи.принтлн ("ТРИ"); ген.АпплиСигнал (ТРИАНГЛЕ_ВАВЕ, РЕГ0, модулеФрекуенци); // ажурирање модула АД9833. Сериал.принтлн (модулеФрекуенци); }} иф (вавеСелецт == "СКР") {// одабран је Скр талас дисплаи.принтлн ("СКР"); ген.АпплиСигнал (СКУАРЕ_ВАВЕ, РЕГ0, модулеФрекуенци); Сериал.принтлн (модулеФрекуенци); } иф (вавеСелецт == "ТРИ") {// Три талас је изабран дисплаи.принтлн ("ТРИ"); ген.АпплиСигнал (ТРИАНГЛЕ_ВАВЕ, РЕГ0, модулеФрекуенци); // ажурирање модула АД9833. Сериал.принтлн (модулеФрекуенци); }} иф (вавеСелецт == "СКР") {// одабран је Скр талас дисплаи.принтлн ("СКР"); ген.АпплиСигнал (СКУАРЕ_ВАВЕ, РЕГ0, модулеФрекуенци); Сериал.принтлн (модулеФрекуенци); } иф (вавеСелецт == "ТРИ") {// Три талас је изабран дисплаи.принтлн ("ТРИ"); ген.АпплиСигнал (ТРИАНГЛЕ_ВАВЕ, РЕГ0, модулеФрекуенци); // ажурирање модула АД9833. Сериал.принтлн (модулеФрекуенци); }
Поново постављамо курсор и ажурирамо вредности бројача. Поново проверавамо логичку вредност да бисмо ажурирали опсег фреквенција на екрану, морамо то да урадимо јер је принцип рада ОЛЕД-а врло чудан.
дисплаи.сетЦурсор (45, 20); дисплаи.принтлн (бројач); // исписати информације о бројачу на екрану. иф (сет_фрекуенци_хз == 1 && сет_фрекуенци_кхз == 0 && сет_фрекуенци_мхз == 0) {дисплаи.сетЦурсор (90, 20); дисплаи.принтлн ("Хз"); // испис Хз на екрану дисплаи.дисплаи (); // када сви комплети ажурирају приказ} иф (сет_фрекуенци_хз == 0 && сет_фрекуенци_кхз == 1 && сет_фрекуенци_мхз == 0) {дисплаи.сетЦурсор (90, 20); дисплаи.принтлн ("Кхз"); дисплаи.дисплаи (); // када сви комплети ажурирају приказ} иф (сет_фрекуенци_хз == 0 && сет_фрекуенци_кхз == 0 && сет_фрекуенци_мхз == 1) {дисплаи.сетЦурсор (90, 20); дисплаи.принтлн ("МХз"); дисплаи.дисплаи (); // када сви постављени ажурирају приказ}
Даље, проверавамо променљиву притиска дугмета за испис излаза на / излаз на ОЛЕД. Ово опет треба да се уради због ОЛЕД модула.
иф (бтн_стате) {дисплаи.сетТектСизе (1); дисплаи.сетЦурсор (65, 45); дисплаи.принт ("Оутпут ОН"); // испис излаза на екрану дисплаи.дисплаи (); дисплаи.сетТектСизе (2); } елсе {дисплаи.сетТектСизе (1); дисплаи.сетЦурсор (65, 45); дисплаи.принт ("Оутпут ОФФ"); // испис исписа искључен на екран дисплаи.дисплаи (); дисплаи.сетТектСизе (2); }
Ово означава крај нашег процеса кодирања. Ако сте у овом тренутку збуњени, можете да проверите коментаре у коду за даље разумевање.
Тестирање генератора функција заснованог на АД9833
За тестирање кола користи се горња поставка. Као што видите, прикључили смо адаптер за једносмерну струју од 12 В на прикључак за једносмерну струју, а на излаз круга повезали смо осцилоскоп Хантек. Такође смо осцилоскоп повезали са преносним рачунаром како бисмо визуализовали и измерили излазну фреквенцију.
Једном када је то учињено, помоћу ротационог кодера подешавамо излазну фреквенцију на 5Кхз и тестирамо излазни синусни талас и сасвим сигурно, то је 5Кхз синусни талас на излазу.
Даље, променили смо излазни таласни облик у троугласти талас, али фреквенција је остала иста, излазни таласни облик је приказан испод.
Затим смо променили излаз у квадратни талас и посматрали излаз, и то је био савршен квадратни талас.
Такође смо променили опсеге фреквенција и тестирали излаз, и то је функционисало добро.
Даља побољшања
Ово коло је само доказ концепта и потребно га је додатно побољшати. Прво, требају нам квалитетна ПЦБ и неки квалитетни БНЦ конектор за излаз, иначе не можемо добити већу фреквенцију. Амплитуда модула је врло ниска, тако да су нам потребни неки оп-амп кругови за појачавање излазног напона. Потенциометар се може повезати како би се варирала излазна амплитуда. Може се повезати прекидач за оффсет сигнала; ово је такође обавезна карактеристика. И даље, код треба пуно побољшања, јер је мало присутан. Коначно, ОЛЕД екране треба променити, иначе је немогуће написати лако разумљив код.
Ово је крај овог упутства, надам се да вам се свидео чланак и научили сте нешто ново. Ако имате било каквих питања у вези са чланком, можете их оставити у одељку за коментаре испод или можете користити наш форум за електронику.