Jednoduché schéma můžeš mít třeba jako na obrázku. V reálu by tam samozřejmě muselo být hejno ochran, v závilosti na proudovém rozsahu také jiný způsob snímání, ale tady se na to asi nehraje.
R4 je měřený objekt.
R5+R6 je napěťový dělič. Je třeba ho nastavit podle požadovaného vstuního napětí. Pokud bys jako referenci převodníku použil +5V AVcc, tak pro vstup +40V je nutný dělič 1/8 => R5 = 7*R6. Např. tedy R6=10k, R7=70k.
R3 je snímací odpor proudu. Zase záleží na rozsahu, ale třeba pro rozsah do 0.5A můžeš mít např. 1 Ohm. Na převodníku se potom bude vyskytovat napětí 0 - 0.5V.
Abys získal napětí na měřeném zařízení, toto napětí na R3 je nutné odečíst od hodnoty spočítané z děliče (Vr4 = 8*V_adc - I_adc).
podla mna ma merat dve napetia… bude tam nejake OZ pre zosilnenie napetia zo snimacieho odporu… tak ze nekomplikovat prespikovanymi logickymi uvahami ako by sa to dalo
Dej sem současný stav zdrojáku - hlavně ten soubor s měřící funkcí (jako přílohu, ať nezaplácneš celou stranu).
Ale jde jen o to před začátkem převodu změnit kanál na ten, který chceš měřit (ADMUX).
Koukám, že to zkoušíš rozdělit do více souborů. Když to neumíš, radši to namasti do jednoho, nebo se podívej do hozova vlákna.
Jinak teprve to luštím.
edit: používáš tam jakýsi “delay”. Zvaž použití vestavěné funkce v gcc Také je použita v příkladu ve zmíněném vlákně.
Hlavičkový soubor lcd4bit.h nemá ochranu proti vícenásobnému vložení.
V podmínce v souboru “some.c” chybělo rovnítko (mají být 2, jinak je to piřazení a to je vždy TRUE). Ten příkaz za ifem se má provést pouze když je podmínka TRUE? Jesli ano, bylo by vhodné ho napsat na stejný řádek s podmínkou - aby bylo vidět, že to k tomu patří.
Vím, že těch warningů není málo, ale občas sdělují užitečné informace
Doplnil jsem frekvenci mcu do nastavení projektu (zas o warning méně ). Soubor “tlacitko.c” je tam při současném stavu zbytečný (nemá hlavičkový soubor a jeho funkce není nikde volána). Pokud jsi ho zdědil z jiného projektu, tak ho z tohoto odeber.
Ta lcd knihovna je šílená, ale jesli chodí, tak budiž. Jen doladit její hlavičkový soubor.
Upravil jsem soubor s funkcemi ADC a vytvořil jeho hlavičkový soubor. Můžeš se dále snažit . Cv_2.zip (22.3 KB)
Sposob ako to je napisane som prebral z velmi obmedzeneho poctu prikladov co sme robili v skole. Nejaku hlbsiu teoriu k tomu nepoznam. Mal som to len jeden semester bez nejakeho vysvetlovania a sam som sa toho vela nestihol naucit
To nastavení jsem nezkoumal, ale přednastavuješ tam ručně čítač. To přednastavení se takto použije pouze 1x a pak už pojede celej. Pokud tedy TOP-64536 dá 1ms, tak další přerušení bude mnohem později. Lepší je použít některý v PWM módů (14 nebo 15 jesli se nemýlím), kde si uložíš TOP hodnotu do některého z registrů (popsáno v DS) a nemůsíš se o to již starat. Když tam např. uložíš 999, čítač bude mít délku 1000.
Ten řádek s SREG je nastavení sei? Místo toho stačí napsat “sei();”. Je to makro z interrupt.h, který musíš mít stejně pro použití přerušení vložen.
Ještě jedna věc. Pro měření výkonu bys měl vzorkovat oba kánály současně. To však není na mcu s 1 ADC možné. Bylo by tedy dobré provést alespoň obě měření ihned za sebou. První tedy spouštět timerem a druhé okamžitě po dokončení prvního.
Bojuješ stále s timerem po svém nebo zkoušíš pwm s omezením délky timeru? Nebo máš pauzu?
Jen se pilně uč
řešení máš povícero. Nejlepší by to bylo přerušeníma, ale to by pro tebe bylo asi zbytečně složité.
Nejdřív budeš potřebovat nastavit ten timer na 1ms. To kdyžtak dáme dokupy bezproblému.
Ve tvém případě bych to asi dělal co nejjednodušeji. V main testovat příznak přetečení timeru. Jakmile přeteče, vynulovat příznak (nuluje se jedničkou) a provést za sebou ta 2 měření, výpočty a pak zas čekat do další milisekundy.
while(!(TIFR & (1<<TOV1))); // cekej dokud nepretece
TIFR |= 1<<TOV1; // vynulovat příznak přetečení
while(1)
{
//unsigned int napatie; // pre test bude globálne a volatile
char pom[6];
........[/code]
Skoro dobře.
timer1Init() je třeba také zavolat, nejlépe za “lcd_init();”.
Čekání na přetečení timeru by mělo být uvnitř nekonečné smyčky hned před měřením (“napatie = adc_read(0);”). Takhle bys počkal 1x na začátku a potom když by ses do smyčky dostal, už by nečekal.
S WGM15 by to přeložit jít rozhodně nemělo (pokud sis to nenadefinoval sám). V definičním souboru megy16 totiž taková definice není a překladač zahlásí chybu (ověřeno).