Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

atmega2560 ADC kako povezati?

[es] :: Elektronika :: atmega2560 ADC kako povezati?

[ Pregleda: 2079 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

maddog_srb
Cacak

Član broj: 192945
Poruke: 129
*.pools.arcor-ip.net.



+24 Profil

icon atmega2560 ADC kako povezati?05.01.2012. u 15:48 - pre 148 meseci
Imam razvojno okruzenje za AVR -> stk600-atmega2560

Ono sto mene zanima je, kako da povezem recimo bateriju od 1.5V na ADC? Znam da pitanje mozda zvuci banalno, ali posto sam tek krenuo sa programiranjem mikrokontrolera, ovo mi nije jasno~~~

Evo slike, pa ukoliko neko moze da mi razjasni gde gresim bio bih mu veoma zahvalan...



Prikačeni fajlovi
 
Odgovor na temu

milanmeh
Novi Sad

Član broj: 206027
Poruke: 213
*.dynamic.sbb.rs.



+7 Profil

icon Re: atmega2560 ADC kako povezati?05.01.2012. u 18:03 - pre 148 meseci
Minus od baterije povezes na GND, a plus povezes na neki od analognih ulaza mikrokontrolera (recimo pin 0 na portu A) preko otpornika male vrednosti - 50-100R, i to je to. Mada bolje je da iskoristis napon napajanja mikrokontrolera i dovedes ga na na ADC ulaz preko potenciometra. Tako ces moci da variras napon i da pratis kako se ocitava merenje. Potenciometar povezes tako sto srednju nogicu povezes na ADC ulaz, ostale dve nogice jednu povezes na Vcc drugu na GND od STK600 napajanja. Naravno nije lose staviti mali otpor izmedju ADC ulaza i srednje nogice potenciometra (270R za 5V).

Samo obrati paznju da ne smes da dovedes na ulaz ADC-a napon koji je veci od napona napajanja AD konvertora (mikrokontrolera) ukoliko isti nije snizen naponskim razdelnikom.

[Ovu poruku je menjao milanmeh dana 05.01.2012. u 19:13 GMT+1]
 
Odgovor na temu

maddog_srb
Cacak

Član broj: 192945
Poruke: 129
*.pools.arcor-ip.net.



+24 Profil

icon Re: atmega2560 ADC kako povezati?15.01.2012. u 22:28 - pre 148 meseci
Bas sam zapeo sa ovom multi ADC...

Naime, problem je sledeci, ocita mi se dobro napon za prva 2 kanala (jer isti napon dovodim), a kada treba da se ocita treci kanal ADC-a, prikazuje mi maksimalni napon, iako je napon na trecem kanalu manji od onoga na prvom... Mislim da je greska u cekanju da se zavrsi konverzija sa predhodnog kanala...

Evo ga kod:

Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h> 


uint8_t ch[8];

inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
    if ( ! (*port & (1 << pin)) )
    {   _delay_ms(1);
        _delay_ms(50);
        if ( *port & (1 << pin) )
        {   _delay_ms(20);
            return 1;
        }
    }
    return 0;
}

void showNumber(uint8_t num)
{
     PORTB = ~num; 
}

void ADC_init()
{
     //Internal Vref of 2.56V
   ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<ADLAR);

   //Divisor 64 @ 8Mhz = 125kHz
   //Divisor 128 @ 16Mhz = 125kHz
   ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
}

