DAC prevodnik do tridy "D"

Ahoj,
pokud vim, tak trida D audio je PWM modulace, kde se ridi delka impulsu podle urovne signalu.
Chtel bych se zeptat, zda by neslo pouzit samplovane data primo na rizeni PWM ??
Potrebuji vyrobit “chrchlatko” na prehravani samplovanych zvuku.

Samozrejme ze ano. Musis si vsak zratat, kolko samplov za sekundu chces, s akym DA rozlisenim chces pracovat a kolko vzoriek chces na hodnotu pouzit.

Velice ze ilustracny priklad:

Ak chces mat 8b DA (vystup bude znacne zasumeny - odstup signal/sum je cca 48dB, optimum je aspon 12b (odstup s/š je cca 12*6dB=72dB) )

A chceš prenášať fmax =10kHz, najrychlejšia zmena sinusoveho signalu je pri prechode nulou, cize

arcsin(1/255) = 0,225 stupna, takže do periody porebuješ generovať 1600 vzoriek vyfiltrovaného PWM signalu.

Treba pozitat s tym, ze za PWM je tak ci tak low pass filter tvoreny nejakym primeranym kondenzatorom a prislusnou cievkou (Ano, aj v zosiku triedy D nakoniec musi byt nieco tak primitivne analogove :slight_smile: ). Tie su navrhnute na nejaky medzny kmitocet a je tu teorem o dvojnasobnej frekvencii. Takze nakoniec by som siel s frekvenciou aspon 5x vyssie.

No a to by sme mali 10000Hz * 1600 * 5 = 80MHz.

To je ale perioda PWM. Rastrova frekvencia musi byt este 256x vyssia.

Vacsinu energie sa v hovorenej reci prenasa v pasme do 3400Hz.

Takze skus nieco taketo

qsl.net/yo5ofh/pic/tone_generator.htm

alebo medzi nami moj osobny favorit v jednoduchosti a elegancii:

romanblack.com/picsound.htm

to by mohlo podla mna fungovat aj s tym D zosilnovacom, len s tym, ze filter je az na konci.

pozri si tiez aplikacnu poznamku

avr335.pdf

pre AVR.

myslim, ze jsi nepochopil smysl otazky :wink:
Ja se prave chci vyhnout prevodu DAC a vysledek posilat na zesilovac tridy D.

Zkusim to lepe napisat.
Zesilovac tridy D pouziva PWM, kdy okamzita uroven napeti je vytvorena delkou impulsu. Takze pokud pojedu na 8kHz, tak 8000/s budu generovat prislusne dlouhy impuls, ktery na integracnim clenu na vystupu vytvori predchozi analogovy signal.

No a protoze samplovany signal obsahuje digitalni udaj o urovni analogoveho signalu, tak by nemel byt problem tento udaj pouzit na vygenerovani impulsu prislusne delky.

Ted je dulezite, jakou prevodni tabulku pouzit, aby byl vysledek uspokojivy.
Taky kmitocet je dulezity, pokud pouziji 8MHz, tak pri 8kHz sampl, je mozne maximalni rozliseni vystupniho impulsu v hodnote 0-1023 (10bit).

Martin má pravdu, ale zároveň jí nemá. Záleží na použití. Dělal jsem pro kamaráda elektroniku pro model přejezdu. Je tam použitý IO ATmega na 16.384MHz. Zvuk je cca 1 sek. 8-bitového mono WAV převedený na 8kHz z důvodu velikosti (abych se vešel do programové paměti MCU i se zbylým kódem). Výstupní signál aproximuji na 32kHz. Používám 64kHz PWM s rozlišením 8 bitů a hodnoty jdou na PWM výstup 2x. Vždy vezmu jeden vzorek z wavu, spočítám mezihodnoty mezi tímto vzorkem a následujícím a pak při každém druhém přetečení čítače nastavím hodnotu PWM podle načtené nebo vypočtené hodnoty. Vždy jdou do OCR registru 3 mezihodnoty a jako poslední jde načtená hodnota z wavu, každá 2x. V tuto chvíli načtu další hodnotu a udělám výpočet dalších mezihodnot.

Hardwarově je výstup připojený přímo k reproduktorku nebo piezoměniči. Netvrdím, že bych chtěl tímto způsobem poslouchat Bacha, ale pro daný účel je to naprosto dostačující.

Když MCU poběží na 8,192MHz (nebo IntRC 8 MHz - testoval jsem to v kontaktním poli na IntRC), tak pošleš každou hodnotu jenom jednou, Mělo by to taky fungovat. Pokud bys neaproximoval vzorky na 32kHz a posílal jenom 8kHz, pak pošleš každou hodnotu 4x (8,192MHz) nebo 8x (16,384MHz).

A ja myslím, že si nepochopil zmysel odpovede :slight_smile:

Všade píšem o PWM výstupe, t.j. chvíľu log.1 a potom zas chvíľu log.0 Alebo naopak.

aplikacni poznamka 335 mi vse vysvetlila a uz jsem v obraze.
Diky.