Potřeba generování DTMF (Dual Tone Multi Frequency) volby bez použití speciálních integrovaných obvodů k tomu určených vznikla na základě cenové politiky a podmínek jednoho pražského dovozce telefonních obvodů od firmy Mitel. Přijímač (dekodér) tónové volby lze koupit za cca 30,- Kč, ale přijímač-vysílač již převyšuje částku 100,- Kč. Princip bude ukázán na nejmenším z rodiny „PICů“ – 12C508A.
Parametry DTMF volby
Nejprve je potřeba se seznámit s parametry tónové volby DTMF. Volba nabývá šestnácti stavů, kde každý stav je definován dvojicí tónů. Jeden tón je vždy z dolní čtveřice tónů a druhý z horní čtveřice tónů. Protože kombinací je 4x4=16 tak možných stavů je právě 16. Dalším parametrem je preemfáze, kdy tóny z horní skupiny jsou vyšší o 2 dB než tóny z dolní skupiny. Přesnost tónů je definována ± 1,5%. Další parametry jako délka tónu a mezery, zkreslení, úroveň atd. se týkají až konkrétní konstrukce zařízení.
Dolní skupina | 697 Hz | 770 Hz | 852 Hz | 941 Hz |
Horní skupina | 1209 Hz | 1336 Hz | 1477 Hz | 1633 Hz |
Princip generování dvoutónu
Základní možnosti jsou dvě, buď jednotlivé vzorky posílat na port (např. 8bitů) a zde mít D/A převodník např. z odporů, ale zabírá vývody mikrokontroléru, naproti tomu je přesnější. Druhá možnost a tu si popíšeme, je generování PWM (Pulse Width Modulation). Zabírá jeden vývod mikrokontroléru, vyžaduje dolní propust na výstupu, ale modul PWM je u moderních mikrokontrolérů již standardní periférií. V našem příkladu použijeme ten nejhorší případ – mikrokontrolér bez přerušení a bez modulu PWM - PIC12C508A.
Při programově řešeném PWM je nutno dodržet několik zásad. Následující výpočty je nejlepší zapsat do tabulkového procesoru (Excel, T602 …) a tak se změna každého parametru okamžitě projeví ve všech výsledcích. Toto má velký význam při dodržení přesnosti < 1,5 % všech osmi tónů zároveň. Tělo celé programové smyčky určuje vzorkovací kmitočet, výpočet konstant představuje stejnosměrnou složku a porovnání výstupní hodnoty vzorku je v přímém vztahu s počtem úrovní vzorků.
V našem příkladu si zvolíme:
počet úrovní vzorku pvz = 17 (9 je střední hodnota ± 8)
počet bodů sinusového průběhu v tabulce pbod = 256
kmitočet oscilátoru je zvolen standardní f0 = 3.579545 MHz
výpočet konstant je dlouhý kkon = 33 instrukcí
porovnání výstupní hodnoty vzorku kpor = 4 instrukce
Toto je zadání, které je zvoleno z řešení programové smyčky PWM a parametrů mikrokontroléru PIC12C508A. Další potřebné údaje vypočteme z následujících vztahů:
- doba jedné instrukce: tinst = 4 / f0 ( 4 = za 4 periody fo vykoná 1 instrukci ) [s]
- vzorkovací kmitočet: fvz = 1 / (( pvz × kpor + kkon ) × tinst ) [Hz]
- základní krok kmitočtu: fkrok = fvz / pbod [Hz]
- výpočet konstanty kn pro požadovaný kmitočet fn: kn = fn / fkrok [-]
- skutečný generovaný kmitočet: fskut = ( zaokrouhlit na celé kn ) × fkrok [Hz]
- výpočet přesnosti generovaného kmitočtu: d = ( 100 × ( fn - fskut ) / fn ) [%]
- výpočet konstanty časovače TMR: kTMR = 8 + ( 256 – ( kkon +
kpor × pvz )) [-] ,
kde konstanta 8 je stejně jako konstanty kkon a kpor z konkrétně napsaného programu, jinak napsaný program nebo jiný mikrokontrolér tyto konstanty zásadně změní.
Program v mikrokontroléru se skládá ze tří částí. První část jsou dvě tabulky sinusového průběhu dlouhé 64, druhá sinusovka má o 2 dB větší amplitudu. 64 vzorků je dostačující, ale výpočet vzorku se provádí v délce 256 ( pbod ) a výsledek se dělí 4 do rámce tabulky 64 a tak se výběr vzorků zpřesní.
Druhá část programu se týká komunikace – zadání kmitočtů a povel k vysílání. Komunikace je zvolena synchronní sériová třívodičová Clk, Data, Select. Takto je možné Clk a Data sdílet s jinou periférií (např. se sériovou EEPROM), signál Select slouží k řízení tak, že je-li „0“ tak program nevysílá a čte sériovou sběrnici (Clk a Data), je-li v „1“ tak posledních 6 bitů přečtených ze sériové sběrnice před změnou signálu Select definuje vysílané kmitočty a po dobu co je Selct v „1“ vysílá a signály Clk a Data se ignorují. Pokud je třeba vysílat stále stejný tón, tak stačí vysílání klíčovat signálem Select – posledně zapsané kmitočty zůstávají.
Poslední část programu je smyčka PWM. Vývojový diagram je na obr.1. Princip generování dvoutónu je, že pro jeden kmitočet např. 770Hz je vypočtena konstanta kn1 = 23 a pro druhý kmitočet 1209Hz je vypočtena konstanta kn2 = 36. Při běhu smyčky PWM se jeden ukazatel po sinusovce posouvá o 23 a druhý o 36, vrácené hodnoty ze sinusovek se sečtou, vydělí 2 a tak se získá konkrétní vzorek amplitudy generovaný PWM. Protože se vzorky horních kmitočtů berou ze sinusovky o 2 dB větší než dolní kmitočty, tak je zaručena preemfáze. Proměnná K1 a K2 jsou ukazatele výběru vzorků sinusového průběhu, POC je pomocná proměnná, v proměnné HOD se vypočítá velikost vzorku, TMR je vnitřní časovač, který se inkrementuje od vnitřních hodin ( fo / 4 ). Vzorkovací kmitočet je více jak pětkrát vyšší než nejvýše generovaný kmitočet a tak výstupní signál lze snadno dolní propustí „vyčistit“ od vzorkovacího kmitočtu.
Příklad použití generátoru
V našem příkladu je generátor v samostatném obvodu PIC12C508A. Oscilátor je možno vytvořit připojením krystalu nebo přivedením kmitočtu 3,579545 MHz od jiného obvodu v zařízení. Pasivní filtr dolní propusti 2. řádu vyžaduje připojení k následujícímu obvodu s vysokou vstupní impedancí. Tento filtr je vhodné nahradit aktivním filtrem 3. řádu, který splňuje dostatečné potlačení vzorkovacího kmitočtu PWM a zaručí nízkou výstupní impedanci. Na závěr je uvedena tabulka všech možných tónů na obr. 5, které lze v programu z našeho příkladu generovat. Kromě tónů DTMF volby lze ještě generovat jednotlivé sinusové tóny, které lze v konstrukci požít např. pro generování melodie, zvonícího signálu nebo oznamovacího/obsazovacího tónu.
Zapojení filtru 3. řádu
Tabulka generovaných tónů
první Data = D5(Clk5) ,,, poslední D0(Clk0) přichází s posledním Clk než jde Select do "1" |
||||||
---|---|---|---|---|---|---|
Kmitočet [Hz] | Data: | |||||
Clk5
|
Clk4
|
Clk3
|
Clk2
|
Clk1
|
Clk0
|
|
0 |
0
|
0
|
0
|
0
|
0
|
0
|
33,61 |
0
|
0
|
0
|
0
|
0
|
1
|
67,22 |
0
|
0
|
0
|
0
|
1
|
0
|
100,83 |
0
|
0
|
0
|
0
|
1
|
1
|
134,44 |
0
|
0
|
0
|
1
|
0
|
0
|
168,05 |
0
|
0
|
0
|
1
|
0
|
1
|
201,66 |
0
|
0
|
0
|
1
|
1
|
0
|
235,27 |
0
|
0
|
0
|
1
|
1
|
1
|
268,88 |
0
|
0
|
1
|
0
|
0
|
0
|
302,49 |
0
|
0
|
1
|
0
|
0
|
1
|
336,10 |
0
|
0
|
1
|
0
|
1
|
0
|
369,71 |
0
|
0
|
1
|
0
|
1
|
1
|
403,32 |
0
|
0
|
1
|
1
|
0
|
0
|
436,93 |
0
|
0
|
1
|
1
|
0
|
1
|
470,54 |
0
|
0
|
1
|
1
|
1
|
0
|
504,15 |
0
|
0
|
1
|
1
|
1
|
1
|
537,76 |
0
|
1
|
0
|
0
|
0
|
0
|
571,37 |
0
|
1
|
0
|
0
|
0
|
1
|
604,98 |
0
|
1
|
0
|
0
|
1
|
0
|
638,59 |
0
|
1
|
0
|
0
|
1
|
1
|
672,20 |
0
|
1
|
0
|
1
|
0
|
0
|
705,81 |
0
|
1
|
0
|
1
|
0
|
1
|
739,42 |
0
|
1
|
0
|
1
|
1
|
0
|
773,03 |
0
|
1
|
0
|
1
|
1
|
1
|
806,64 |
0
|
1
|
1
|
0
|
0
|
0
|
840,25 |
0
|
1
|
1
|
0
|
0
|
1
|
873,86 |
0
|
1
|
1
|
0
|
1
|
0
|
907,47 |
0
|
1
|
1
|
0
|
1
|
1
|
941,08 |
0
|
1
|
1
|
1
|
0
|
0
|
974,69 |
0
|
1
|
1
|
1
|
0
|
1
|
1008,3 |
0
|
1
|
1
|
1
|
1
|
0
|
1041,91 |
0
|
1
|
1
|
1
|
1
|
1
|
1075,52 |
1
|
0
|
0
|
0
|
0
|
0
|
1109,13 |
1
|
0
|
0
|
0
|
0
|
1
|
1142,74 |
1
|
0
|
0
|
0
|
1
|
0
|
1176,35 |
1
|
0
|
0
|
0
|
1
|
1
|
1209,96 |
1
|
0
|
0
|
1
|
0
|
0
|
1243,57 |
1
|
0
|
0
|
1
|
0
|
1
|
1277,18 |
1
|
0
|
0
|
1
|
1
|
0
|
1310,79 |
1
|
0
|
0
|
1
|
1
|
1
|
1344,4 |
1
|
0
|
1
|
0
|
0
|
0
|
1378,01 |
1
|
0
|
1
|
0
|
0
|
1
|
1411,62 |
1
|
0
|
1
|
0
|
1
|
0
|
1445,23 |
1
|
0
|
1
|
0
|
1
|
1
|
1478,84 |
1
|
0
|
1
|
1
|
0
|
0
|
1512,45 |
1
|
0
|
1
|
1
|
0
|
1
|
1546,06 |
1
|
0
|
1
|
1
|
1
|
0
|
1579,67 |
1
|
0
|
1
|
1
|
1
|
1
|
DTMF - D |
1
|
1
|
0
|
0
|
0
|
0
|
DTMF - 1 |
1
|
1
|
0
|
0
|
0
|
1
|
DTMF - 2 |
1
|
1
|
0
|
0
|
1
|
0
|
DTMF - 3 |
1
|
1
|
0
|
0
|
1
|
1
|
DTMF - 4 |
1
|
1
|
0
|
1
|
0
|
0
|
DTMF - 5 |
1
|
1
|
0
|
1
|
0
|
1
|
DTMF - 6 |
1
|
1
|
0
|
1
|
1
|
0
|
DTMF - 7 |
1
|
1
|
0
|
1
|
1
|
1
|
DTMF - 8 |
1
|
1
|
1
|
0
|
0
|
0
|
DTMF - 9 |
1
|
1
|
1
|
0
|
0
|
1
|
DTMF - 0 |
1
|
1
|
1
|
0
|
1
|
0
|
DTMF - * |
1
|
1
|
1
|
0
|
1
|
1
|
DTMF - # |
1
|
1
|
1
|
1
|
0
|
0
|
DTMF - A |
1
|
1
|
1
|
1
|
0
|
1
|
DTMF - B |
1
|
1
|
1
|
1
|
1
|
0
|
DTMF - C |
1
|
1
|
1
|
1
|
1
|
1
|
Další informace nebo naprogramovaný obvod PIC12C508A lze získat na romjel@ volny.cz .
romjel@ volny.cz