FAQ | Points | Add... | Recent posts | Search | Register | Log in


ATmega8 jak odczytać wartość z przetwornika ADC0-ADC5


Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> ATmega8 jak odczytać wartość z przetwornika ADC0-ADC5
Author
Message
klon111
Poziom 10
Poziom 10


Joined: 17 Jan 2005
Posts: 58
Location: Biała Podlaska

Post#1 Post from the author of the topic 01 Dec 2009 15:27   

ATmega8 jak odczytać wartość z przetwornika ADC0-ADC5


Witam
Jeszcze nigdy z avr się nie bawiłem i w związku z tym proszę o pomoc kolegów.
Chce odczytać wartość z 4 FOTOTRANZYSTOR LTR4206 i 2 TERMISTORÓW
Mam pytanie jak odczytać wartość z przetwornika ADC0-ADC5
Poniższy przykład odczytuje tylko z adc0



SIGNAL(SIG_ADC) // przerwanie z przetwornika ADC
{
value = ADCW; // czytaj wartość z przetwornika ADC
PORTC = ~(value>>2); // wyślij przetworzoną wartość na LED
}

http://avr.elektroda.eu/?q=node/30
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 01 Dec 2009 15:27   





Back to top
   
Zaquadnik
Poziom 20
Poziom 20


Joined: 03 Aug 2005
Posts: 924
Location: Gdańsk

Post#2 01 Dec 2009 16:50   

Re: ATmega8 jak odczytać wartość z przetwornika ADC0-ADC


Zamieszczę przykładowy kod pomiaru napięcia z 3 punktów wraz z uśrednianiem i wyświetlaniem.

Code:

#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\signal.h>
#include <avr\pgmspace.h>
#include <inttypes.h>
#include <util\delay.h>

#include "ADC.h"
#include "LCD_HD44780.h"

#define dlugosc_sredniej 16

volatile char ADC_channel = 0;
volatile float V0 = 0,V1 = 0,V2 = 0;
volatile char sample_count = 0;

void main()
{

ADC_channel = 0;

ADC_init(0x20,0x80);
ADC_interrupt_enable();

LCD_init();
LCD_print("3.3V 5V   REG");
LCD_second_line();
LCD_cursor_off();

sei();

ADC_start_conv();

while(1)
   {

   }

}

//------------------------

SIGNAL(SIG_ADC)
{
   int Vbuf = 0;
   if (ADC_channel == 0)
   {
      V0 = V0 + ((float)ADCH*500)/256;
   }
   else if (ADC_channel == 1)
   {
      V1 = V1 + ((float)ADCH*500)/256;
   }
   else if (ADC_channel == 2)
   {
      V2 = V2 + ((float)ADCH*500)/256;
   }
   if (sample_count == dlugosc_sredniej-1)
   {
      sample_count = 0;
      V0 = V0 / dlugosc_sredniej;
      V1 = V1 / dlugosc_sredniej;
      V2 = V2 / dlugosc_sredniej;
      Vbuf = (int)(V0);
      LCD_address_set(0x40);
      LCD_print_volt(Vbuf,1);
      Vbuf = (int)(V1);
      LCD_address_set(0x45);
      LCD_print_volt(Vbuf,1);
      Vbuf = (int)(V2);
      LCD_address_set(0x4A);
      LCD_print_volt(Vbuf,1);
   }
   ADC_channel++;
   if (ADC_channel == 3) ADC_channel = 0;
   if (ADC_channel == 0)
   {
      sample_count++;
      _delay_ms(1000/dlugosc_sredniej);
   }
   ADC_set_channel(ADC_channel);
   ADC_start_conv();
}


Plik ADC.c:
Code:

#include <avr\io.h>

//-----------PRZETWORNIK A/C------------------------------

void ADC_init(unsigned char mux, unsigned char sra)
{
   ADMUX = mux;
   ADCSRA = sra;
}

//--------------------

void ADC_start_conv()
{
   ADCSRA |= (1 << ADSC);
}

//--------------------

void ADC_free_run_on()
{
   ADCSRA |= (1 << ADFR);
}

//---------------------

void ADC_free_run_off()
{
   ADCSRA &= ~(1 << ADFR);
}

//---------------------

void ADC_interrupt_enable()
{
   ADCSRA |= (1 << ADIE);
}

//---------------------

void ADC_interrupt_disable()
{
   ADCSRA &= ~(1 << ADIE);
}

//---------------------

void ADC_set_channel(char channel)
{
   ADMUX &= 0xF0;
   ADMUX |= (channel & 0x0F);
}

//---------------------

Back to top
   
Google

Google Adsense


Post# 01 Dec 2009 16:50   





Back to top
   
klon111
Poziom 10
Poziom 10


Joined: 17 Jan 2005
Posts: 58
Location: Biała Podlaska

Post#3 Post from the author of the topic 01 Dec 2009 18:00   

Re: ATmega8 jak odczytać wartość z przetwornika ADC0-ADC


Code:
Testowanie przetwornika analogowo/cyfrowego
// w trybie pojedynczej konwersji

#include <avr/io.h>                // dostęp do rejestrów
#include <util/delay.h>


int main(void)                // program główny
{
   int a;
   int pomiar[10];
   a= 0;

 
 
   ADMUX = a;               
   //  6  | ADSC  | start konwersji - jeśli jest ustawiony ten bit oraz ADEN

   ADCSR = 103;             /* | ADEN  | włączenie przetwornika (AD Enable)             
                           częstotilwość taktowania F_ADC=F_CPU/12
    przy F_CPU=16MHz : F_ADC=125 kHz  */
   
   for(a=0; a <= 3; a++)

   { 
      ADMUX = a;          // wybierz kanał   przetwornika ADC
      _delay_ms(500);    // opóźnienie
      pomiar[a] = ADCW;  //zapisz do tablicy      

   }

Czy tak można oczytać wszystkie dane ?
Proszę o sprawdzenie i czy ATmega8 ma zegar 16MHz

Ja nie chce wyświetlać , mi chodzi w tym przypadku o sterowanie kolektorem słonecznym by zmieniał kierunek do promieni słonecznych.
W drugim przypadku porównywałby temperaturę na kolektorze i w zbiorniku.

Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 01 Dec 2009 18:00   





Back to top
   
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6596

Post#4 02 Dec 2009 10:02   

Re: ATmega8 jak odczytać wartość z przetwornika ADC0-ADC


A zajrzałeś Ty w ogóle do datasheeta ATMegi8?
Back to top
   
klon111
Poziom 10
Poziom 10


Joined: 17 Jan 2005
Posts: 58
Location: Biała Podlaska

Post#5 Post from the author of the topic 02 Dec 2009 11:33   

Re: ATmega8 jak odczytać wartość z przetwornika ADC0-ADC


Dzięki atom1477 za podpowiedz znalazłem stronę
http://mirley.firlej.org/fuse_bity_w_mikrokontrolerach_avr
Ale dalej czekam na podpowiedz fachowców czy ten krótki kot jest napisany poprawnie.
Jeszcze mam pytanie w jakim zakresie powinno być napięcie do ADC i gdy jest 1v na wejściu to co odczyta ADCW;
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 02 Dec 2009 11:33   





Back to top
   
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6596

Post#6 02 Dec 2009 11:42   

Re: ATmega8 jak odczytać wartość z przetwornika ADC0-ADC


Ja ustawisz napięcie referencyjne na AVCC, to przy 1V odczyta Ci:
ADCW = 1V/AVCC*1023
czyli dla AVCC = 5V:
1V/5V * 1013 = 205
Back to top
   
Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> ATmega8 jak odczytać wartość z przetwornika ADC0-ADC5
Page 1 of 1
Similar topics
podstawy przetwornika AC w atmega8 (2)
Atmega8 Obsługa przetwornika AC (14)
[Atmega8][Język C] Jak poprzez naciśnięcie przycisku przypisać wartość zmiennej (50)
AT91SAM7S - jak ze "startupCode" odczytać wartość (2)
[bascom][atmega8] jak wyświetlić 3 cyfrową wartość zmiennej (30)
ADS1100 na I2C. Nie można nic odczytać z przetwornika. (10)
Jak z <selecta> (PHP) odczytać wartość na innej podstronie? (4)
[EXCEL] Jak odczytać wartość zaznaczonej komórki. (8)
Wartość binarna z przetwornika a wartość analogowa (10)
[Atmega8][c][WinAVR]Odczyt wartosci ADC0 (15)

Page generation time: 0.132 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed