107-DTMF генератор на сигнали на ATtiny2313
Решението за сглобяване на такова устройство беше продиктувано от желанието да се опитаме да реализираме сложни аналогови сигнали с помощта на микроконтролер. Не е планирано практическо приложение за това устройство, но кой може да използва такова устройство? Наслади се!

Работа на устройството.
Устройството генерира сложен двукомпонентен сигнал при натискане на бутон на масово използваната за подобни цели матрична клавиатура 4х4. Отстраних грешки в устройството с тази мембранна клавиатура.

В допълнение към формирането на звука на бутона, устройството дублира натисканията на клавиши, като издава съответните знаци чрез UART (цифри и главни латински букви). Устройството също генерира тонална последователност според низа от знаци, изпратен до UART. Например съобщението "4563245". Ако трябва да направите пауза в тоналното озвучаване, се използва символът "P". Например "8P097P111P22P33". UART параметри - Скорост на предаване: 9600, 8 данни, 2 стопбита, без паритет
Малко теория.
Тонът, генериран при натискане на клавиш, е сумата от два синусоидални сигнала с честоти, съответно на реда и колоната на натиснатия клавиш (тези честоти са посочени на диаграмата по-горе). Алгоритъмът за генериране на смесен сигнал е доста интересен, но не оригинален и не преоткрих колелото по нов начин. Ако се интересувате как се прави това, можете да прочетете съответния документ на Atmel
doc1982.pdf - Apnot AVR314: DTMF генератор
Фърмуер на микроконтролера.
Микроконтролерът може да работи: - като от вътрешен 8 MHz главен осцилатор (няма нужда от кварцов резонатор - краката трябва да се оставят "да висят във въздуха", но изходните честоти са по-малко точни ипо-голяма зависимост от външни фактори), - и от външен главен кристален осцилатор (кварц при 8 MHz) за по-точна работа. Когато изберете опцията за главен осцилатор, фърмуерът остава същият, само предпазителите ще бъдат различни (предпазителите са подобни на предишната статия, откъдето са взети). keypad_dtmf_out.hex - Фърмуерен DTMF генератор на ATtiny2313
106-fuse_8in.png - fusebits за опцията за 8MHz вътрешен тактов осцилатор (без външен кристал) Fusebytes: Low=$E4, High=$DF, Ext=$FF 106-fuse_ext.png - fusebits за опцията външен кристален осцилатор с произволна честота Fusebytes: Low=$FF, High=$DF, Ext=$FF Напомняне: За Отметките Algorithm Builder и UniProf са поставени както на снимката. За PonyProg, AVR Studio, SinaProg квадратчетата за отметка са обърнати. Как да програмирате микроконтролери прочетете в ЧЗВ.
keypad_dtmf_out_source.zip - Изходен DTMF генератор
А сега да видим какво имаме.
Сигналът се генерира с помощта на ШИМ и се използва RC верига, за да му се придаде желаната форма. В резултат на това след RC веригата получаваме следния сигнал (бутон 6 е натиснат):

По цялата крива на полезния сигнал наблюдаваме високочестотен гребен (честотата е по-висока от звуковата, така че няма да създава шум) - това е работата на RC веригата. Можете да направите линията по-гладка, като увеличите капацитета на кондензатора или съпротивлението на резистора, но в този случай обхватът на полезния сигнал ще бъде значително намален.
Разглеждаме спектъра на сигнала и се уверяваме, че има две отделни честоти (честотата на ШИМ е излязла извън областта на дисплея), така че всичко е наред - устройството работи както трябва.