uint8_t ADC_read(uint8_t ch)
{
   //clear chanel bits, and set new chanel
   ADMUX = (ADMUX & 0xF8) | ch;

   ADCSRA |= (1<<ADSC);
   while(ADCSRA & (1<<ADSC));

   return ADCH;
}
int main(void)
{
 
  DDRB  = 0xFF; //all OUT
  PORTB = 0xFF; //all OFF

  DDRD  = 0x00; //all IN
   
  int i = 0;

  ADC_init();


  ch[0] = ADC_read(0);
  ch[1] = ADC_read(1);
  ch[2] = ADC_read(2);
  ch[3] = ADC_read(3);   

 
  _delay_ms(20);


  while(ADC_read(4) < 10);


  ch[4] = ADC_read(4);
  ch[5] = ADC_read(5);
  ch[6] = ADC_read(6);
  ch[7] = ADC_read(7);
 

  while(1)
  {
   if(debounce(&PIND, PD7)){
     //ch0 = ADC_read(0);
     showNumber(ch[0]);
   }
   else if(debounce(&PIND, PD6)){
     //ch1 = ADC_read(1);
     showNumber(ch[1]);
   }
   else if(debounce(&PIND, PD5)){
     //ch2 = ADC_read(2);
     showNumber(ch[2]);
   }
   else if(debounce(&PIND, PD4)){
     //ch3 = ADC_read(3);
     showNumber(ch[3]);
   }
   else if(debounce(&PIND, PD3)){
     //ch1 = ADC_read(1);
     showNumber(ch[4]);
   }
   else if(debounce(&PIND, PD2)){
     //ch2 = ADC_read(2);
     showNumber(ch[5]);
   }
   else if(debounce(&PIND, PD1)){
     //ch3 = ADC_read(3);
     showNumber(ch[6]);
   }
   else if(debounce(&PIND, PD0)){
     //ch3 = ADC_read(3);
     showNumber(ch[7]);
   }
   else
     asm("nop");
  }




Da li je potrebno dovoditi neki referentni napon za ADC, ja sam izabrao interni 2.56, predpostavljam da on dolazi preko USB porta? Evo slike za svaki slucaj.

Prikačeni fajlovi
 
Odgovor na temu

milanmeh
Novi Sad

Član broj: 206027
Poruke: 213
*.dynamic.sbb.rs.



+7 Profil

icon Re: atmega2560 ADC kako povezati?16.01.2012. u 00:16 - pre 148 meseci
Sta je povezano na AREF pin od mege2560? Za 2.56V internu referencu (ne dolazi sa USB nego mega2560 ima interni band gap izvor od 2.56V) pise u datasheetu da izmedju AREF i GND mora biti 100n. Kod tebe je ADLAR bit u ADMUX registru postavljen na 1, pa koristis left adjust opciju. Takodje ocitavas samo ADCH registar i ne koristis 10bit rezoluciju.

Ako je na AREF povezano napajanje od 5V (ili koliko vec), nemoj menjati ADMUX registar pri inicijalizaciji AD konvertora (ili stavi ADMUX=0x00, ista stvar). To je default podesavanje, koristi AREF kao referencu (znaci sta god je prikljuceno na AREF), i rezultat je right adjusted. Kad budes radio ad konverziju promeni ono return ADCH u return ADCW.

Za funkciju showNumber podeli ulaznu promenljivu sa 4 kako bi rezultat stao na svih 8 ledovki porta B (rezultat AD konverzije je od 0-1023).

Znaci nesto ovako.

Code:
void ADC_init()
{
   ADMUX = 0x00;

   //Divisor 64 @ 8Mhz = 125kHz
   //Divisor 128 @ 16Mhz = 125kHz
   ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
}


uint8_t ADC_read(uint8_t ch)
{
   //clear chanel bits, and set new chanel
   ADMUX = (ADMUX & 0xF8) | ch;

   ADCSRA |= (1<<ADSC);
   while(ADCSRA & (1<<ADSC));

   return ADCW;
}

void showNumber(uint8_t num)
{
     PORTB = ~num/4; 
}



 
Odgovor na temu

maddog_srb
Cacak

Član broj: 192945
Poruke: 129
*.ts.fujitsu.com.



+24 Profil

icon Re: atmega2560 ADC kako povezati?16.01.2012. u 08:38 - pre 148 meseci
Pazi, ja nista dodatno nisam povezivao, samo sam povezao USB port, doveo analogni napon na PORTF, i mislio sam da je to dovoljno... analogni napon mi je baterija, od koje minus dovodim na GND od PORTF.

Ja nemam kondezatore, a ovo mi je bas hitno, pa sam mislio da moze i bez njega???
Znaci nista nisam dovodio na AREF, jer ne znam ni koji je to pin :(

Ako je moguc neki setup bez dodatnih kondezatora, i td. bio bih ti zahvalan...

Sto se tice 10bitne rezolucije, mislim da mi je dovoljna i 8mobitna, zato sam i postavio ADLAR i koristio samo ADCH...
 
Odgovor na temu

milanmeh
Novi Sad

Član broj: 206027
Poruke: 213
*.dynamic.sbb.rs.



+7 Profil

icon Re: atmega2560 ADC kako povezati?16.01.2012. u 10:17 - pre 148 meseci
Pogledaj datasheet, nadji AREF pin, multimetar u ruke i proveri sta je prikljuceno na njega. Ako je proizvodjac u datasheetu napisao da mora 100n onda verovatno i treba tako da bude.
 
Odgovor na temu

maddog_srb
Cacak

Član broj: 192945
Poruke: 129
*.pools.arcor-ip.net.



+24 Profil

icon Re: atmega2560 ADC kako povezati?16.01.2012. u 18:09 - pre 148 meseci
Imam dva AREF-a na ploci (2x AREF0 i 2xAREF1), od kojih su 2 prespojena jumperom, a drugi koji sam merio pokazuje 2.43V sto je ~ 2.56 kako pise u datasheetu za interni napon ADC, i taj napon mi savrseno odgovara... Samo jos kad bi radilo :)
 
Odgovor na temu

[es] :: Elektronika :: atmega2560 ADC kako povezati?

[ Pregleda: 2079 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.