PIC16F877A - A/D převodník - měření amplitudy Špička-Špička

Potřeboval bych pomoct s A/D převodníkem. Mám zjístit hodnotu větší než 2.5V ŠŠ. Nevím jak A/D měří amplitudu, jestli jen kladnou část nebo se amplituda nějak rozloží do rozsahu 0-5V. Dík moc za jakoukoliv pomoc.

AD meria iba kladne napatie v rozsahu GND az Uref.

Ak je merane napatie vacsie ako tento rozsah, treba ho znizit napr.odporovym delicom. Aby si mohol merat spicka -spicka, musis dosiahnut, aby v kludovom stave (Uvst = 0V), bolo na vstupe AD 1/2Uref. Vstupne napatie potom bude tuto hodnotu posuvat dole k nule, alebo hore k Uref v zavislosti od velkosti vstupneho signalu. Na taketo “prespracovanie” vstupneho signalu sa pouzivaju operacne zosilovace.

Problém je, že toto mám udělat bez nějakých děličů…

To je absolutna blbost, ak ma byt vstupne napatie vacie ako Uref, sa to inak ani neda. Posli sem to tvoje zadanie. Lebo bud mu zle rozumies, alebo je to nejaka blbost. Ale asi skor to prve. :slight_smile:
Akonahle mas merat zaporne napatie (predpokladam, ze to napatie je striedave) a prevodnik neobsahuje napatovy ofset, MUSIS ho tam nejako spravit. A to sa robi prave tymi delicmi a suctovymi clenmi. Nie je nevyhnutne tam dat ten OZ, ale na dodrzanie vstupnych parametrov (vysoka impedancia, netlacenie nejakeho napatia - i ked s malym prudom - do vystupu nejakeho zariadenia).

Inak striedavy signal je taky, ktory meni svoju polaritu. Ak sa nemeni polarita ale iba amplituda vstupneho signalu, jedna sa o puzlujuci signal.
Spicka - spicka sa meria pri striedavom signali. Ak mas merat striedavy signal, inak to neurobis, ako s ofsetom vstupneho napatia. Este by si mohol signal usmernit mostikovym usmernovacom (ale nie len tak, lebo tie diody ti meranie velmi skreslia). Potom budesmerat jednotlive polvlny, pricom vies, ze kazda druha je opacnej polarity a budes pripocitavat velkosti polvln nasledujucich za sebou. To da tiez spravny vysledok, ale musis dosiahnut presne usmernenie.
Pozri si niekde schemy takych usmernovacov. To je ale nepomerne zlozitejsie a menej presne, ako spravit napatovy ofset do stredu Uref a merane napatie (ak je jeho amplituda vacsia ako 1/2Uref) znizit pomocou odporoveho delica.

Hlavne sem daj to presne znenie zadania.

Zadání bylo udělat určité kroky když je na vstupu signál s amplitudou větší než 2.5V ŠŠ. Už jsem na to nějak přišel. Nasnímal jsem par stovek vzorků zjistil nejvyšší hodnotu a nejmenší(možná zbytčně protože byla vždy nula), udělal rozdíl a měl jsem napětí ŠŠ. Teď to musím ještě nastavit tak aby mi to bralo signál jen s frekvencí 1kHz až 2kHz. To udělám nejspíš pomocí časovače kdy odměřím délku amplitůdy, ale moc si s tím nevím rady jak to udělat.

Signal vacsi ako 2,5V s-s moze byt i signal 50V s-s a ten by som na pin procesora nepripajal. To by si mal upresnit.

Ak chces vyhodnotit s-s iba pre frekvencnu oblast 1-2kHz a signal vo vseobecnosti moze obsahovat signal od 0Hz (asi urcite 50Hz a 100Hz) do napriklad 5kHz, mozes urobit bud digitalnu pasmovu priepust, alebo signal navzorkovat s postvat nan FFT (rychlu fourierovu transformaciu). S nejakym casovacom tu nepochodis. Doporucujem nastudovat aspon zaklady s teorie signalov, minimalne teoriu o potrebe minimalne dvojnasobej frekvencii vzorkovania meraneho signalu - shannon kotelnikov. To si daj do Googlu a uc sa :slight_smile:, inak mozes lahko pohoriet.
Okrem toho, ked si nameral nulu, si si isty, ze ten signal nesiel pod GND? Jasne, ze ak to AD prezije, tak ti da nulu pre vsetky napatia mensie ako GND, lebo on ma rozsah 0-Uref. Zaporne napatie preto neregistruje a Ty mas zle meranie, tak si to prever, respektiva sa na to pozri aspon osciloskopom.

