Rozšíření AD převodu

Zdravím všechny, někde jsem četl že jde programově zvýšit rozlišení AD převodníku z 10bit na 12bit, co je na tom pravdy.

Jde to. Nemá cenu dlouze popisovat, jak to funguje, spíše ti poradím výborný článek, který tuto možnost vysvětluje.
V dnes již zrušeném časopisu KTE v nové mini školce programování mikrokontrolerů PIC (seriál o programování) od pana Vonáška, bylo perfektně popsáno, jak to funguje. Samozřejmě byly i doplněny rutiny (pro 16F877).

Pokud se chceš dostat ke KTE, zkus se zaregistrovat. Máme tu na fóru takovou novinku, ke které se dostanou pouze registrovaní a která ti určitě pomůže :slight_smile:.

Děkuji moc, už jsem to tady našel. Zkusím to nastudovat a vyzkoušet.

Tak to bylo vcelku jednoduché, stačí nabrat a sečíst 64 vzorků z AD převodníku, pak výsledek vydělit 16ti a je to. Dá se použít i 32/8.

Kdepak, v jednoduchosti je síla.

Až tak jednoduché to není. Když je na vstupu ADC konstantní napětí, ADC ho převede s nějakým výsledkem. Každé další spuštění ADC povede k témuž výsledku, neboť není žádný důvod proč by měl být jiný. A když se nabere 64 vzorků, všechny budou stejné a výsledek bude stejný, jako když 1. vzorek vynásobím 4. Takže žádné větší rozlišení nenastane.

Aby to fungovalo, musí se přidat do měřeného signálu ještě něco, co způsobí, že se ty vzorky budou vzájemně lišit a každý ten převod bude jakoby za jiných podmínek. Tím něčím může být pilovitý signál nebo šum, který je zpravidla už obsažen v měřeném signálu. Dále musí platit, že suma všech vzorků pořízených v jednom cyklu měření (64) tohoto přídavného signálu musí být rovna nule. Odchylka od nuly znamená zvýšení chyby ADC. Amplituda musí být minimálně tak velká, jako 1LSB a to v případě, že ADC nemá diferenciální chybu (DNL=0). Prakticky se používá několikanásobně výšší.

Správnost funkce ADC je vždy dobré ověřit např. statisticky pomocí histogramu četností změřených hodnot. Jestliže ve výsledcích chybí určité hodnoty ( jakoby se přeskakovaly) znamená to, že není něco v pořádku.

Dík za vysvětlení, zase tak dobře tomu nezozumím. Takže pokud potřebuji 12bit převod mám raději použít něco externího, třeba MCP3301, ten mám.

To co napisal Technik je ciastocne pravda, ale aby to nevyzeralo tak komplikovane, pozri si aplikacnu poznamku AVR121 na stranakch Atmela. Tam je to vysvetlene aj s nejakym prikladom. Lahko si to aplikujes na PIC.

Zvysovat rozlisenie (nie presnost, prosim nepliest si tieto dva pojmy) sa da tak, ze k meranemu signalu (respektive k Uref pre AD) pridas doplnkovy signal s trojuholnikovym alebo pilovitym tvarom s rozkmitom LSB AD prevodnika. Toto sa moze zdat byt zlozito realizovatelne a nacasovatelne (aj ked to nie je az taky problem). Existuje vsak este jeden sposob, ako meranie rovnomerne “rozhadzat” a to priviest na vstup sum. Sumi pritom kde aka dioda, treba ten sum len vhodne zosilnit. Potom sa netreba starat o casovanie piloviteho signalu, len pocet vzoriek pre oversampling musi byt vacsi, v skole sme to preberali, ale to uz bolo velmi velmi davno.

Ked som sa zaujimal o AD vslastnosti ATmega, na zaciatku som si myslel, ze presnost +/-LSB je v dosledku vlastneho sumu - co ma potesilo. Myslel som si , ze vyrobca doplni procesor o AD s maximalne takou prenostou, ktora
Tesil som sa preto, ze oversampling sa urobi principialne velmi jednoducho, staci iba spocitavat vzorky a potom ich priemerovat (napr. 64vzoriek vydelim 16 a ziskam o 2 bity lepsie rozlisenie). Na moje “sklamanie” AD v ATmega ma pri 128 deleni frekvencie sum hlboko (podla mojho odhadu az o 3-4 bity) pod LSB. Takze ak chcem ja v ATmega zvysit rozlisenie, musim vhodne rozmietat Uref, pripadne Umer.

V PIC je mozno AD “nekvalitnejsie” v tom zmysle, ze jeho sum sa pohybuje na urovni +/-LSB, takze sa tato vlastnost da jednoducho vyuzit pre oversampling.

Nie je pravda, ako spomenul Technik, ze ked 100x spravis prevod , 100x dostanes ten isty vysledok. A to v dosledku sumu, indukcie nahodnych signalov a vsetkeho mozneho. Prave preto sa v beznych merakoch pouziva interacny prevodnik typu dual-in-slope. Je sice omnoho pomalsi ako sample/hold, ale ma tu uzasnu vlastnost - je dokonca dosiahnutelna pri nizkych vyrobnych nakladoch, ze je velmi odolny voci okolitemu sumu.
Ale to, ze je velmi odolny voci sumu este neznamena, ze za urcitych okolnosti v pritomnosti nejakeho zdroja EM ziarenia (volakedy bezpecne susedov vysavac :slight_smile: ) nebudu poskakovat posledne digity. Okrem S/H a DIS su este aj ine typy prevodnikov.

Skratka, ak mas na vstupe prevodnika prirodzeny sum v s velkostou v okoli +/-LSB, mozes vyuzit. Ci to tak je alebo nie, sprav si nasledovny test. Spocitavaj 64 vzoriek a vydel ich 8x. Vysledok si niekde zobrazuj. Na AD vstup si prived cez viacotackovy potenciometer (alebo cez cez jeden obycajny potak s aspon 100x vyssim odporom o Ur) napatie z nejakeho DOBREHO zdroja Ur. stacit bude i 78L05. pomaly otacaj potakom. Ak sa ti bude vysledna hodnota menit linearne krok za krokom, mas vyhrane. Zaroven si mozes vyskusat, aky vplyv na nameranuy hodnotu budu mat filtracne kondiky atd.

Mne ten moj 10b AD v ATmega robil to, ze vystupna hodnota sa pri pomalej zmene dlho nemenila (zhruba 16- 28 mikrokrokov - 1 mikrokrok zodpoveda 1 LSB rozsireneho AD) a potom sa zrazu posunula o 32 (64vz/8= 32), co vlastne zodpoveda 1LSB 10b prevodnika. Takto sa mi AD prevodnik spraval namatkovo v roznych castiach jeho rozsahu, skratka je moc dobry :slight_smile:. Upozornujem, ze nou namerane vysledky vsak nic nehovoria o presnosti, hovoria iba o pouzitelnosti AD prevodnika pre oversampling. Presnost oversamplingom sa zvysi iba vtedy ak ma samotny AD prevodnik presnost napriklad +/- 1/4LSB. Potom oversampling moze zvysit presnost o dva bity. Vysledna hodnota bude vsak s presnostou +/- 1LSB. V praxi je vsak casto potrebne zvysovat rozlisenie - cloveku je jedno, ci je v miestnosti 18 alebo 19 stupnov - nastavi si taku hodnotu aby sa dobre citil, ale na display je dobre zobrazovat i desatiny stupna. Na to je oversampling i bez zvysenia presnosti velmi vhodny.

Martin

Je to pravda a za tím si stojím. Psal jsem, že musí jít o konstantní měřený signá tedy bez šumu. Se šumem už to není konstatní. U AVR není vlastní šum ADC tak velký, aby to stačilo, takže výsledkem jsou skutečně ty samé hodnoty. Pokud ne, něco je špatně. Martine, důkaz jsi napasal v posledním odstavci.

Typickým příkladem, kde to fungovat nebude, jsou např. teploměry typu DS1820 s 8b +1b převodem, které rozlišují teplotu na 1/2 °C. Průměrováním třeba 1000 vz. se rozlišení nikdy nezvýší. Obsahuje vlastní převodník, jež zbaví signál šumu, takže výsledek v registrech je naprosto vyčištěn.

Velikost šumu 1LSB je nutnou podmínkou, nikoliv postačující. Tato podmínka stačí pouze na to, aby se interval mezi 2 kvantovacími hladinami rozdělil na stejné úseky, v našem případě 4, což odpovídá rozšíření ADC o 2bity. Protože má ADC DNL zhruba 1/2LSB, promítne se to do dělení a převodník bude trpět chybou 2LSB, což je prakticky nepoužitelné. Proto je výhodnější použít větší šum, aby vzorkování probíhalo ve více hladinách a eliminoval se DNL. Jinými slovy dojde k průměrování výše zmíněného dělení kvantovacích hladin.

Šum nemůže být jakýkoliv. Musí jít o zcela náhodnou veličinu. Nesmí obsahovat nějkou předvídatelnou složku, kterou je rušení vlastního MCU. Např. rušení sběrnic, PWM, atd. Svědčí o tom i fakt, že AVR je vybaven tzv. Noise Reduction mode, který zastaví CPU na dobu převodu tak, aby nedošlo k ovlivnění výsledku.
Přidávání šumu nebo trojúhelníku do Uref je velmi nešťastné a divím se tomu, proč to Atmel vůbec uvádi v AVR121. Vznkne z převodníku docela dobrý modulátor, který vyprodukuje součtové a rozdílové frekvence, které za jistých okolností neblaze ovlivní výsledek.

Pokud někomu stačí, aby měl signál převeden s 2 bity navíc a spokojí se s tím, že se budou nějak střídat, je to jeho věc, ale takový přístroj je spíše na hraní než na měření. Ale pokud někdo chce opravdu něco měřit, bude se muset tímto problémem hlouběji zabývat a hledat metody ověřování správné funkce. Jednu jsem už naznačil pomocí histogramů.

Chapem, ako to Technik myslel, len pre exaktnost, akou sa Technik vyznacuje a za co si jeho nazory velmi vazim,

ak nastavim deliaci pomer na AD v AVR na nizku hodnotu a ziadnym inym sposobom neoptimalizujem rusenie procesora a ako tvrdi Technik:

“na vstup AD pripojim zdroj napatia s urovnou sumu pod 1LSB AD prevodnika”

aj tak bude vysledna hodnota poskakovat.

Tvrdenie,

“ze ak pripojim zdroj napatia na vstup AD prevodnika, AD prevodnik vzdy zmeria tu istu hodnotu”

treba este doplnit o podmienku, ze okolity sum i sum samotneho AD je i najhorsom pripade mensi ako 0.5LSB. Potom je Technikovo tvrdenie spravne a plne s nim suhlasim.

Martin

Zdravim chlapi,
resim problem s 10 bit. A/D prevodnikem u PIC18F4520, a to ten, ze mi po prevodu “poskakuje” nejnizsi bit (+/- jedna az dva). Zde na foru jsem se docetl, ze to je zpusobeno sumem samotneho A/D prevodniku.
Potrebuji prevest a zobrazit teplotu v rozmezi 200°C, rozliseni je tedy 0,2°C (dano 10 bit. A/D prevodnikem) a zobrazeni pri preblikavani displeje v rozmezi pul stupne opravdu nevypada dobre.
Da se tento problem resit nejak jinak nez jen softwarove eliminovat tyto prekmity (secteni vice vzorku a nasledne vydeleni jejich poctem moc nepomaha).
Vsimnul jsem si, ze cim rychleji po sobe provadim prevod tim je vysledna hodnota stabilnejsi. Toho vsak v programu vyuzit nemuzu protoze teplotu lze merit max. 3x za sekundu.
Vedel by nekdo poradit pripadne doporucit nejakou rutinu, ktera by me privedla na vyreseni tohoto problemu? Dik.

V časopise KTE 2004/6 kde jsem čerpal informace o rozšíření AD převodníku je popsána rutina pro stabilizaci poslední číslice, třeba ti to nějak pomůže.

V KTE jsou opravdu velmi dobré rutiny od pana Vonáška, ale jsou určeny pro řadu 16F, takže je budeš muset upravit pro 18F. Pokud se zaregistruješ, tak se k nim dostaneš.

