Měnič napětí: měření vstupního napětí a generování výstupu

Potrebuji radu od vas zkusenych. Potrebuji sestrojit obvod, ktery bude na vstupu merit napeti 0-5V presnost asi 10bit a na vystupu davat upravene napeti dle nejake krivky, ktera se bude dat v programu lehce menit.
Napr. kdyz bude na vstupu 2.65V vystup 2.13V. Mereni a prevod musi probihat stale dokola o vyssi frekvenci.

Potrebuji oklamat zarizeni a ze snimace posilat zkresleny signal.
Nevim jaky avr pouzit pro tento program. Programuji jen jednoduche programy v assembleru tak se omlouvam.
Diky :smiley:

:arrow_right: administrator: přejmenováno z "menic napeti"

Pouzi ATtiny24/44/84 alebo ATtiny87/167

Vstup AD prevodnik, vystup 10b PWM. Charakteristiku si naprogramujes aku len chces. Je v prikemnom puzdre DIL14/SO14. Ma az 512B EEPROM na konverznu tabulku, ktoru mozes naplnat cez UART.

Samozrejme to splna aj hociaka ATmega48/88/468/328/16/32/164/324/644/1284
len su zbytocne o nieco vacsie.
8pinove chrusty maju maximalne 8b PWM, preto odporucam nieco v 14pin/20pin puzdre.

Pokud nepotřebuješ HW sériovou linku a naprogramuješ si křivku předem, tak můžeš použít klidně ATtiny25/45/85. Ta má nožiček jenom 8, disponuje 10-bitovým AD převodníkem s možností diferenciálního vstupu i PWM výstupem (i když pouze 8-bitovým).

Diky za reakce, ale trochu se bojim toho PWM potrebuji na vystupu cisty analog.

Hodis tam filter RC a malo by t ostacit otazka je ako rychlo to ma reagovat na zmmenu vstupnej veliciny

PWM po filtracii je cisty analog. Treba vsak navrhnut RC filter tak, aby pri striede 1:1 pokled na RC bol mensi ako 1/2LSB. Potom bude vysledny analog s neurcitostou mensou ako +/-0,5LSB. Pri pomalych vystupnych frekvenciach to vedie k vysokym hodnotam filtrov a tym aj mensej prenosovej frekvencii. Predpokladam, ze zmenu z 0V na maximum nepotrebujes za cas kratsi ako 0,5-1s. Potom sa da PWM v klude pouzit.

Pre rychlejsiu odozvu DA bez DA sa da pouzit finta, ze RC spravis rychly, t.j. R bude mat relativne nizku hodnotu. Paralelne k C das napr 1M a zan nejaky OZ. Na vystupnom pine mcu vygenerujes impulz z casom predpokladanym na nabitie toho C na pozadovane napatie. Po ukonceni pulzu (0,1 alebo 1ms) prepnes tento vystupny pin na vstup. Treba pouzit pin na ktorom je AD prevodnik. Zmerias AD hodnotu RC (s paralelnym R, navrhnes tak aby za 5-10ms, nekleslo napatie o 1,2LSB). AK je hodnota mensia, zase vygenerujes vystup do log.1, ak je napatie vacsie, vygenerujes impulz do log.0. Seriovy odpor medzi pinom a C moze byt aj 1000x mensi a preto sa napatie na C bude menit celkom svizne. Nepotrebujes ani 10b PWM. Na generovanie impulzu by som pouzil PWM vystup s tym, ze ked sa impulz skonci, vyvola sa prerusenie a v nom nastavim pin ako vstupny.

Jeste jedna otazka? Jak vytvorit takovou prevodni tabulku na vystupni napeti
Kde pri menicim se vstupu 0-5V bude vystup ruzne upraven. To znamena ze vystupni napeti bude ruzne upravovano /nelinearne/.
napr. vstup 1.65V vystup 1.12V
vstup 3.89V vystup 2.23V

to musim kazdou hodnotu konfigurovat? Nebo to lze nejak zjednodusit. Nejlepe kdyby to slo nejak konfigurovat v grafu.
Diik