Už to mám odzkoušené a funguje to, napojil jsem na vstup generátor a pustil tam sinusovku. Vše jsem sledoval na osciloskopu a děla to od 2.5V vše to co má, takže to tak nějak funguje. Větší napětí jako 50V tam určitě pouštět nebudu. Teď akorát zjístit jak udělat to frekvenční omezení. Napadl mě právě časovač. Myslel jsem to tak, že jak zjístím poslední nejvyšší hodnotu zapnu časovač a ten vypnu až jak narazím na poslední nejnižší hodnotu. Změřím si tedy čas pro ty dvě hranice a co bude mimo nepustím. Samozřejmě jakékoliv jiné řešení bych ocenil. Například ta digitální pásmová propust je zajímavá, ale nevím jak na ní.

To znamena, ze pod 2.5V to nerobi to co ma?
Skus sa vyjadrovat presnejsie.
Ak napises, ze potrebujes sledovat napatiel nad 2.5V nediv sa , ze dostanes odpoved v zmysle “odporovy delic”. Ten totizto riesi i tych 50V.

Kam pripajas ten generator? Medzi co a co ? Medzi vstup a GND?
Ak je to ale generator STRIEDAVEHO signalu, potom tam ale dostavas aj zaporne hodnoty. Ako ich spracuvas? Mas tam nejaky usmernovat?
Tvrdis, ze najnizsia hodnota je 0. Ale to nie je skutocne namerana hodnota v pripade striedaveho signalu. Ma ten signal striedu 1:1? Je harmonicky?
A ak das odpoved typu “mne to nejak tak funguje”, tak sa nediv reakciam. :slight_smile:

Pouštím tam sinusovku z generátoru napojeného na AN0 a GND. Blbě se trošku vajadřuju. Snímá mi to i napětí pod 2.5V. Jde o to, že to musím mít čistě jen přes PIC bez nějakých děličů. Moc díky za rady, si jediný kdo tu aspoň nějak reaguje. Jinak ten způsob měření funguje jak má, ale musím to ještě frekvenčně omezit.

Ak si dal signal zo striedaveho generatora medzi Aina GND, potom minimalne napatie nie je nula, ale nejake zaporne. AD rpevodnik Ti vsak pre vsetky napatia mensia koa 0V vrati vysledok 0V. Takze ty teraz merias iba velkost kladnej polvlny.
Odporovy delic nie je nejaka speci suciastka. Nemoct ho tam pouzit je ako nemoct pouzit fitracny kondenzator. Ved predsa AD vstup musis zabezpecit i proti nahodnym prepatiam a seriovym odporom znizis pripadny vybijaci prud cez mcu. Ak to neurobis, mozes si mcu omylom i odpalit.
Bez napatoveho ofsetu nemozes merat stredavy signal tak ako tu popisujes. Ty merias iba kladnu polvlnu a to rozhodne nie je spicka-spicka. A este k tomu s najvacsou pravdepodobnostou cez vnutornu ochrannu diodu v mcu skratujes zapornu polvlnu z generatora. Asi ma ochranu proti pretazeniu, inak vy si si mohol odpalit jednak cast v mcu a jednak znicit generator. Ze sa zatial nic take nestalo, povazuj za stastie zaciatocnika. :slight_smile:

Pokud potrebujes zpracovavat jen urcite pasmo frekvenci, tak ciste jen s procesorem neni mozne ukol splnit. Minimalni vzorkovaci frekvence musi byt 2*Fmax, potom muzes pouzit digitalni (v procesoru) horni propust, nebo vzorkovat rychleji a vytvorit pasmovou. Ovsem KAZDA uloha na digitalni zpracovani signalu vyzaduje na vstupu prevodniku AA filtr (analogova DP) aby se do prevodniku nedostaly frekvence vyssi nez Fs/2. Jinak by totiz dochazelo ke zrcadleni spekter a meril by jsi nesmysly…
Analogova pasmova propust by ve tvem pripade byla nejspis nejsanazsi cesta (vzorce a schema se da najit a jeji funkce je snadno pochopitelna). Vytvaret ve tvem pripade digitalni filtr asi nema moc smysl kdyz toho o zpracovani signalu jeste moc nevis.

Mám to zadáno jako projekt ve škole do jednoho předmětu. Jsem úplný začátečník a snažím se to nějak pochopit.

Moje úplné zadání(projekt se skládá ze tří částí):

[code]P1
Pokud je na vstupu signál s amplitudou větší něž 2,5V šš, svítí LED1.

P2
Pokud je na vstupu signál s amplitudou větší než 2,5V šš a frekvencí od 1 kHz do 2 kHz, svítí
LED1.

P3
Pokud je na vstupu signál s amplitudou větší než 2,5V šš a frekvencí od 1 kHz do 2 kHz, program
třikrát pískne a blikne při každém pípnutí LED1. Program musí využívat přerušení a časovač jak
pro vzorkování vstupního signálu, tak pro generování pípání. Pípání je 200 ms dlouhé a 200ms
pomlčka. Frekvence je 500Hz. Během pípání se nevzorkuje z A/D převodníku.[/code]