Готови решения
За задачите по генериране и декодиране на DTMF сигнал има готовирешения. Ето няколко листа с данни за тези микросхеми.
TP5089N.pdf - DTMF генератор MT8870D.pdf - DTMF декодер
P.S. Жалко, че в ATtiny2313 няма ADC - можете да използвате и DTMF декодер! Но нищо, ще повторя на мегата, задължително ще го закача.
Много полезно нещо. Не винаги е възможно да се намери специализиран чип за генератор или декодер. И ако ВИЕ напишете фърмуера за генератора и декодера, например за ATmega8 (Общ и компактен микроконтролер), тогава много ентусиасти на запояване ще ви бъдат изключително благодарни и благодарни. НЯМА да се налага да тъпчете базари и магазини в търсене на още. Сложих контролера, качих фърмуера и взех каквото ти трябва.
Ако някой планира да внедри DTMF декодер akv, това вече е направено (на mega8) http://www.forum.getchip.net/viewtopic.php?f=9&t=394&start=10
Добър вечер, Юджийн. Моля ви да разработите DTMF декодер за вашия DTMF генератор. Само пълноценен. Като на mt8870. Ако можете да внедрите клавиатура върху него. Тоест можете да контролирате както входния сигнал, така и от клавиатурата.
Има идея да се направи „всичко в едно“, но още не знам кога ще се стигне до реализация.
Добър вечер GetChiper. Тествах DTMF генератора в Proteuse. Той произвежда същата форма като на фигурата (графиката) по-горе. Но този получен сигнал не иска да бъде определен от DTMF декодера. Тествах самия декодер на записан реален сигнал (от микрофон) и винаги дава правилен резултат. Не искам да кажа, че DTMF се генерира неправилно, просто ми помогнете да разбера какво не е наред. Може би честотата на генериране е изместена или гребенът върху сигнала по някакъв начин влияе. Най-интересното е, че ако се прилага ШИМ без RCдекодер, след това открива DTMF, но неправилно ...
Кварцов контролер? Възможен е дрейф на честотата, ако MK се захранва от вътрешен главен осцилатор. Възможно ли е да видите спектъра на изходния сигнал? Съвпадат ли 2-те изходни честоти с натиснатия бутон?
За да премахнете гребена, можете да увеличите резистора в RC веригата (този, който е 2k7). Но тогава нивото на сигнала ще падне значително.
Между другото, нивото на сигнала достатъчно ли е за декодера? Предлага грешна, но все още работа без RC верига, когато нивото на сигнала е максимално
GetChiper, благодаря за съвета. Проблемът е решен, DTMF разпознат 100%. Всичко е просто - грешни предпазители :). Между другото, много ми хареса идеята за формиране на сигнал. Така че можете да направите всякаква форма. Ако има време, ще комбинирам генератора и декодера, има всичко за това.
Благодаря за схемата и програмата, всичко заработи наведнъж. Имах DTMF декодер, създаден по-рано, също не ATtiny2313 с индикатори 2x16. Всичко е наред. Вярно, на изхода сложих диференциален трансформатор (защото сигнала се предава през мултиплексора по нискочестотни канали) и на противоположния край всичко се декодира нормално.
GetChiper или можете да оформите библиотеката от елементи за splan, схемите са болезнено красиви)
Няма библиотека като такава (ще събера всичко, но не мога да изляза да го направя). Но всички елементи могат да бъдат взети в библиотеката от файловете на проекта.
GetChoper'y: Както каза другарят Саахов: "Всичко е точно, хартията е написана правилно..." Току-що се прокрадна една нещастна грешка. Така наречената RC верига пред изходния транзистор, която в експертните среди се нарича First Order Low-Pass Filter, е изчислена много зле. Честотата на прекъсване на такъв филтър е: Fav=1/2πRC, (Hz) Заместете 2700(Ω) и 0,0000001(Farad) във формулата иполучаваме 589 Hz. В същото време честотите на DTMF сигнала са в областта от 697…1633 Hz, т.е. нашият (или по-скоро вашият) филтър потиска дори честотите на полезния сигнал. Ето защо някои граждани се оплакват от нестабилността на работата на DTMF декодера. Какво да направя? Просто поставете филтър с кашерна честота на прекъсване и 2-ри или 3-ти ред би било добре. Накратко, дайте ми имейла си и ще получите файл със снимки.
Проблемът с филтъра от първи ред е, че той има плавно затихване и честотата на ШИМ не е толкова далеч от честотите на DTMF сигнала, така че трябва да направите компромис - да натиснете по-силно честотите на ШИМ и да не намалявате много полезния сигнал.
Що се отнася до филтрите от N-ти ред, съгласен съм с вас, би било по-добре, но мисля, че всеки може да го приложи „за себе си“.
Лява опция S >
Между другото, за тези, които искат да имат DTMF декодер, съветвам: http://www.qrz.ru/schemes/contribute/constr/dtmf.shtml И има връзка с компютъра, можете да запомняте DTMF съобщения с помощта на програмата Terminal, докато твърдият диск не се запуши.