Bylo by možné připravit tabulku v Excelu, který zobrazí i graf (vzorec lze snadno rozmnožit do ostatních řádků). Ale pohodlnější by asi bylo vygenerovat tabulku programově např. v konzolovém C programu - zadá se jen pár hraničních bodů a křivka se aproximuje. Pak se dá snadno exportovat do C kódu pro MCU překladač a případně také do .csv formátu pro Excel (text, oddělené tabulátory) k dalšímu zpracování či zobrazení grafu. Při použití Bezierovy křivky by se mohla dát křivka snadno konfigurovat vizuálně (táhla) nebo v Excelu modifikovat pár parametrů a sledovat graf.

To je mila otazka :slight_smile:. Uz ste brali v skole matematicke funkcie? Ak nie, potom skusim objasnit podstatu a verim, ze vzdelanejsi ma doplnia.

jednorozmerna funkcia je transformacia hodnoty X z intervalu definicneho oboru na hodnotu Y z oboru funknych hodnot. Pre funkciu plati, ze k jednej konkretnej hodnote X prislucha prave jedna konkretna hodnota Y. Opacne to uz platit nemusi (napr. funkcia sin(x) ).

Takze vytvor vztah zavislosti Y od X. Ked do tohto vztahu vlozis hodnotu X, vysledkom bude Y, ktory potom nastavis na vystupe.

Ak si najdes program, ktory z nakresleneho grafu urci optimalny typ funkcie a jej koeficienty, moze byt. Do mcu budes zadavat uz len tu funkciu.

Na vacsinu uloh spojenych s AD/DA prevodmi sa hodia polynomicke neperiodicke funkcie v tvare

y = A + Bx + Cx^2 + D*x^3 + …

ich naprogramovanie je jednoduche (vo vyssom jazyku, napr.C).
Ak je treba nelinearnu (aspon jeden z koeficientov C, D, E, … je nenulovy) polynomicku funkciu naprogramovat na rychly beh, potom sa casto pouziva riesenie rozdelenia funkcie na linearne useky. Na zaklade urcenia intervalu do ktoreho hodnota X spada, sa skoci do tabulky z ktorej sa vyberu koeficienty A a B, do linearnej funkcie sa disadi konkretna hodnota X a funkciavypluje vysledok. Riesenie typu, ze pre kazdu hodnotu X je niekde v tabulke hodnota Y sa da samozrejme tiez, ale riesenie zabera zbytocne vela miesta. Pre 10b AD zabera tabulka 2048B. Vyhladanie v nej je vsak najrychlejsie Pri urcovani (hlavne pri ich zanedbavani) koeficientov treba zohladnit vstupnu a vystupnu presnost. Ak mas 10b AD, je zbytocne pouzit funkciu zabezpecujucu presnost na jednu miliontinu. Vypocet bude zbytocne dlho trvat a aj taj neprinesie ziadnu kvalitu do zivota.

sorry, podarilo sa mi vlozit prispevok dvakrat :slight_smile:

K výpočtu polynomem malý doplněk - jedna možnost je interpolace, kdy křivka přesně prochází naměřenými body, druhá možnost aproximace, kdy křivka přibližně sleduje měření. V případě interpolace je nebezpečí, že když polynom nebude moc sedět s typem naměřené křivky, může se graf příliš rozkmitat, tj. mimo naměřené hodnoty může výpočet příliš ulítávat. Aproximace může mít stabilnější průběh, ale může se zas dost odchylovat od měřených bodů. Proto by bylo dobře udělat si výpočet nejdříve zkusmo mimo MCU (v C programu) a zobrazit si graf i naměřené body (např. v Excelu).

Kompromis mezi tabulkou a výpočtem může být interpolovaná tabulka - naměřit (nebo vypočítat) převod v několika bodech a mezi těmito body hodnoty interpolovat. Interpolace nemusí být lineární, může zohledňovat prohnutí křivky jednoduchým polynomem (mohl by stačit 2. řádu), koeficienty podkřivek by mohly být součástí tabulky. Tak by se dala obejít jak náročnost podrobné tabulky, tak i riziko nepřesnosti výpočtu.