Máme to řešit čistě jen pomocí PIC. Tu první část jsem tak nějak zvládl a funguje tak jak má, ale není uplně nejspíš dobře.

Zkoušel jsem frekvenci odměřit i pomocí počtů vzorků od maximální hodnoty do opakování této hodnoty, ale pokaždé to vyšlo úplně jinak.

U harmonickyho signalu se lip detekuje pruchod nulou nez spicka :wink: Strmost pri pruchodu nulou je totiz nejvetsi a proto se da presny okamzik snadno urcit. Naopak v miste amplituy je zmena v case minimalni - tezko se trefuje do toho spravnyho okamziku, proto ti to asi trochu blbne.

Jesli jsem to pochopil spravne, te v te uloze zajima v podstate pouze to, zda je max. hodnota vetsi nez 1,25V (u stridaveho sig.) popr. jesli rozkmit signalu prekroci rozsah prevodniku(st sig. s offsetem 1,25V) - tj. hodnota nejakou dobu zustava konstantni a pak pruchody nulou. To by ti melo na tohle zadani stacit :wink:
Pro jine signaly nez tyto dva se bez externich soucastek proste neobejdes.

Ale vazne se mi nezda to pouziti “jen procesoru”, jeho vstupy nejsou blbuvzdorny (tedy byvaji, ale jen do urcite miry)…

Asi sa vychadza z predpokladu, ze napatie generatora nepresiahne Ucc procesora. Opytaj sa vyucujuceho, ake je max. a min. napatie na vstupe a ci treba obvodovo osetrit zaporne polvlny signalu. Ak Ti odpovie, ze zaporne polvlny obvodovo, t.j. mimo PIC, (do PIC sa NESMIE dostat zaporne napatie, interne ochrany ho ako tak ochrania, ale ani tie nie su vsemohuce. Kludne si pozri max dovolene napatie na pinoch procesora, odhadujem ze tam bude nieco v zmysle GND - 0.3V) osetrovat netreba, tak je velka truba.
Mozno predpoklada, ze zaporne polvny sa na vstup nedostanu a je to osetrene ofsetom na strane generatora. To Ti ale musi aspon slovne potvrdit.

Asi sa vychadza z predpokladu signalu 1:1 s ignorovanim sumu. Potom mozes na meranie frekvencie pouzit casovac a to tak, ze si odpamatas cas z casovaca, ked sa dosiahne nejaka uroven vst napatia napr. pri nabeznej hrane signalu (predchadzajuca vzorka je mensia ako nasledujuca). Znovu si odpamatas cas, ked tato udalost nastane. Z rozdielu casu vies odvodit frekvenciu. Spytaj sa, s akou presnostou mas detekovat frekvenciu. Ak by si totizto vzorkoval 1x za 100us (10kHz), meranie 2kHz bude zatazene chybou 20%. Ak ma byt chyba pod 2% potom by si musel mat casovac s rozlisenim 10us a pod tymto casom musis i pravidelne robit AD prevody.

Nechapem, aky ma vyznam nevzorkovat AD pocas pipania, ale ak to tak chce, nech to tak ma :slight_smile:

Připadá mi, že některá zadání jsou spíše pro akademickou debatu nebo pro vyzkoušení studentů, než pro praktické řešení. Měřit napětí špička-špička je dost velký problém sám o sobě a pouhým vzorkováním se měří cosi vzáleného od skutečné hodnoty. Špičky totiž mohu trvat třeba jen několik nanosekund, a to nějaký převodník v PICu nebo v AVR či jiném MCU neuvidí. Chybí mi tam, o jaký signál jde. Může jít třeba o šum, alkustický signál nebo čistý sinus?
Pokud by šlo o sinus, což považuji za nejpravděpodobnější, lze to řešit poměřně jednoduše. Rychlost vzorkování by musela být tak velká, aby časová vzálenost vzorku od amplitudy nezpůsobovala větší chybu než 1/2 LSB. Tedy
|A - sin(2pif*t)| < 1/2LSB
alespoň pro jeden vzorek, kde t je okamžik měření a f je frekvence měřeného signálu.
Pokud by frekvence vycházela příliš vysoká, lze změřit oba časy průchodu nulou a načasovat spouštění ADC přesně mezi těmito časy, tedy v amplitudě. Další možností je vypočítat maximum a minimum interpolací z nasbíraných vzorků. Pro spolehlivý odhad amplitudy sinusového signálu musí být alespoň 4 vzorky na periodu.

