Zdroj svévolného průběhu vlny

(Arbitrary waveform generator)

Jak jinak ten přístroj nazvat? Pojem funkční generátor není moc výstižný - každý generátor, pokud není rozbitý je funkční. Generátor funkcí se mi taky moc nezdá - to zařízení negeneruje funkce, ale signál ve tvaru funkcí, které už jsou dávno na světě. No, zkrátka je to krabička, ze které ven vylézá různě se vlnící elektrický signál.

generátor

Potřeboval jsem nějaký jednoduchý generátor rozličných průběhů v akustickém pásmu pro měření zesilovačů. Nejjednodušším řešením se zdá použití zvukové karty v PC a nějakého prográmku. To i docela dobře funguje. Problém je s kmitočtovým rozsahem. Pokud chcete najít horní mez kmitočtového rozsahu zesilovače, je zvukovka málo. Než jsem si to uvědomil, bylo mi divné, že všechny zesilovače, které jsem měřil, měly kmitočtový rozsah do 18 kHz, potom nastával strmý útlum...

Rozhodl jsem se tedy pro stavbu nějakého generátoru, pokud možno univerzálního, jednoduchého a levného. S kmitočtovým rozsahem alespoň 1 Hz - 100 kHz. Na druhou stranu jsem neměl nijak přehnané požadavky na kvalitu výstupního signálu. Šlo mi o to, abych se na signál mohl dívat osciloskopem. Tak jsem dospěl ke konstrukci, kterou tady popisuji.

Generátor je řízený procesorem PIC18F252. Ten plní několik funkcí. Generuje vzorkovací kmitočet pro tvorbu výstupního signálu, vybírá tvar výstupního signálu, snímá ovládací prvky, kterými se všechno nastavuje, zobrazuje nastavené hodnoty na displeji a pamatuje si je od vypnutí k zapnutí.

Výstup vzorkovacího kmitočtu z procesoru je přivedený na násobič kmitočtu, tvořený napěťově řízeným oscilátorem (VCO), děličkou ve formě dvanáctibitového binárního čítače, a komparátorem - no prostě fázový závěs. Zpětná vazba do komparátoru je vedená z osmého bitu. Výstup z čítače je přivedený na spodních 12 bitů adresy paralelní megabitové EEPROM (AT29C010A). Na horních 5 bitů je přiveden adresní signál z procesoru. Tímto způsobem je EEPROM rozdělená na 32 stránek o velikosti 4096 B. Čítač periodicky projíždí stránku, kterou vybral procesor. Na výstup z EEPROM je pověšený D/A převodník, vytvořený budičem sběrnice a odporovou sítí.

Chápu, je to ostuda, ale tohle byla moje první zkušenost s fázovým závěsem. Koupil jsem si 74HC4046 zhruba za 13,- Kč a podle grafů v datasheetu jsem určil hodnoty součástek pro nastavení oscilátoru. Říkal jsem si, že nastavím střední kmitočet oscilátoru na 5 MHz a budu ho přelaďovat o 5 MHz, čímž dostanu rozsah 0 - 10 MHz. Za 13,- ! No, nekupte to! Vystřízlivěl jsem. Dokázal jsem oscilátor přelaďovat tak 1:2, nikoli o pět řádů, jak bych potřeboval. Musel jsem se tedy snížit ke lsti, lépe řečeno ke dvěma. Především jsem každý průběh uložil do paměti několikrát, s různým vzorkováním. Pro nejnižší kmitočty je použito vzorkování 4096 vzorků na periodu - tedy v jedné bance EEPROM je jedna perioda signálu. Pro vyšší kmitočty jsem použil 512 a 64 vzorků na periodu, v bance se potom signál opakuje k dosažení počtu 4096 vzorků. Mám tam ještě 32 vzorků na periodu pro rozsah 100 - 400 kHz, to co leze ven už ale nelze pokládat za rozumný signál. Druhým úskokem bylo to, že jsem odpor, kterým se nastavuje vlastní kmitočet oscilátoru, nahradil tranzistorem, na jehož bázi jsem přivedl signál z komparátoru. Lest se podařila. Oscilátor sice plave kolem nastaveného kmitočtu asi o jedno až dvě procenta, ale pro účely, ke kterým chci generátor používat je to stabilita dostačující.

