Vícevstupový teploměr-přepínání čidel PT1000 v odpor. můstku

9 bitů jen proto, protože 10. bit používá jako znaménkový. Takže stačí přivést ne počátek, ale střed měřeného rozsahu a výsledek pak bude 10 bitový.

TO: Panda38
Nejsem si jist, jestli jak je to vlastně s rozlišením při použití dif.vstupů u ATmegy16. V datasheetu v overview píšou toto: … If 1x or 10x gain is used, 8-bit resolution can be expected. If 200x gain is used, 7-bit resolution can be expected. Ale podle způsobu výpočtu convert result ADC=((Vpos - Vneg)Gain512)/Vref bych řekl, že máš pravdu a výsledek je 9-ti bitový. Máš v tomto režimu nějaké zlušenosti? Nějak asi nechápu datasheet.

Nemám bohužel zkušenosti, používal jsem jen jednoduchý nediferenciální vstup na voltmetr. Jen tak podle datasheetu jsem to tak pochopil, že diferenciální měření jen posouvá úrovně měření z nesymetrického na symetrické, s plným rozsahem. U gain bych pokles rozlišení chápal, protože se zvyšuje citlivost vstupu a zasahuje už do šumových oblastí. Jestli jsem to správně pochopil, tak jestli zaručuje 10bitové rozlišení (0 až 1023) s max. úrovní 2,56V, tak by mělo fungovat i rozlišení -512…+511 s max. úrovněmi -1,28 … +1,28 V (takže když se bude porovnávat se střední hodnotou a k výsledku se pak přičte 512, tak bude hodnota 0 až 1023). Možná už bude nutné procesor během měření vypínat do stavu klidu, pro snížení rušení.

Ale také si nejsem moc jistý, když koukám do datasheetu, jak to s těmi diferenciálními vstupy je, nevím proč uvádějí 8 bitů i pro gain 1x. Ten programovatelný gain uvádějí jen u 2 kanálů, o ostatních standardní citlivost, tak by bez gain mělo těch 10 bitů platit. Takže nevím. Možná to bude fungovat bez problémů a možná naopak to co jsem psal vůbec neplatí.

Ale kdyby fungovalo - výsledek by pak mohl vyjít docela jednoduše, jen MCU + pár odporů. Případně nějak vyřešit přepínání rozsahů (mosfety?), aby si uměl přepínat měřicí oblast, tj. vlastně jenom přepínat tu střední referenční úroveň a tím se bude posouvat v pásmech měření podle potřeby.

kmitl.ac.th/~kswichit/Pt100/Pt100.htm

Vyzkoušel jsem variantu s diferenciálním vestupem ATMegy. Výsledek je 9b + znaménko, tedy skutečných 1024 hodnot. Nevím tedy proč v datasheetu píšou, že výsledek je 8b ???! Nastavil jsem G=10 a jak psal Balů, max. hodnotu, která odpovídá max odporu čidla nastavuji na AREF. Jediný co mi zatím nesedí se mi zdá, že G není přesně 10, ale 10,6. Nemáte s tím někdo zkušenosti? V datasheetu jsem ale našel, že chyba zesílení je 1 LSB, ale to mi tedy vychází mnohem horší.

Konkrétně, pokud přivedu na dif. vstupy 0,1576V, převodník vrací hodnotu 376 ale měl by vracet 355 (105120,1576/2,2736 = 355). Takže bych spíš řekl, že mám něco špatně, pokud má být chyba zesílení max 1 LSB.

Taky mi převod na jejnižším bitu ADCL kolísá tak o 4, ale to je možná způsobeno propojovacím polem a drátkama. Já stejnak všechny převody průměruju, takže by to zase tak moc asi nevadilo. Na těch dif. vstupech MCU mám úrovně od -227,3 do 227,3 mV, ref. mi vyšla 2,2736 V.

Prosím nenáte někdo zkušenost s tou přesností G těch dif. vstupů ?

Ještě jsem zapomněl napsat jeden poznatek, že totiž musím v obslužné rutině pro AD vypnout AD převodník (ADEN=0) a před spuštěním převodu ho znovu zapnout (všechny převody jsou tedy rozšířené), jinak mi to vrací místo těch hodnot kolem 376 hodnoty kolem 389 (při 0,1576). To je taky docela divný, ikdyž to by mi tolik nevadilo.