V každém případě musí být měřený signál posunut do lin. oblasti o 1,25V proti GND MCU, jinak jak píše Martin, dojde k limitaci měřeného signálu a jeho deformaci. Výsldek nebude odpovídat ničemu. Představme si, že by zdroj signálu měl na výstupu kondenzátor. Ten by se nabíjel v závislosti na amplitudě přes ochrané diody MCU a vytvářel by ss složku. Co by se tak asi změřilo? A co kdyby tam kond. nebyl a amplituda byla stejná. Máš pocit, že by se změřito totéž? Výsledek by byl závislý na výstupní impedanci zdroje.
Nevím jakým MCU to chceš měřit, ale možná, že jde u něj rozšířit rozsah např. přepnutím Uref na Ucc a zvětšit tak lin. rozsah. V opačném případě se to neobejde bez externích součástek!!!

Ještě mě napadá, že ke zjištění signálu většího nebo menšího než 2,5V by stačil komparátor, ADC by nebylo třeba, ale na jakou hodnotu ho nastavit, když obecně měřený signál může obsahovat ss složku.

Dneska jsem na tom dále pokračoval a ptal se jak to tedy řešit. Signál tam posílám tedy sinusový z generátoru a mám nastavený offset aby se ten sinus posunul. Takže mi AD převodník snímá i zápornou půl vlnu. Tahle část mi snad funguje dobře, protože mi to zkoušel a byl spokojený. Teď musím udělat konečně to frekvenční omezení. Říkal mi, že to mám řešit pomocí časovače “Než dojdete k nejvyšší hodnotě časovač nulujte a při první menší hodnotě než maximum se časovač spustí. Jak dojde k první hodnotě po minimu budete mít uplynulý čas…”. No jsem z toho uplně mimo, jako nováček v assembleru, který ten předmět má nějakých 5 týdnu to nějak nedávám.

Tohle je vyjímečně jasné. Měl by na to stačit TMR0 s rozlišením 8bitů. Bude to jednodušší. S ohledem na vstupní frekvenci a systémové hodiny musíš zvolit vhodný dělící poměr předděličky. Budeš ve smyčce číst A/D převodník a současně nulovat časovač(čítač) TMR0. On se dokonce dá zastavit přepnutím na externí hodiny a pak přepnutím na interní hodiny spustit. Tedy vzorkuješ vstupní signál a v prvním bodě čekáš až signál poroste, tj. aktuální naměřená hodnota je větší než předchozí, v paměti, uchovaná hodnota. V druhém bodě čekáš, až bude aktuální hodnota menší než předchozí. Až se to stane, tak právě přešel vrchol sinusovky a spustíš časovač na měření periody vstupního signálu. A znovu čekáš podle bodu jedna a dva, ale už nenuluješ časovač, necháš ho běžet. Po opakovaném projití bodem dva vypneš časovač a porovnáš výsledek s dvěma konstantami, které do programu zadáš jako mezní periody požadovaného signálu. Psát program ti nebudu, ale poradit můžu. Právě programuju něco podstatně zábavnějšího, ale je to také zpracování signálu online.

Na zjištění frekvence přeci nepotřebuji žádný timer, když vzorkování běží pevnou známou frekvencí. Amplitudy musí být vždy vzdáleny o jistý počet vzorků jež odpovídá měřené frekvenci. Stačí zvolit šikovně vzorkovací frekvenci. Např. při 10kHz vzorkování bude mít měř. frekence 1kHz amlitudu v každém 10. vzorku.

Ještě bych chtěl upozornit na to, že spouštění měření časů od amplitudy signálu není optimální, protože se signál mění velmi málo a šum z ADC příliš ovlivňuje čas spouštění. Program by mohl vyhodnotit i 2 amplitudy po sobě. Proto je lepší využívat ke spouštení bod, kde se signál nejrychleji mění a tím je průchod nulou( u sinusovky). Spočítá se střední hodnota a hledají se 2 po sobě jdoucí vzorky, z nichž jeden je menší než střední hodnota a druhý větší. Počet takto nalezených dvojic v množině vzorků nasbíraných za jednu sekundu dává frekvenci měř. signálu.
Střední hodnotu není třeba počítat přesně, vyhoví exponenciální nebo plovoucí průměr. Lze místo něj zvolit i konstantu ležící mezi min. a max.

Takže po dnešním zkoušení jsem úplně v koncích. Vůbec nevím jak na to a kde dělám chybu. Chtěl bych tedy poprosit kohokoliv kdo by byl ochoten nějak pomoci. Kdo by byl ochoten ať mi napíše určitě bysme jsme se nějak domluvili.

:arrow_right: administrator: příspěvek byl upraven
Vymazal jsem kontaktní údaj. Není zakázáno psát emailové adresy, je zakázáno žádat o soukromou pomoc, kterou nebudou moci využít ostatní čtenáři fóra. Komerční inzeráty s žádostmi o zpoplatněnou pomoc, se zakládají v Off-topic.