Jste zde

Generátor DTMF volby PWM

V tomto příspěvku bude objasněn možný způsob a princip generování DTMF volby programově v

mikrokontroléru PIC. Tento způsob lze využít obecně v ostatních mikrokontrolérech jako část programu generující DTMF

tóny.

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í.


Sériová komunikace

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


Příklad zapojení 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 .

 

Ing. Roman Jelínek
romjel@ volny.cz
Hodnocení článku: