www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

AVR in ADC

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
searider
Član
Član



Pridružen-a: Sre 09 Apr 2008 23:12
Prispevkov: 70
Aktiv.: 0.33
Kraj: Maribor

PrispevekObjavljeno: Sob Okt 31, 2009 9:28 pm    Naslov sporočila:  AVR in ADC Odgovori s citatom

Pozdravljeni,

pri uporabi ADC-ja (atmega32) bi uporabil za referenco kar AVCC (5V). Zanima me ali moram paziti pri izboru kondenzatorjev pri 7805 regulatorju. Namreč eni omenjajo da je priporočljivo uporabiti tantal kond. na izhodu iz regulatorja.

Kakšne vrednosti kond. na vhodu in izhodu regulatorja bi priporočali ?

lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Peter
Član
Član



Pridružen-a: Sre 30 Jun 2004 12:55
Prispevkov: 375
Aktiv.: 1.58
Kraj: Pod krvavcem nekje

PrispevekObjavljeno: Sre Dec 30, 2009 10:36 am    Naslov sporočila:   Odgovori s citatom

Lep pozdrav
Da si izposodim tole temo, da ne odpiram nove.
Imam problem: Z atmego8 hočem brat enega od analognih vhodov vse skupaj pa prikazati na LCD displayu. Prikazovanje mi ne deluje tako kot je treba ko berem samo spodnji del bitov adc-ja se lepo spreminja vrednost od 0 do 255 ko pa hočem prebrati celotno vrednost AD pretvorbe pa mi začne stvar prikazovati čudne stvari.
Koda:
//#include <avr/interrupt.h>
//#include <avr/pgmspace.h>
//#include <avr/signal.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/iom8.h>
#include "lcd.h"


//void init_serial (void);
void init_ports (void);
void init_ADC(void);
unsigned int napetost;
unsigned int read_ADC(void);




void Wait(uint8_t n)
{

   uint8_t i,temp;
   temp=n*28;

   for(i=0;i<temp;i++)
      _delay_loop_2(0);
}



int main (void)
   {
      //Initialize the LCD Subsystem
      InitLCD(0);
      //Clear the display
      LCDClear();

      init_ports();
//      init_serial();
      init_ADC();

   while(1)
      {
//      PORTD = ~read_ADC();
      napetost = read_ADC();

         //Update Display
         LCDClear();
         LCDWriteString("Adc - 0000");

         LCDWriteIntXY(6,0,napetost,4);


         _delay_loop_2(0);
         _delay_loop_2(0);
         _delay_loop_2(0);
         _delay_loop_2(0);

         _delay_loop_2(0);
         _delay_loop_2(0);
         _delay_loop_2(0);
         _delay_loop_2(0);

      }         

   }
   


unsigned int read_ADC()
   {
   unsigned int value;

   ADCSRA = ADCSRA|0x40;      // Start ADC pretvorbe

   while((ADCSRA & 0x10)==0);   // Počakamo da se pretvorba konča

// Get ADC the Result
   value = ADCL;
   value += (ADCH << 8);

   ADCSRA = ADCSRA|0x10;      // Pobrišemo zastavico za konec pretvorbe
   return value;            // Vrne vrednost Value rutini katera jo kliče
   }

void init_ports (void)
   {
   DDRD = 0xFF;   // Izberemp portD kot izhode
   PORTD = 0x00;
   
   DDRC = 0x00;
   PORTC =   0x00;

   }

void init_ADC (void)
   {
   ADMUX=0x06;          // Izberemo kateri ad pretvornik želimo ADC6
   ADMUX=ADMUX | 0x40;      // Izberemo napetostno referenco
   ADMUX=ADMUX | 0x20;      //   

   ADCSRA=0xE3;         // Izberemo Frekvenco ACD-ja
   ADCSRA=   ADCSRA | 0x80;   // Omogočimo ADC
   }



DSC00066.JPG
 Opis:
 Velikost datoteke:  649.44 KB
 Pogledana:  0 krat