Treba si polozit par otazok, je napetie pre adc vstup filtrovane? Na 10 bitoch asi nebude vhodne pouzit internu referenciu a ak uz, zmeraj presnym pristrojom napetie na pine Uref, diferencne meranie , predpokladam ze to co treba merias priamo na dif vstupoch do mikroprocesora a nie merakom za 5 E. A ked to priemerujes a zobrazujes, je mozne ze signal bude mat inu hodnotu asi by bolo mozne na to radsej mrknut osciloskopom a pozor kde to pripojis a budes merat, o moznych ubytkoch napetia na nejakych privodoch , a v skusobnom poli ani nehovorim.

Myslíš tím že jsi nastavil Gain = 10x ? Tam se ale podle datasheetu snižuje přesnost na 8 bitů (kvůli zarušení) a pokud používáš jen kladný rozsah tak pak je výsledek jen 7 bitů (což odpovídá tomu skákání hodnot jak píšeš).

To: Panda38
Aha, takže je to asi myšleno tak, že poslední bit mám zahodit, protože jinak ten AD převodník vrací fakt 1024 hodnot. Kde jsi vyčetl, že těch 8 bitů je kvůli zarušení? Já to v tom datasheetu nevidím. A hlavně to už je fakt málo a musel bych se vrátit k prvnímu řešení s externím dif. zesilovačem a SE převodem.

Na vstupech ADC0 a ADC1 mám 100n kondenzátory proti analogové zemi, ty jsou tam dle osciloskopu nutné. Referenci mám externí, ale mimochodem s interní referencí na 10-ti bitech jsem neměl při použití SE kanálů nikdy problém. Jnak ty napětí co jsem psal, sem měřil přímo na nožičkách MCU a dost přesným multimetren (6,5 digit, 0,0035% DCV), takže ne za 5E.
Máš s dif. zapojením kanálů u ATmegy nějaký zkušenosti ?
Jde mi o počet bitů, protože podle datasheeetu je rozlišení v dif. módu pouze 8 bitů (při G=10), ale podle toho, co jsem odzkoušel to vrací 9 bitů + znaménkový bit, tedy 1024 hodnot.

Jen se tak domýšlím z věty “If 1x or 10x gain is used, 8-bit resolution can be expected. If 200x gain is used, 7-bit resolution can be expected.” A že mi to přijde logické - nedělají více než 10-bitový převod, protože už by se dostali do oblasti vstupních šumů. Proto když se signál 10x zesílí, vzroste úměrně citlivost na šumy. takže i když bude měřit 10-bitově, tak nejjnižší 2 bity budou zašuměné. Což se ještě víc projeví u zesílení 200x. Nesedí mi tam to tvrzení že to platí i pro zesílení 1x, ale jestli jsem správně pochopil, zesilovač je jenom u některých kanálů a zřejmě tam vnáší nějaký šum i pro zesílení 1x.

Myslel jsem, že budeš moci zapojit čidla tak, aby poskytovala diferenciální napětí -1V … +1V i bez zvyšování citlivosti gainem, pak by to měřilo s přesností na 10 bitů (s rozsahem vstupního napětí 2,56 V). Nevím proč tam gain zapínáš?

Ty čidla mi v můstu nedají tak velký rozsah (-1 až +1V). Musím je mít v můstku, právě proto, že jsem nechtěl použít externí (vícebitový) převodník. Jenže pokud chci trochu slušnější přesnost s 10-ti bitovým převodníkem, nemohu si dovolit “zahodit” část rozsahu, kterou nikdy nevyužiju (v mém pžípadě pod -80°C, resp.pod nějakých 600 Ohmu). Proto je můstek nutný (potlačím pro mě nevyužitelnou část rozsahu pod 600 Ohmu). Na druhou stranu tím čidlem by neměl téci větší proud než nějakých 0,8 mA při 1KOhm (uvádí výrobce) kvůli samoohřevu. Já tam mám asi 0,9 mA, právě aby z toho můstku lezlo co největší rozsah napětí s tím, že samohřev by neměl být velký, pokud bych to čidlo spínal třeba fetem pouze na kratičkou dobu, kdy se nude měřit. No a pak mi vychází výstupní napětí v diagonále můstku -0,2273 do 0,2273V. Spočítal jsem to takto simetricky, právě abych mohl plně využít celý rozsah toho diferenciálního zesilovače.

Hm, to pak vypadá rozumné použít gain 10x. … a asi to fakt už bude málo přesné a bude třeba zesílit 10x raději operákama.

Není potřeba dát ty filtrační kondenzátory na vstupu větší? Při tak malém odporu možná moc nefiltrují a chytají pak dost rušení? A jestli ještě není potřeba během převodu uspávat MCU.

Jasný, ještě zkusím znětšit ty kondy, sleep mi nikdy moc nepomohl, ale je fakt, že jsem to vždy zkoušel s SE módu, ne v dif. módu. Asi to bude poslední pokus a pak se vrátím k operákové verzi, což je sice trochu škoda, ale chodilo to docela pěkně.
Ráno to vyzkouším a dám Ti vědět, každá zkušenost se někdy hodí…
Jenom nechápu, že když píšou v datasheetu o 8 bit. rozlišení v dif. módu, že tam dále píšou vzorec pro dif. výstup ADCH:ADCL=G512(Upos-Uneg)/Uref. Možná ještě zkusím napsat dotaz hochům do Atmelu, jak to vlastně myslej, ale to je tak na týden… než odpovědí…
Jinak když na to koukám 6,5 místným multimetrem, tak to rozdílové napětí docela slušně sedí a měmí se až poslední digit, což jsou jednotky mikrovoltu - na hnízdo na propojivacím poli je to podle mě dost slušný. Bohužel ta ATmega už to takhle pěkně stabilní nevidí.
Jinak určitě hezkej novej rok…

Oni to myslí jistě tak, že ten převodník měří stále 10-bitově, leze z toho 10 bitů, ale použitelných je jen horních 8 a nejnižší 2 bity jsou nepoužitelné kvůli zašumění.

Psal jsem to v jiném vlákně, ale kdybys to tam neviděl tak to raději zkopíruju i sem. Možná že by se Ti z toho mohlo něco hodit, trochu něco k přesným A/D převodníkům:

Díky moc za inspiraci, řešení s tím ICL7135 vypadá docela zajímavě.
Ale ještě jsem si malinko hrál s tím mojim řešením s využitím dif. vstupů ADC0 a ADC1 té ATMegy a ono to s tím šumem možná nebude tak zlý jak to vypadalo. Na AREF jsem totiž měl jenom 100u elyt a chyběl mi tam 100n kondík proti rušení a hned je to úplně jiný kafe. Ten převod se už mění pouze o 1 LSB, ale jenom pokud udělám jeden převod, který skločí na brakpointu, další převod opět na breakpointu atd. Jenže vždy dělám 16 převodů a pak z nich počítám průměr (pro jistoru). Pokud ale dělám jeden převod za druhým a breakpoint si dám až za výpočet průměru, zjistím, že převody vycházejí tak o 10 více, tedy velká chyba. Zkusím tedy ještě nad tímto trochu zabádat, ale to by už asi mohlo nějak jít. Pokusím se zlepšit filtraci a vkládat nějaká zpoždění mezi jednotlivá měření. Nemáš nějaký typ, co by ještě mohlo pomoc ?

Nezvažoval jsi nějaké to uspávání procesoru během měření? Nevím teda sice jak se to dělá, ale v datasheetu to doporučovali kvůli snížení rušení měření. Nějak že se vypne oscilátor a běží jen A/D převodník a po ukončení převodu se procesor zas probudí.

K tomu průměrování hodnot - s něčím obdobným jsem se potýkal u snímání touche, hodnoty moc skákaly, tak jsem je průměroval. Ale mnohem lepších výsledků jsem dosáhl, když jsem místo průměru použil medián: cs.wikipedia.org/wiki/Medi%C3%A1n

Což znamená - těch 16 vzorků ukládat do pole tříděně a pak vzít hodnotu z prostředku seznamu. Rušení se totiž projevuje tak, že většinou to kmitá kolem středu, ale některé hodnoty hodně ulítnou. Při průměru ty výstřely hodně zkreslí výsledek. Ale když se použije medián, tak se vlastně vezme nejčastější hodnota a tak výsledek není tak zkreslený těmi ústřely a je stabilnější.

Bylo by prima kdyby se Ti to podařilo dotáhnout v této nejjednodušší variantě a dosáhnout dobrých výsledků. V jednoduchosti je krása. :slight_smile:

Aha, ten Medián vypadá fakt mnohem rozuměji než aritmetický průměr. S tím SLEEP módem jsem to vyzkoušel, ale vypadá to, že to nepomáhá. Ale nevím do jaké míry je ve skutečnosti uspím, když to ladím pomocí Dragona. Jestli to vůbec usne.

Předpokládám že používá JTAG interface. Možná že to fakt koliduje s ADC sleepem. V datasheetu píšou, že “ADC Noise Reduction” mód zastavuje MCU a povoluje jen ADC, externí přerušení, 2-wire serial, Timer2 a Watchdog. JTAG zřejmě ne a proto možná s JTAG neusíná. … Jen dohad.