Uživatelské rozhraní je tvořeno čtyřmístným sedmisegmentovým LED displejem, dvěma LED, dvěma tlačítky a kolečkem, které slouží k nastavování kmitočtu a výběru průběhu. Jako snímač otáčení jsem použil kolečko ze staré myši.

Ovládání generátoru je velmi jednoduché. Spodním tlačítkem se přepne režim volby průběhu a kolečkem je možné vybrat jeden z osmi průběhů:

  • sinus
  • obdélník se střídou 1:1
  • obdélník se střídou 1:9
  • obdélník se střídou 9:1
  • vzestupná pila
  • sestupná pila
  • trojúhelník
  • obdélník s namodulovanou sinusovkou

Samozřejmě, kreativitě se meze nekladou. Do EEPROMky se dá nahnat naprosto cokoli.

Horním tlačítkem se přepíná do režimu nastavení kmitočtu. Protože přelaďovat od 1 Hz do 100 kHz na čtvrtém desetinném místě by trvalo docela dlouho, je možné přepínat mezi volbou rozsahu a změnou kteréhokoli místa na displeji.


Veselá historka z natáčení

Když jsem kreslil na počítači tišťák s displejem, šla okolo P15. Pod vlivem akčních filmů, kde se na takovýchto displejích s velkou oblibou odpočítávají časové intervaly, nabyla P15 přesvědčení, že vyrábím bombu. A o týden později mi bomba vybouchla! Už jsem měl celý přístroj sestavený včetně zdroje a machroval jsem na něm s osciloskopem. Stínění jedné sondy jsem měl chycené na kostru a krokodýlkem druhé sondy jsem škrtnul o pojistku na primáru napájecího trafa. Fáze se dostala přes osciloskop z jedné sondy do druhé, tudy na kostru generátoru, přes připojený ICSP programátor USB portem do PC a tudy na ochranný vodič. Vylítnul kromě jističe na zásuvkovém okruhu i hlavní 32A třífázový jistič. Škoda nebyla ale až zase tak velká. V generátoru shořel PIC za zhruba 170,- Kč a EEPROMka, kterou jsem měl zadarmo ze starého mainboardu. Dále shořel programátor Presto za zhruba 2300,- Kč. A ten shořel doslova. Kromě neviditelných změn uvnitř polovodičových součástek vybouchl jeden kondenzátor a odpařilo se několik cestiček na plošném spoji. Škoda. Byl to velmi dobrý programátor a fungoval mi i v Linuxu.


Hardware

Generátor je postavený na dvou (se zdrojem na třech) deskách. Jednak jsem měl doma menší zbytky cuprextitu a bylo mi líto načínat velkou desku, druhak jsem nechtěl riskovat, že kvůli nějaké fatální chybě v návrhu budu muset předělávat všechno. Desky jsou spojené plochým kabelem a konektory 2x5 pinů z PC. Jak jste si asi všimli, používám všemožný šrot v hojné míře. Konektory byly původně na 9-ti žílovém kabelu (COM), přendal jsem je na desetižílový, uříznutý ze starého ATA kabelu. Jsou nerozebíratelné, proto je rozebírejte s citem. Návrh tišťáků = první místo v soutěži o bobříka za počet propojek je tutovka.

generátor

Firmware

Program do PICu je napsaný v assembleru v prostředí MPLAB. Postupně jsem vystřídal několik variant, jak zadávat kmitočet a počítat z něj periodu. Nakonec jsem použil tabulku, kde mám předem vypočítáno, co jen lze. V jediné konstantě, která tvoří dělenec výpočtu, je zahrnutý kmitočet oscilátoru procesoru, poměr násobiče kmitočtu, vzorkovací frekvence, prostě všechno. Dělitelem je hodnota, která se zobrazuje na displeji a výsledkem je číslo, které odpovídá počtu cyklů časovače nutných k tomu, aby z generátoru lezl odpovídající kmitočet. V závislosti na zvoleném kmitočtovém rozsahu se z tabulky použije odpovídající konstanta. V další tabulce je uvedeno, kterou banku z EEPROM zvolit podle vybraného průběhu a zvoleného kmitočtového rozsahu.

asm projekt

(adresář obsahuje kromě zdrojového kódu i přeložený kód v souboru AWG.hex a obsah EEPROM v souboru eeprom3.bin)

Tabulka

rozsahnásobitelvz./periodupředděličkadělenec
jednotky Hz0,0014096,000164687500002CB4178
desítky Hz0,0104096,000237500000023C3460
stovky Hz0,1004096,00017500000007270E0
jednotky kHz1,000512,00016000000005B8D80
desítky kHz10,00064,0001480000000493E00
stovky kHz100,00032,0001960000000EA600

Data svévolných vln

Data do EEPROM jsem vypočítal programem napsaným v C++. Ale je to v podstatě jedno. Jde o to nějakým rozumným způsobem získat binární soubor s osmibitovým kódováním signálu - určitě by šlo použít třeba i nějaký editor zvuku, nastavený aby data ukládal jako RAW unsigned 8 bitů mono. Tímhle způsobem lze do paměti uložit naprosto cokoli, v programu procesoru je případně potřeba upravit hodnoty v tabulkách. Tady se zmíním, že jsem původně použil EEPROM AT29C010A - 12PC, tedy s přístupovou dobou 120 ns. Ta hodnota je skutečně taková. Při zvyšování vzorkovacího kmitočtu začaly nejdříve vypadávat jednotlivé vzorky, až byl nakonec na výstupu jenom šum. Potom se mi podařilo sehnat EPROM 70 ns. Díky ní běží generátor se vzorkováním 32 vzorků na periodu bez problémů až do kmitočtu 400 kHz (tím bez problémů mám na mysli fakt, že z paměti stíhají data vylézat; signál ale moc hezky už nevypadá).


Obrázky

sinus 1 Hz:

waveform

sinus 1 kHz:

waveform

sinus 99 kHz:

waveform

obdélník 1 Hz:

waveform

obdélník 1 kHz:

waveform

obdélník 99 kHz:

waveform

pila 1 Hz:

waveform

pila 1k Hz:

waveform

pila 99 kHz:

waveform

trojúhelník 1 Hz:

waveform

trojúhelník 1 kHz:

waveform

trojúhelník 99 kHz:

waveform

obdélník + sinus 1 Hz:

waveform

obdélník + sinus 1 kHz:

waveform

obdélník + sinus 99 kHz:

waveform

Speciální průběhy na zakázku

K1 se v poslední době velmi intenzivně věnuje sběratelství a opravám starých magnetofonů. Při nastavování kmitočtových charakteristik se samozřejmě neobejde bez generování různých průběhů a měření. Dovolím si tvrdit, že K1 je v této oblasti inovátorem velkého formátu. Proto na základě zkušeností navrhl zcela nové průběhy měřících signálů na zvukové filtry.

Není pro nikoho z nás novinkou, že komerční elektronika bývá vybavena filtry pro přepínání mezi reprodukcí hudby a mluveného slova. Tato funkce je velmi populární již od dob prvních elektronkových přístrojů a i dnes ji implementuje většina výrobců do televizních prijímačů. K1 po množství pokusů dospěl k nezvratnému závěru, že barvu zvuku je třeba upravovat ještě jemněji, než pouze na reprodukci hudby a řeči. Vždyť hudby je celá škála žánrů kladoucích důraz na naprosto rozdílné složky zvuku, zrovna tak slovních projevů existuje nepřeberné množství. K1 začal svůj, dalo by se říct vědecký výzkum, na řečových filtrech a objednal si u mě zatím dva speciální průběhy signálu.

Pro reprodukci lyrických veršů, milostných povídek, ale i například baladických písní, kde ovšem těžištěm je text, K1 navrhl speciální nastavení filtrů, které zvýrazňuje nižší a střední tóny hlasu, dělá zvuk takzvaně sametový. Pro nastavování takovéto kmitočtové charakteristiky se mu osvědčil průběh měřícího signálu nazývaný ňadra:

waveform

Protipólem výše uvedeného žánru se jeví projevy levicových politiků, zvláště ty přednášené na náměstích k širokým masám. Reprodukce takové nahrávky vyžaduje samozřejmě zcela jiné nastavení - na žádné jemné nuance zda není místo. Proto k nastavování takovéto kmitočtové charakteristky navrhl K1 následující tvar signálu, který já laicky nazývám prdel:

waveform

Dovolím si na tomto místě popřát Nejvyššímu hodně zdaru a nových objevů při jeho výzkumu v oblasti audiotechniky.

P15/1, K15 - prosinec 2006, naposledy aktualizováno: leden 2024