To, co pise Panda je uplna pravda. Nastastie pri tychto typoch prevodov a transformacii su pozadovane funkcie viac ako presne definovane prave cez funkcie, ktore su primarne. Malokedy je potrebne urcovat funkciu z uplne noveho pola nameranych hodnot a k nej urcovat funkciu ktora tuto mnozinu bodov co najpresnejsie popisuje. Vacsinou to uz niekto za nas spravil, ako napriklad s PT100-vkou.

Priklad pre Pt100/500/1000

R = R0(1 + At + Bt^2 + C (t−100) t^3); v rozsahu teplot −50 až 0 °C
R = R0(1 + At + Bt^2); v rozsahu teplot 0 až 400 °C
kde: A = 3,9083. 10−3/°C
B = −5,775. 10^−7/°C^2
C = −4,183. 10^−12/°C^4

Pro Pt 100 R0= 100
Pro Pt 500 R0= 500
Pro Pt 1000 R0= 1000

Alebo casto pouzivany linearny prevod. Ak je vstupne napatie v rozsahu N1 az N2, chcem mat na vystupe napatie V1 az V2, pricom V1 moze byt vacsie ako V2 a N1 moze byt vacsie ako N2.

Vx = A + B * Nx;

A = V1-N1*(V1-V2)/(N1-N2); // do programu bude vlozena ako konstatna
B = (V1-V2)/(N1-N2); // do programu bude vlozena ako konstatna

Díky vám za rady, ale hlava mi to nebere. Podařilo se mi zjistit jaké hodnoty
budu měřit a jaké generovat PWM. Přikládám graf s popiskem o co mi jde.
Měřené a výstupní napětí je stejné cca od 0 do 2V poté se začne výstupní napětí snižovat na hodnotu o 0,6V nižší než na vstupu. Tento rozdíl by měl být až do hodnoty 5V.
Tyto hodnoty /hodnotu ubytku napěti 0,6V a hodnotu nástupu změny 2V/ budu potřebovat později co nejjednodušeji měnit.
Díky za trpělivost.
graf.xlsx (16.3 KB)
graf.xlsx (16.3 KB)

pripona *.xls by bola urcite pouzitelnejsia. :slight_smile:

Tak tedy XLS :slight_smile:
graf1.xls (34 KB)

Je to OK :slight_smile:

Daj este informaciu, s akou presnostou potrebujes dodrzat vystupnu krivku. Bud v % z maxima alebo vo voltoch. Nieco potom vymyslime :slight_smile:

Presnost nejlepe asi 10mV pokud by neslo tak max 50mV.

Na zaklade prezretia tabulky rozdielov to vyzera, ze meranie je znacne zatazene chybou merania. Napr. riadok 24 indikuje znacny pokles rozdielu funcii.

Skus objasnit na co to ma byt.

Inak podla prezretia je na prvy pohlad zrejme, z e funckia sa da rozdelit na 4 casti.

po bod 10, medzi bodom 10 a 13, medzi bodom 13 a 55 a nakoniec medzi bodom 55 az 64. V ramci týchto usekov si spocitaj vysledky linearnej regresie. Ale napriklad pre ten bod 23 nedosiahnes tymto pristupom odchylku do 50mV. Na druhej strane prave ten bod 23 vyzera ako typycky zatazeny chybou merania.

to co je v grafu je výběr z hodnot, které jsem naměřil osciloskopem na podobném zařízení. Když to shrnu tak do cca 2V na vstupu jsou hdnoty stejné na výstupu.To je OK. Pak se napětí na výstupu sníží o 0,6V během asi 1V. A to je to co nevím jak počítat programově. Postupné snižování napětí během určitých vstupních hodnot.
Programuji zatím jen v assembleru.
Jo a ty poklesy jsou opravdu asi chyby v měření.