DSC00066.JPG



_________________
Vse se da pokvarit, le če se dovol časa ukvarjaš z njo!!!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mucek4
Član
Član



Pridružen-a: Sob 18 Jun 2005 20:52
Prispevkov: 2952
Aktiv.: 12.46
Kraj: Tržič - Mesto med gorami

PrispevekObjavljeno: Sre Dec 30, 2009 11:46 am    Naslov sporočila:   Odgovori s citatom

Ne pozam AVR C ja v detajle ampak predvidevam da je napak tukaj
Koda:
   value = ADCL;
   value += (ADCH << 8);

Moje predvidevanje je takole:
ADCH je verjetno 8 bitna vrednost. Če jo shiftash 8x v levo ne dobiš 16 bitne številke.
Torej popravi kodo na sledeč način:
Koda:
   value = ADCH;
   value *= 256;
   value += ADCL;


In poročaj če je kaj bolje. Int naj bi sicer bil 16 biten.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
ticla
Član
Član



Pridružen-a: Sob 15 Dec 2007 22:52
Prispevkov: 440
Aktiv.: 2.06
Kraj: Župečja vas

PrispevekObjavljeno: Sre Dec 30, 2009 12:05 pm    Naslov sporočila:   Odgovori s citatom

Meni CODEVISION za branje ADC sam zgenerira spodnjo kodo

Citiram:
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}


V glavnem programu pa imam definirano spremenljivko
Citiram:
unsigned long int napetost;

, long int imam zato, ker še potem naredim izračun.

Vrednost pa preberem tako
Citiram:
napetost=read_adc(1); //ADC1



PS.
Pri atmega8 sem odkril, da moram v funkciji read_adc('0') imeti enojne narekovaje, pri mega32 pa jih ne smem imeti ( read_adc(0) ), slučajno ve kateri zakaj je tako.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Peter
Član
Član



Pridružen-a: Sre 30 Jun 2004 12:55
Prispevkov: 375
Aktiv.: 1.58
Kraj: Pod krvavcem nekje

PrispevekObjavljeno: Sre Dec 30, 2009 12:40 pm    Naslov sporočila:   Odgovori s citatom

mucek4
Sem probal kodo vendar je prikaz še vedno enak.
Nevem zakaj tak smešen prikaz glede natavitev ad pretvornika sem probal vse mogoče variante pa ni pomagalo nič.

ticla
V CV res generira sam kodo za ad pretvorbe. Skoda da jo AVR studio ne.

Lahko kdo sproba to kodo in pove kakšne rezultate dobi.
Lcd knižnica mislim da ni kriva.

_________________
Vse se da pokvarit, le če se dovol časa ukvarjaš z njo!!!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mucek4
Član
Član



Pridružen-a: Sob 18 Jun 2005 20:52
Prispevkov: 2952
Aktiv.: 12.46
Kraj: Tržič - Mesto med gorami

PrispevekObjavljeno: Sre Dec 30, 2009 12:47 pm    Naslov sporočila:   Odgovori s citatom

Peter je napisal/a:
Lcd knižnica mislim da ni kriva.


Preveri

if ((napetost >=0) && (napetost < 100))
CDWriteString("0");
if ((napetost >=100) && (napetost < 200))
CDWriteString("1");
.....

Tako boš lahko videl ali dela preglavice LCD knjižnica s pretvorbo ali pretvorba sama.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Peter
Član
Član



Pridružen-a: Sre 30 Jun 2004 12:55
Prispevkov: 375
Aktiv.: 1.58
Kraj: Pod krvavcem nekje

PrispevekObjavljeno: Sre Dec 30, 2009 5:39 pm    Naslov sporočila:   Odgovori s citatom

Bom poizkusil še s kakšno drugo knjižnico za lcd pa poročam o uspehu morda je problem v knjižnici za lcd
mucek4
Nisem še mel casa stestirat tvoj nasvet

_________________
Vse se da pokvarit, le če se dovol časa ukvarjaš z njo!!!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
spy
Član
Član



Pridružen-a: Sre 06 Sep 2006 20:43
Prispevkov: 403
Aktiv.: 1.76
Kraj: Tržič

PrispevekObjavljeno: Sre Dec 30, 2009 9:14 pm    Naslov sporočila:   Odgovori s citatom

Jaz uporabljam v AVRstudiu in GCC samo:

Koda:

unsigned int napetost;
....
napetost=ADC;


in se prevede v:

Koda:

IN      R18,0x04         In from I/O location
IN      R19,0x05         In from I/O location


in dela brez problemov.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Peter
Član
Član



Pridružen-a: Sre 30 Jun 2004 12:55
Prispevkov: 375
Aktiv.: 1.58
Kraj: Pod krvavcem nekje

PrispevekObjavljeno: Čet Dec 31, 2009 4:48 pm    Naslov sporočila:   Odgovori s citatom

Sem nekako rešil problem z uporabo druge knjižnice za lcd in uporabil drugačne rutine za prikaz na lcd-ju
priprenjam kodo če slučajno komu pride prav.

Koda:

//#include <avr/interrupt.h>
#include <avr/pgmspace.h>
//#include <avr/signal.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/iom8.h>
#include<util/delay.h>
#include "lcd.h"

volatile signed long val;

//void init_serial (void);
void init_ports (void);
void init_ADC(void);
unsigned int napetost;
unsigned int read_ADC(void);
char buffer[10];
unsigned int Uizh;
char str[12];


int main (void)
   {

      
      //Initialize the LCD Subsystem
      lcd_init(LCD_DISP_ON);
      //Clear the display
      lcd_clrscr();

      init_ports();
//      init_serial();
      init_ADC();

   while(1)
      {

      napetost = ADCW;
      Uizh = napetost;
      
      Uizh = Uizh * 50;
      Uizh = Uizh / 102;

      
      utoa(napetost, buffer, 10);

         //Update Display
         lcd_clrscr();
         lcd_puts("Napetost-");
         lcd_gotoxy(10,0);
         lcd_puts(buffer);//(6,0,napetost,5);
         
            lcd_gotoxy(0,1);
             sprintf(str,"%2d.",Uizh/100);
             lcd_puts(str);       
             sprintf(str,"%2d",Uizh%100);
             lcd_puts(str);
      
         _delay_loop_2(1000);//wait_10ms;
         _delay_loop_2(1000);
         _delay_loop_2(1);
         _delay_loop_2(10);
         _delay_loop_2(10);

      }         

}


unsigned int read_ADC()
   {
   unsigned int value;
   ADCSRA = ADCSRA|0x40;      // Start ADC pretvorbe
   _delay_loop_2(10);
   while((ADCSRA & 0x10)==0);   // Počakamo da se pretvorba konča

// Get ADC the Result
   value = ADCW;
   ADCSRA = ADCSRA|0x10;      // Pobrišemo zastavico za konec pretvorbe
   return value;            // Vrne vrednost Value rutini katera jo kliče
   }

void init_ports (void)
   {
   DDRD = 0xFF;   // Izberemp portD kot izhode
   PORTD = 0x00;
   
   DDRC = 0x00;
   PORTC =   0x00;

   }

void init_ADC (void)
   {
   ADMUX=0x06;          // Izberemo kateri ad pretvornik želimo ADC7
   ADMUX=ADMUX | 0x40;      // Izberemo napetostno referenco
   ADMUX=ADMUX | 0x00;      //   

   ADCSRA=0xE3;         // Izberemo Frekvenco ACD-ja
   ADCSRA=   ADCSRA | 0x80;   // Omogočimo ADC
   }



_________________
Vse se da pokvarit, le če se dovol časa ukvarjaš z njo!!!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51 Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 494 dni


Powered by phpBB © 2001, 2005 phpBB Group