Chyba ADC u AVR-ka

C,C++,C#

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Chyba ADC u AVR-ka

Príspevok od používateľa jirka.jirka. » 11 Mar 2015, 11:56

Hoj hoj,
Pracuji s AD převodníkem u ATmega128. A problém je, že nějak mi to špatně měří.

Na pinu ADC1 mám nastaveno 0,15V.
Ale ATmega mi stále vrací hodnotu ADC=175 (což odpovídá napětí 0,328.

Referenci mám nastavenou na Interní 2,56V s externím kondíkem na AREF.

Inicializace ADC

Kód: Vybrať všetko

void initAD()
{
	/*Zapnuti Interni reference 2,56V s externim kondenzatorem na AREF pinu*/
	ADMUX |= (1<<REFS0) | (1<<REFS1);
	/*
	ADEN = povoleni ADC
	ADSC = Start konverze
	ADFR = Free running select
	ADIF = Priznak preruseni
	ADIE = Povoleni preruseni od ADC
	ADPS0,1,2 = delicka
	*/
	ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIF) | (1<<ADIE) | (1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2);	//delicka 128
}
Konverze kanálu ADC

Kód: Vybrať všetko

/*konverze dat na AD převodníku*/
unsigned int konverze_ADC (unsigned char kanal)
{
	// vloz cislo kanalu, vymaskuj nepouzite bity
	ADMUX &= 0xF0;
	ADMUX |= kanal & 0x0F;
	// start konverze (prevodu)
	ADCSRA |= (1 << ADSC);  
	// cekej na priznak skonceni konverze
	while(!(ADCSRA & (1<<ADIF)));    
	//  navratova hodnota - vysledek ad prevodu
	return ADC;	
}
Měření ve smyčce každé cca 3s.

Kód: Vybrať všetko

hodnota = konverze_ADC(1);
			sprintf(buffer, "hodnota= %d\n", hodnota);
			uart_puts(buffer);	
			flag = 0;	
Jestli někoho něco napadne, určitě se podělte. Děkuji
0

Používateľov profilový obrázok
daqq
Power user
Power user
Príspevky: 2528
Dátum registrácie: 10 Jún 2008, 00:00
Bydlisko: Bratislava
Vek: 36
Kontaktovať používateľa:

Re: Chyba ADC u AVR-ka

Príspevok od používateľa daqq » 11 Mar 2015, 12:04

Jak rychlo ti bezi procesor? Skus zmenit delicku frekvencie pre ADC na mensiu hodnotu - tieto AD prevodniky maju maximalnu ale aj minimalnu frekvenciu od ktorej su schopne pracovat.
0
Outsource your thinking: Get religious!
Zistenie: Ked robite sucasne v C, C++, C#, Matlabe, trocha pokukujete po VHDL, sialenstvo nemoze byt daleko...este stastie, ze som lietadlo a nemam tieto problemy.

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Chyba ADC u AVR-ka

Príspevok od používateľa jirka.jirka. » 11 Mar 2015, 12:09

Procesor jede na 16MHz.

Ale musím se přiznat. Jsem totiž pitomec. :oops: :!: :rolleyes:

Mám tam OZ, který má nastavené zesílení na 2,25. Takže po vynásobení to mám správně. Velice se omlouvám. Ale když 2 hodiny hledám chybu v SW, ale ona tam není, už jsem byl zoufalý. :D :D
0

Xbunt
Stály člen
Stály člen
Príspevky: 242
Dátum registrácie: 08 Máj 2014, 23:09
Bydlisko: Nam. Sv. Martina 24, Lipany

Re: Chyba ADC u AVR-ka

Príspevok od používateľa Xbunt » 11 Mar 2015, 12:23

Riesil som podobnu chybu.
ked mi MUX prechadzal viacero hodnot a stale sa prenasal udaj z predchadzajucej do nameranej. Nakoniec som to vyriesil tak, ze som po nastaveni MUXu pockal 10uS (pomocou delay) a nasledne spustil AD. Vtedy mi hodnoty sedeli.
Pri 16Mhz
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Chyba ADC u AVR-ka

Príspevok od používateľa jirka.jirka. » 11 Mar 2015, 12:41

Ale i tak se mi toto vlákno bude hodit.

Mám hodnotu ADC např oněch 130. Reference je 2,56.
Převedl jsem to na mV:

Kód: Vybrať všetko

u = ((long)ADC*2560/1024);		
sprintf(buffer,"ADC:%4d -- U:%5ldmV\n", ADC, u);  
uart_puts(buffer);	
A teď tu hodnotu u potřebuji převést na skutečné napětí. Tzn, podělit hodnotou u 2,25.

A zde mě nic nenapadá. Protože nechci používat float. Jde to nějak jednoduše?
0

martin63
Ultimate člen
Ultimate člen
Príspevky: 1738
Dátum registrácie: 11 Máj 2008, 00:00
Bydlisko: Námestovo
Vek: 34

Re: Chyba ADC u AVR-ka

Príspevok od používateľa martin63 » 11 Mar 2015, 13:24

Existuje nejaká metóda výpočtu, len neviem si spomenúť ako sa volá. Niekto ti s tým určite poradí.
0

Používateľov profilový obrázok
awen
Power user
Power user
Príspevky: 609
Dátum registrácie: 11 Feb 2009, 00:00
Bydlisko: Bratislava
Vek: 36

Re: Chyba ADC u AVR-ka

Príspevok od používateľa awen » 11 Mar 2015, 13:40

Podelit 2.25 sa rovna vynasobit 0.44444(...)
A to sa rovna nasobeniu x444 a mas vysledok x1000 cize napriklad nie vo voltoch ale v milivoltoch.
Takymto sposobom sa takyto vypocet da zoptimalizovat. Len si treba ustrazit rozsahy premennych a pozadovanu presnost.
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Chyba ADC u AVR-ka

Príspevok od používateľa jirka.jirka. » 11 Mar 2015, 14:16

Kód: Vybrať všetko

u = ((long)Reg*2560/1024);
			
sprintf(buffer,"ADC:%4d -- U:%5ldmV\n", Reg, u);  
uart_puts(buffer);	
			
napeti = u*444;    //vynasobit 444 = (1/2,25) je to same, jako vydelit 2,25 
cele = napeti/1000;
desetiny = napeti%1000;
setiny = desetiny%10;
sprintf(buffer, "napeti U=%03d.%d%dmV\n", cele, desetiny, setiny);
uart_puts(buffer);
0

Používateľov profilový obrázok
awen
Power user
Power user
Príspevky: 609
Dátum registrácie: 11 Feb 2009, 00:00
Bydlisko: Bratislava
Vek: 36

Re: Chyba ADC u AVR-ka

Príspevok od používateľa awen » 11 Mar 2015, 14:44

Nieco som ti tam prepisal.. skus prestudovat.

Kód: Vybrať všetko

napeti = u*444;    //vynasobit 444 = (1/2,25) je to same, jako vydelit 2,25 
cele = napeti/1000;
setiny = (napeti % 1000 + 5) / 10;	// (x+5)/10 = zaokruhlenie vysledku delenia /10
sprintf(buffer, "napeti U=%03d.%02dmV\n", cele, setiny);
uart_puts(buffer);
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Chyba ADC u AVR-ka

Príspevok od používateľa jirka.jirka. » 11 Mar 2015, 15:59

Ach jak proste..... :)

Děkuji moc.
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok