A/D prevodnik v ATMEGA16

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
frontm4n
Příspěvky: 62
Registrován: 15 říj 2009, 02:00

A/D prevodnik v ATMEGA16

#1 Příspěvek 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..
Přílohy
AD.txt
pouzil sem tenhle kod
(1.02 KiB) Staženo 207 x

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#2 Příspěvek 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.

Uživatelský avatar
frontm4n
Příspěvky: 62
Registrován: 15 říj 2009, 02:00

#3 Příspěvek 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.

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#4 Příspěvek od Andrea »

Zkus ten čekací while změnit na
while (ADCSRA & 0x40)

Uživatelský avatar
frontm4n
Příspěvky: 62
Registrován: 15 říj 2009, 02:00

#5 Příspěvek 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..

Uživatelský avatar
frontm4n
Příspěvky: 62
Registrován: 15 říj 2009, 02:00

#6 Příspěvek od frontm4n »

Andrea píše:Zkus ten čekací while změnit na
while (ADCSRA & 0x40)
tohle nepomohlo

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#7 Příspěvek 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);
   }   
}  
Naposledy upravil(a) AB1 dne 27 dub 2010, 08:58, celkem upraveno 1 x.

Uživatelský avatar
Atlan
Příspěvky: 4499
Registrován: 10 kvě 2004, 02:00
Bydliště: Košice

#8 Příspěvek od Atlan »

NO ze softver bude ok este neznamena ze mu to bude chodit :D kto vie ako to nadratoval.....

Uživatelský avatar
frontm4n
Příspěvky: 62
Registrován: 15 říj 2009, 02:00

#9 Příspěvek od frontm4n »

porad stejny problem i po zkousce vyse zmineneho programu..

schema je zde:

http://leteckaposta.cz/487230727

tady mi to neslo uploadnout
Naposledy upravil(a) frontm4n dne 29 bře 2010, 19:28, celkem upraveno 1 x.

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#10 Příspěvek 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?

Uživatelský avatar
frontm4n
Příspěvky: 62
Registrován: 15 říj 2009, 02:00

#11 Příspěvek 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

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#12 Příspěvek 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.

Uživatelský avatar
frontm4n
Příspěvky: 62
Registrován: 15 říj 2009, 02:00

#13 Příspěvek od frontm4n »

AB1 píše:Jsou na schematu propojené země GND a AGND?
nejsou, ale mam je spojene

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#14 Příspěvek 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%.

Uživatelský avatar
frontm4n
Příspěvky: 62
Registrován: 15 říj 2009, 02:00

#15 Příspěvek 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?

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“