Stránka 1 z 2
A/D prevodnik v ATMEGA16
Napsal: 29 bře 2010, 11:14
od frontm4n
Zdravím,
potreboval bych poradit jak rozchodit vnitrni AD prevodnik, aby mi daval spravne hodnoty. Zobrazeni je pomoci LCD displeje, ukazuje to nejake zmatky(na miste jednotek se strida 0,1,2; na pozici desetin jsou to uz vetsi psycha...napr.=,^n,o,k,0,atd... pouzivam vnejsi frekvenci 16MHz.
Hodila by se nejaka funkci ukazka nebo rada jak na to.
Potrebuji merit hodnoty kolem 1V... chci tam pouzit tu vnitrni referci 2,56V i za cenu vyuziti jen poloviny rozsahu
...v priloze je pouzity program..
Napsal: 29 bře 2010, 11:23
od Andrea
Tak například
LCDsendChar(vysledek % 100+0x30);
je blbost, vysledek % 100 je číslo 0-99 a tolik číslic nemáme. Musíš nadvakrát.
Napsal: 29 bře 2010, 11:32
od frontm4n
Andrea píše:Tak například
LCDsendChar(vysledek % 100+0x30);
je blbost, vysledek % 100 je číslo 0-99 a tolik číslic nemáme. Musíš nadvakrát.
(vysledek % 100)/10...tak to udelam takhle...ale to nevysvetluje proc mi tam na miste jednotek litaji cisla od 0V do 2V pri pripojenem i nepripojenem napeti na ADC0.
Napsal: 29 bře 2010, 11:37
od Andrea
Zkus ten čekací while změnit na
while (ADCSRA & 0x40)
Napsal: 29 bře 2010, 11:41
od frontm4n
...nevim cim to je vstupy AREF, AVCC mam osetrene podle vyrobce... ale stejnak to nejak kmita....
Ted sem pridal jeste setiny... a kdyz neni nic pripojeneho.. tak se tam strida 0,00 1,01 2,02 ....nevite cim to muze byt? Potreboval bych testovat kdy je neco pripojeno, kdy neni a jakou to ma velikost...s tim kmitanim toho moc nenamerim..
Napsal: 29 bře 2010, 11:45
od frontm4n
Andrea píše:Zkus ten čekací while změnit na
while (ADCSRA & 0x40)
tohle nepomohlo
Napsal: 29 bře 2010, 17:40
od AB1
Zkus toto:
Kód: Vybrat vše
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include "lcd_lib.h"
#define REF (1<<REFS1)|(1<<REFS0) //internal reference
#define VREF 2560UL //reference [mV]
unsigned long read_adc(unsigned char kanal)
{
ADMUX = REF + kanal;
ADCSRA |= (1<<ADSC); //start převodu
while (ADCSRA & (1<<ADSC)); //čekej na konec převodu
return ADC;
}
int main(void)
{
unsigned int vysledek;
unsigned long napeti;
static char cela_cast[2];
static char tisiciny[4];
LCDinit();
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); //dělič 128
while (1)
{
vysledek = read_adc(0); //ADC0
napeti = vysledek * VREF /1024;
itoa(napeti/1000, cela_cast, 10); //převeď na string
itoa(napeti%1000, tisiciny, 10);
LCDclr;
LCDGotoXY(2, 0);
LCDsendString(cela_cast);
LCDsendChar(',');
LCDsendString(tisiciny);
LCDsendString(" V");
_delay_ms(300);
}
}
Napsal: 29 bře 2010, 17:44
od Atlan
NO ze softver bude ok este neznamena ze mu to bude chodit
![Very Happy :D](./images/smilies/icon_biggrin.gif)
kto vie ako to nadratoval.....
Napsal: 29 bře 2010, 18:59
od frontm4n
porad stejny problem i po zkousce vyse zmineneho programu..
schema je zde:
http://leteckaposta.cz/487230727
tady mi to neslo uploadnout
Napsal: 29 bře 2010, 19:10
od AB1
a kdyz neni nic pripojeneho.. tak se tam strida 0,00 1,01 2,02
To je normální chování, je třeba zkusit pin uzemnit, (musí ukazovat 0),
nebo připojit napětí.
A kde je to schema?
Napsal: 29 bře 2010, 19:33
od frontm4n
tak uz mi to asi meri...ale potreboval bych nejak vyresit aby mi to nekmitalo kdyz neni nic pripojene...Da se to nejak udelat? Potrebuji totiz detekovat pripojeni akumulatoru 1,2 V. ...
... akorat me napada....dat tam cekaci smycku ktera bude sledovat treba 5 vzorku po sobe a kdyz budou shodne tak ji povazovat za pripojene napeti...... nebo je jiny zpusob?
schema je zde:
http://leteckaposta.cz/487230727
Napsal: 29 bře 2010, 19:46
od AB1
Jsou na schematu propojené země GND a AGND?
potreboval bych nejak vyresit aby mi to nekmitalo kdyz neni nic pripojene
Zkusil bych připojit odpor proti zemi, nejvyšší hodnotu která udrží ADC v nule (500k?, 100k?). Na měření baterky by to nemělo mít vliv.
Edit:
Odpor případně překlenout kondenzátorem M1-1M.
Napsal: 29 bře 2010, 20:03
od frontm4n
AB1 píše:Jsou na schematu propojené země GND a AGND?
nejsou, ale mam je spojene
Napsal: 29 bře 2010, 20:15
od AB1
Ještě bych dodal, že pro přesné měření je třeba změřit referenční napětí na pinu AREF a podle něho nastavit konstantu v programu.
Vnitřní reference nemusí být přesně 2,56V, mám dojem že datašít uvádí toleranci až 10%.
Napsal: 29 bře 2010, 20:21
od frontm4n
AB1 píše:Ještě bych dodal, že pro přesné měření je třeba změřit referenční napětí na pinu AREF a podle něho nastavit konstantu v programu.
Vnitřní reference nemusí být přesně 2,56V, mám dojem že datašít uvádí toleranci až 10%.
na pinu AREF se da merit Uref ikdyz mam nastevene vnitrni ref. napeti?