ZX Osciloskop

Úvod

Původně jsem si jen hrál s A/D převodníkem a napsal jsem si jednoduchý program na zobrazování průběhu. Ale když jsem po letech převodník a zobrazování průběhu předváděl na Bytefestu 2007, byl o něj takový zájem, že jsem se rozhodl program vylepšit, a sepsat o něm krátký článek.

Říkat tomu osciloskop je dost nadsazené, ale jelikož se principielně o osciloskop jedná, ač velmi pomalý a jelikož lepší slovo neznám, tak tomu tak říkat budu. Jsou situace, kdy rychlé měření stejně není potřeba. Např. pulzy z čidla, které snímá otáčky motoru, předvedení funkce usměrňovače při výuce, předvedení funkce integračního a derivačního článku, snímání změn tlaku v potrubí a podobné legrácky. Prostě jednorázové děje, které je potřeba zaznamenat, nebo nízkofrekvenční periodické děje.

Ostatně převodník jsem si k ZX Spectru pořídil v době, kdy se mi o vlastnictví skutečného, natož digitální osciloskopu ani nesnilo, zatímco dnes jsou dostupné i náročnějším amatérským elektronikům.

Princip

Nejjednodušší je cyklicky snímat hodnotu a okamžitě vykreslovat na obrazovku bez dalšího zpracování. Můj program takový realtime režim obsahuje, ale samplerate je relativně nízký, viz srovnávací tabulka (může se lišit podle taktu CPU ZX kompatibilního počítače). Dají se tím v reálném čase pozorovat průběhy nejvýše okolo 1kHz, protože aby byl tvar dobře rozpoznatelný, je potřeba přibližně 10 - 30 pixelů na periodu.

Dalším možným způsobem je snímat data do RAM, pak je zobrazit (překreslit), následně čekat na překročení spouštěcí úrovně a to celé neustále opakovat. Tímto způsobem lze dosáhnout vyšší rychlosti, ale nelze tím zobrazit úplně vše, protože jsou docela dlouhé prodlevy, kdy signál není snímán.

Posledním prakticky použitelným způsobem je nasnímat do RAM maximum dat a prohlížet až potom. Výborně použitelný způsob pro jednorázové děje, nebo pro situace, kdy neustále opakované snímání prostě nepotřebuju. Např. při zjišťování kvality datové nahrávky ZX Spectra z magnetofonu a pod.

Zobrazování

Jakékoliv zobrazování je na ZX Spectru náročné na výkon CPU a toho není nikdy dost. V reálném čase je proto možné nanejvýš zobrazovat prosté pixely, pro každý vzorek jeden. Samplerate sice mírně kolísá kvůli přístupu do zpomalené paměti VRAM, ale funguje to. Tento způsob zobrazování lze použít v libovolném režimu.

Druhým způsobem zobrazování je "vektorové". Úmyslně píšu v uvozovkách, protože to skutečně nejsou čáry z bodu do bodu, ale pouze čáry svislé jejichž kreslení je výrazně jednodušší. Nicméně výsledný dojem, který je ze všeho nejdůležitější je velmi dobrý. Nakreslený průběh je mnohem čitelnější a srozumitelnější. Vše je závislé na prostém triku, horizontálně jsou vzorky vzdálené jen jeden pixel a proto se nedokonalost této metody neprojeví v čemž je dokonalá. Rychlost kreslení ale značně kolísá, čím větší jsou vertikální vzdálenosti, tím je kreslení pomalejší a nelze ho stihnout za 1/50s a v reálném čase už vůbec ne.

Jakýkoliv průběh je možné vykreslit oběma metodami, ale z důvodu rychlosti je ta vektorová dostupná pouze pro režimy se snímáním do paměti a vykreslováním až po dokončení snímání. A samozřejmě pro všechna vykreslování dat z paměti u generátoru a nastavení triggeru, právě kvůli lepší čitelnosti.

Následující obrázky ukazují, že se pomalejší průběhy dají docela bez problémů zobrazovat i pomocí pixelů bez spojnic, ale jakmile nastane mezi vzorky velký rozkmit, tak se čitelnost výrazně zhoršuje. Použití triggeru má na zobrazení minimální vliv, jen se vytvoří po každých 256 vzorcích prodlevy.

screenshot screenshot screenshot

Následující obrázky ukazují rozdíly v zobrazení u signálů s velkým rozkmitem úrovní.

screenshot screenshot

Taky 1kHz, ale tentokrát z CDROM, resp. přehrávaný z CD, kde je audio track s vygenerovaným 1kHz obdélníkovým průběhem. CDROM se obecně ukázala jako mizerný generátor průběhů, zřejmě kvůli malým výstupním kapacitám oddělujícím stejnosměrnou složku byl přijatelný prakticky jen sinus a to ještě jen nízké frekvence asi do 1kHz, vyšší frekvence jsou zkreslené kvůli nízkému samplerate, 44100 Hz prostě nestačí.

screenshot

Šum zobrazený oběma způsoby. Průběh není samozřejmě stejný, jen hodně podobný.

screenshot screenshot

Parametry

Zatím existuje 5 zobrazovacích režimů, první tři jsou variace na zobrazování v reálném čase, první maximálně rychlý s příposlechem bez synchronizace, Druhý totéž se synchronizací a třetí navíc ještě zpomalený. Ono se zpomalení přeci jen občas hodí. Čtvrtý režim snímá vzorky do paměti a vykresluje je až potom, proto jsou mezi zobrazeními velké prodlevy, ale samplerate je rychlý tak, jak stihne hardware (CPU a AD převodník). Viz srovnávací tabulka.

režimsampleratetriggerprodlevavektorypříposlech
realtime 14,3kHz ne není ne ano
realtime + trigger 15,0kHz ne závisí na triggeru ne ne
pomalý realtime + trigger 10,5kHz ne závisí na triggeru ne ne
buffer + trigger 44,8kHz ne min 18ms + závisí na triggeru ano ne
jednorázový do paměti 44,8kHz ne závisí na uživateli ano ne

Hodnoty v tabulce jsou jen orientační, měřil jsem je digitálním osciloskopem, takže hodnotám věřím, ale samplerate je odvozený od rychlosti běhu programu a mírně kolísá, zvláště při současném kreslení do VRAM. Prakticky při práci se zpomalenou RAM časovou stabilitu pomocí programu na ZX Spectru prostě zajistit nelze. Ale to se týká jen realtime režimů. Režimy 4 a 5 jsou v rámci možností stabilní.

Pokud se rozhodnete změřené hodnoty zkontrolovat, pozor na trigger, má jiný samplerate než snímání průběhu (asi 23kHz) a měření celého bloku dává náhodné výsledky. Nejlepší je vícekrát změřit trvání třeba 20 samplů a spočítat odpovídající průměrnou frekvenci.

Režimy 2 - 4 používají Trigger, prakticky jde o velmi jednoduchý způsob synchronizace, kdy program prostě čte data z AD převodníku a porovnává s hodnotou, dokud načtená hodnota není větší než zadaná. Pro některé průběhy to funguje velmi dobře, někdy jsou s tím problémy. Prakticky by bylo vhodné reagovat na hranu, ale nepodařilo se mi to zatím vyřešit programem tak, aby to bylo zároveň dost rychlé.

Nastavení Triggeru lze provést ve speciálním režimu, kdy se zobrazí naposledy nasnímaný průběh a na něm linka symbolizující úroveň spouštění, kterou lze pohybovat a takto nastavenou úroveň následně uložit, nebo nastavování přerušit bez ukládání.

Dalších pár obrázků pro představu o použitelnosti, srovnání samplerate a vztahu k reálnému průběhu.

screenshot screenshot screenshot

Ukládání dat

Občas je potřeba nasnímaná data nějak uložit. To je jedna z velkých výhod digitálních osciloskopů a proto nesmí chybět ani na ZX Spectru. V zájmu přenositelnosti programu a maximální jednoduchosti implementace se zatím vše ukládá pomocí rutin v ROM na kazetu.

Ve všech režimech lze uložit snímek obrazovky. Tak vznikla velká část zveřejněných obrázků. V režimech 1, 2, 3 a 4 lze uložit právě nasnímaná data - zobrazených 256 bytů a v režimu 5, který nasnímá jednorázově 20000 bytů se místo toho ukládá celých 20000 bytů.

Při ukládání u cyklicky obnovovaných režimů 1 až 4 doporučuju použít nejprve klávesu P, čímž se zobrazování pozastaví a pak zvolit uložení dat. Výhodou je, že předem uvidíte, co se uloží. Jinak to je značně náhodné.

Další funkce

Kromě samotného zobrazování průběhů jsem program doplnil ještě generátorem signálu, protože obvod kromě AD převodníku obsahuje i DA převodník, nutný pro příposlech.

Generátor má frekvenci nastavenou napevno (zatím) a ta je zhruba 256Hz. Zhruba, protože mírně závisí na taktovací frekvenci ZX Spectra, stroje se mezi sebou liší a taky protože mírně kolísá, ačkoli nepříliš výrazně.

Generátorem lze generovat v podstatě jakýkoliv průběh, ale předdefinované jsou pouze 4, a to sinus, pila, trojúhelník a obdélník. Navíc je možné přehrávat i naposledy zaznamenanou část zobrazeného průběhu a to rychlostí zhruba odpovídající rychlosti zobrazování, resp. tak, aby se frekvence generovaného průběhu blížila originálu.

screenshot screenshot screenshot screenshot screenshot

Kvalita generovaného průběhu je samozřejmě závislá na kvalitě DA převodníku. Ve srovnání s integrovaným osmibitovým převodníkem se převodník sestavený z jednotlivých odporů ukázal být přinejmenším srovnatelný. Rozhodně mezi nimi není výrazný kvalitativní rozdíl. Největším problémem je šum a ten je značný. Výstup z odporů taky nelze zatěžovat, výstupní odpor je veliký a signál lze snadno utlumit a zatížením zkreslit ještě víc.

Duel

Zveřejnění následujících snímků jsem nedokázal odolat. Frekvence obou zobrazených signálů se pohybovala zhruba okolo 300 - 500Hz.

foto foto

Další převodník(y)

ADC0804LCN

Kromě integrovaného obvodu ZN427 jsem vyzkoušel i relativně levný (aktuálně okolo 50Kč, takže za 1/8 ceny ZN427) převodník ADC0804LCN. Funguje, ale to je asi tak všechno. Se sampleratem se nelze dostat přes 22kHz, reálná hranice je někde mezi 15 - 20kHz navzdory mírnému přetaktování na 1,79MHz (podle datasheetu je maximum 1,46MHz). Vyšší frekvence hodin způsobuje chyby v převodu a nad 2,5 - 3MHz přestává převodník na hodiny reagovat a nepřevádí. Při taktovací frekvenci 1,79MHz je převod dokončen obvykle mezi 40 - 45μs, prakticky lze až po 50μs číst binární hodnotu na jejíž správnost se lze spolehnout (tj. 70 - 80 taktů na převod 8 bitové hodnoty?).

Zapojení ADC0804LCN nebudu zveřejňovat. Jednak jsem použil zapojení podle výrobce z datasheetu a zadruhé nedoporučuju. Režimy mého programu samplující do RAM s ním prostě nebudou fungovat, na to je příliš pomalý.

Plány pro další verze

  • Vyrobit další interface s jiným, spolehlivějším, rychlejším a levnějším převodníkem.
  • Napsat verzi pro ZX 128, což by ale u současného programu obnášelo značné změny kódu.
  • Odstranit blikání při překreslování průběhu.
  • Vylepšit trigger.
  • Umožnit orientační meření pomocí kurzorů (možné to je, očekávám přesnost okolo 10%).
  • Volitelně další barevné schémata (čistě černobílé a zelené?) .

Download

Historie změn článku

  • 21.10.2007 - zveřejněna první verze článku.
  • 26.10.2007 - doplněna fotka z reálného provozu.

[ Zpět na hlavní stránku ]

Tento web je převážně o ZX Spectru, kompatibilních počítačích a jiném zajímavém hardwaru. Naleznete-li chybu, nebo byste rádi cokoliv co s tímto souvisí, můžete mi napsat email. Stručně o mém webu zde.