Spektrální analyzátor pro vizualizaci hudby
27. října 2010 v 15:13 | Gordon
|
Odborné články
(Tento článek vyšel v lednu 2006 na serveru www.mcu.cz. Popisuji v něm jeden ze svých prvních hardwarových projektů. Článek popisuje samotnou funkčnost a konstrukci zařízení. Podrobnou fotodokumentaci, seznam součástek a podklady ke stažení zveřejním brzy.)
V dnešní době stovek vizualizačních pluginů do winampu a podobných softwarových přehrávačů se již málokdo ohlédne po klasickém "spektráku". Před nedávnem se však ve mně zrodila myšlenka proč si takovouhle jednoduchou vizualizaci neudělat jako samostatné zařízení.
Účelem zařízení je zobrazit zastoupení harmonických složek v jednotlivých frekvenčních pásmech. Aby to bylo možné, je nejdřív potřeba rozdělit analogový signál na spektrum, kde každá část spektra představuje jedno frekvenční pásmo. Toho lze docílit pomocí několika pásmových propustí nebo v lepším případě pomocí integrovaného obvodu, kterých je dnes pro tento účel na trhu celá řada (spektrální analýzu je samozřejmě možné řešit i mnoha jinými způsoby, o kterých se zde ale zmiňovat nebudu). Já jsem pro své zařízení použil obvod BA3830, který se mi jako jediný podařilo v naší maloobchodní síti sehnat. Obvod je vybaven šesti pásmovými propustmi druhého řádu, usměrňovacími obvody a peak detektory. Středové frekvence jednotlivých pásem jsou 63, 150, 330, 1000, 3300, 10000 Hz. Z čehož vyplývá, že spektrální analyzátor bude mít 6 pásem a jako rozumný rozsah úrovní každého pásma se jeví 0-30dB.



Několik technických parametrů:
- Napájecí napětí: 9 - 30 V
- Rozlišení displeje: 6x20 bodů
- Režimy zobrazení: 8
- Frekvenční rozsah: 63 - 10000 Hz
- Pásma: 6
- Rozsah úrovní jednoho pásma: 0 - 30 dB (1,5dB na jeden bod)
Frekvenční charakteristika všech pásem(z datasheetu BA3830):

Funkce a ovládání
Celé zařízení lze ovládat potenciometrem (k nastavení citlivosti) a jedním tlačítkem. Tlačítko slouží k přepínání zobrazovacích režimů displeje, kterých je možno na základě kombinací jasu a způsobu zobrazení vytvořit nesčetné množství. Kvůli zjednodušení jsem však nakonec zvolil možnost přepínat mezi osmi přednastavenými režimy.
Režimy 1-4: zde se jedná o klasický spektrák, kde se zobrazují bars a peaks, přičemž jednotlivé režimy se liší jasovými rozdíly jednotlivých prvků.
Režim 5: zobrazují se pouze bars, s tím, že je aktivní jen jejich nejvyšší bod.
Režimy 6-7: zobrazují se bars s počátkem uprostřed a svou hodnotu zobrazují na obě strany bargrafu, tyto režimy mají jen 10 úrovní (3dB na úroveň).
Režim 8: stejný jako režimy 6 a 7, dochází však k modulaci jasu v závislosti na aktuální decibelové úrovni.
Hardware
Původní myšlenka (a původní verze zařízení) byla založena na absenci jakéhokoliv mikrokontroléru a veškerou obsluhu displeje a AD převod řídili jen obyčejné číslicové obvody, kde výstupní frekvenční pásma z BA3830 byly multiplexovány synchronně s displejem a jako logaritmický AD převodník a budič displeje zde sloužil obvod LM3915. Toto zařízení však nabízelo jen 2 režimy zobrazování (bars/dots) a rozlišení jednoho sloupce displeje nemohlo být víc jak 10 bodů. Tato verze se také nikdy nedočkala plošného spoje.
Blokové schéma původní verze:

Po několika experimentech s kaskádou dvou LM3915 ve snaze rozšířit rozlišení sloupce na 20 bodů a přidat možnost zobrazovat peaks (peak - takový ten jeden bod co chvíli zůstane na nejvyšší dosažené hodnotě sloupce) přišel na řadu mikrokontrolér ATmega8, který jednak přinesl řadu nových možností, ale také celé zařízení zjednodušil, čímž i snížil jeho cenu.
Blokové schéma nové verze:

Aby bylo možné převést rychle měnící se hodnotu střídavého signálu na její odpovídající úroveň na bargrafu (na jednom sloupci displeje), je třeba signál nejdříve usměrnit jinak sloupec ukazuje nulovou hodnotu když je signál v záporné půlvlně, což způsobuje jeho velmi nepříjemné blikání. Stále však dochází k velmi rychlým změnám v kladných půlvlnách a aby byl údaj na bargrafu čitelný, je třeba tyto změny zpomalit. O to se starají peak detektory uvnitř obvodu BA3830, jejich funkce se však zdála být stále nedostačující a proto je ke každému výstupu z BA3830 připojen paralerně kondenzátor, který rychlé změny vyfiltruje. Takto upravený signál pro každé frekvenční pásmo zvlášť jde do odpovídajícího vstupu analogového multiplexoru pro integrovaný AD převodník uvnitř ATmega8. Zde je převeden na číselnou hodnotu decibelových úrovní a posléze zobrazen na displeji.
Displej je řízen multiplexně, přičemž cyklus displeje je synchronní s cyklem snímání vstupů. Každý sloupec má připojenou společnou anodu na kolektor jednoho ze sloupcových budičů (BD138). Jako řádkové budiče jsou zde použita tranzistorová pole ULN2803, jejichž vstupy jsou paralerně připojeny na výstupy obvodů typu SIPO, které jsou zásobovány daty z procesoru přes sériovou sběrnici microwire.
V obvodu jsou zavedeny 2 napájecí větve, 5V pro většinu obvodů a 3,3V pro napájení displeje, kde 5V použít nešlo kvůli příliš velkému namáhaní LED diod. Bohužel jsem nesehnal (nebo se mi spíš nechtělo shánět :) stabilizátor na pevných 3,3V s proudem min 1A, takže jsem nakonec použil LM317, který je dvěma odpory pevně nastaven na požadovanou hodnotu napětí. Je však nutné si uvědomit, že se jedná o nastavitelný stabilizátor a ke své správné činnosti potřebuje zatěžovací proud min 10mA, což jsem vyřešil nízkými hodnotami jeho nastavovacích odporů. Odběr proudu na 5V větvi je dost malý (cca 30mA) takže na její stabilizaci stačí 78L05 s max odebíraným proudem 100mA. Pokud ale používáte programátor, který je napájen přímo z cílové aplikace, muže se během programování odběr na 5V větvi několikanásobně zvýšit, proto doporučuji nechávat programátor připojený jen na dobu nezbytně nutnou.
Software
Nebudu zde dopodrobna rozepisovat každou funkci programu, pokud by se někdo rozhodl software jakkoliv upravovat, musí si vystačit s komentáři ve zdrojovém kódu. Program je napsaný v jazyce C a jeho zdrojový kód je bez problému přeložitelný v CodeVisionAVR. Jak už bylo výše zmíněno, cyklus obsluhy displeje je synchronní s cyklem snímaní vstupů, což umožňuje vcelku jednoduché řešení softwaru, kdy se v jednom cyklu přečte jeden ze vstupů, následně je zlogaritmován a je mu přiřazena odpovídající hodnota na bargrafu, v závislosti na aktuálním režimu zobrazení. Na konci cyklu se zahájí nový AD převod pro další pásmo a mezitím se kontroluje stav tlačítka. Zlogaritmování probíhá na základě předem stanovených hodnot pro každou úroveň bargrafu (původně jsem chtěl aby si procesor spočítal hodnoty sám při každém spuštění, ale nakonec jsem tenhle úkol přenechal excelu :). Program také řídí úrovně jasu displeje pomocí pulsně-šířkové modulace, kde maximální délka impulsu je délka jednoho cyklu. Pro snížení jasu se požadovaný sloupec nechá v každém cyklu zhasnout o něco dříve. V režimech zobrazení 1-4 se potom zobrazují bars a peaks v samostatných cyklech aby bylo možné řídit jejich úrovně jasu odděleně.
Aby bylo možné pokrýt rozsahy od desítek milivoltů do jednotek voltů na sloupci displeje o rozlišení 20 bodů, je třeba hodnotu zlogaritmovat. Nejedná se o žádný složitý postup, jde jen o základní počty s decibely.
Na vstupu máme 10bit AD převodník, což činí lineární rozsah hodnot 0-1023. Referenční napětí AD převodníku je nastaveno na 5V takže můžeme teoreticky měřit vstupní napětí s přesností na 4,88mV, což je pro náš účel zcela dostačující. Následující krok by bylo možné vynechat, ale já jsem jej v programu použil kvůli snadnějšímu odlaďování. Hodnota přečtená z AD převodníku je vynásobena konstantou 4,88 (5000/1024), čímž získáme skutečnou hodnotu vstupního napětí v mV. Tato hodnota je dále porovnávána s hodnotami pro decibelové úrovně (jsou v programu napevno zadány, zdálo se mi zbytečné aby je procesor sám počítal), které jsou spočítány podle vztahu U = Uref * 10-(max-dB)/20, kde Uref je referenční napětí AD převodníku v milivoltech, max je maximální hodnota rozsahu v decibelech (pro rozsah 0-30dB je to tedy 30) a dB je hodnota v decibelech pro požadovanou úroveň. Vztah vychází ze základního vztahu pro výpočet decibelů AUdB = 20 * log(U2/U1).
Plošný spoj, konstrukce, oživení
Plošný spoj byl navržen v systému EAGLE s ohledem na nepájivou masku a jednostranný potisk. Při osazování je nutné jako první zapájet drátové propojky ze strany součástek. Přestože se jedná o jednostranný spoj, bargrafy displeje jsou zapojeny do matice a tudíž potřebují druhou vrstvu pro společné anody. Ta je zde vytvořena drátovými propojkami ze strany spojů (viz fotky). Stabilizátor LM317 by měl být vybaven malým chladičem (no on by se tam velký stejně nevešel :). Při programování je třeba dát pozor na správné zapojení programátoru, poškození samotného zařízení či programátoru není při nesprávném zapojení vyloučeno. Před spuštěním je nutné zapojit potenciometr, který se k celé DPS zapojuje dodatečně. Na desce se nevyskytují žádné SMD součástky takže není třeba žádná speciální technika a její osazení by měl zvládnout i začátečník.
POZOR: Na plošném spoji je neopravená chyba. Rozteč otvorů pro BA3830 je příliš malá. Jedná se o chybu která vznikla při návrhu DPS ale všiml sem si jí až při osazování desky. Piny z BA3830 lze ale ohnout a integrovaný obvod tak bez problému zapájet.
Pří výběru bargrafů pro displej nedoporučuji bargrafy s různými kombinacemi barev (jako např. 7x zelená + 3x červená), kde mají LED diody jednotlivých barev různou svítivost. Aby byl údaj dobře čitelný za denního světla i při sníženém jasu displeje, svítivost bargrafu by neměla být menší jak 10mcd. Osvědčili se mi zelené bargrafy od výrobce Kingbright se svítivostí 14mcd při 10mA, které jsem sehnal v GES za cca 20kč/ks, podobnou verzi mají i v GME v trochu jiném pouzdře, ale bohužel za dvojnásobnou cenu (výrobce jsem nezjístil). Mohlo by se zdát, že na volbě bargrafu nezáleží, ale přece jen některé typy s nízkou svítivostí (zkoušel sem červený s 2,2mcd) reagují na pulsně-šířkovou modulaci jinak. Také nedoporučuji zaměňovat sloupcové budiče BD138 za jiné typy.
Závěrem
Zařízení bylo vyvinuto a sestaveno doslova "na koleně" a jeho cílem není konkurovat profesionálním přístrojům v měřící technice. Při vývoji nebyla použita žádná speciální technika a rovněž nebyly provedeny žádné podrobné testy či měření. Vše co se od něj očekává je hezké zpestření poslechu hudby. Jedná se o můj první projekt s mikrokontroléry AVR (odmyslím-li si řadu pípátek a blikátek), tudíž uvítám jakoukoli konstruktivní kritiku.
Použitá literatura
Vladimír Váňa: "Mikrokontroléry Atmel AVR - Programování v jazyce C"
Robert Láníček: "Elektronika - obvody, součástky, děje"
Další články
- O vlezlosti našich bank 26. října 2010 v 22:14
- Jsem zpět aneb kterak jsem se vykašlal na Facebook 20. října 2010 v 15:16
- Podporuji úsilí chomutovské radnice proti nepřizpůsobivým 28. února 2009 v 11:37
- Jak se (ne)stát počítačovým závislákem 26. února 2009 v 11:40
- Vítejte ve Slavkově 18. února 2009 v 23:05