Není to zbytečné zobrazovat desetinná místa? Nevím, jak přesné používáš čidlo, ale přesnost interního AD převodníku není nikterak vysoká. Jakmile “zkombinuješ” přesnost AD převodníku, přesnost senzoru, šum napájecího napětí a nepoužiješ nějaké přesné referenční napětí, tak nepřesnost měření může být klidně +/- několik stupňů. Navíc díky všem těmto vlivům budeš mít opravdu problém stabilizovat výstupní číslo. Napadá mě snad jedině nějaká matematická rutina, že když se výsledek hne řekněme o 0,5 stupně, tak se bude stále zobrazovat původní hodnota.

Na zobrazení desetinných míst bych použil spíše digitální čidlo.

Především bych udělal statistickou kontrolu. Spusť převodník při konstantní měř. teplotě tak, jak bude v praxi fungovat a nasbírej z něj cca 100 až 300 hodnot, ze kterých se udělá histogram četnosti výsledků (osa X=výsledek z ADC, osa Y=četnost konkrétní hodnoty). Myslím, že to jde udělat v excelu. Jestliže histogram četnosti odpovída Gaussově rozdělení a převodník nevynechává jisté hodnoty (např. výsledek je vždy lichý), jde o čistý šum a lze ho odstranit aritmetickým průměrem.

Jestliže dochází při pozvolně měnící teplotě k vynechávání jistých hodnot, příčina může být v rušení od CPU, nesprávné impedanci vstupu nebo špatným načasováním ADC. I když jsem to z datasheetu přímo nevyčetl, zřejmě PIC obsahuje převodník s postupnou aproximací. Převod se děje odhadováním bitů od nevyšších řádů směrem k nižším. Během převodu se nesmí signál měnit a proto je vybaven S/H (sample and hold). Pokud je frekvence ADC příliš nízká a převod trvá dlouho, na S/H vznikne pokles větší než 1/2LSB, pak dojde k chybnému odhadu nižších bitů a všechny nasledující bity za ním jsou samé 0 nebo 1.

Při přetaktování dochází k podobnému efektu. Protože se přechodové jevy na komparátoru nestačí ustálit s dostatečnou přesností, dochází k chybnému výsledku nejprve na nejnižších bitech pak postupně na vyšších. Připomínám, že celý převodník je tvořen z komparátoru, DA převodníku, registru postupné aproximace a S/H.

S/H je tvořen kondenzátorem, OZ s vysokým vstupním odporem a nějakým spínacím tranzistorem. V okamžiku, kdy je v režimu sample, je kondenzátor nabíjen přes spínací tranzistor a v tom okamžiku dochází ke “strhávání” vstupního napětí, pokud je signál na vstup přiveden přes vysokou impedanci. Výrobce doporučuje impedanci menší než 2,5 kohm. Lze tomu čelit přidáním kondenzátoru mezi vstupní pin a zem s mnohonásobně vyšší kapacitou než je v S/H.

Moc dik za rady. Nejprve si projdu ty KTEcka a dam vedet jak jsem poridil. Jinak A/D prevodnik u PIC funguje presne tak jak popsal Technik. A tu statickou kontrolu pro zajimavost taky zkusim udelat.

Ahoj,
tohle je pro mě momentálně fakt hodně zajímavý. Používám AD převodník u ATMegy16 v diferenciálním módu se zesílením 10. Hodiny pro ATMegu jsou z vnitřního oscilátoru a jedou na 8MHz. Předděličku pro AD převodník jsem nastavil na 64, tedy taktování pro AD převod je 125 KHz. Výsledky, které padají z převodníku se hodně liší asi tak v řádu 6 LSB. Takže průměruji z celkem 32 měření a i tak se mi výsledek mění o 1 LSB, občas i o 2 LSB.
Dif. vstup AD převodníku ATMegy je připojen na diagonálu měřícího můstku. Pro jistotu jsem dal na oba dif.vstupy 10n kondenzátory.
Navíc, když zkratuji dif. vstupy AD převodníku zjišťuji poměrně velký offset (tak 6 LSB). Tento offset je navíc závislý na tom, zda mám připojeného Dragona k JTAG nebo ne. Pokud je tam připojený, tak offset je tak 1 LSB. Kde může být problém?
Díky