eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaADC w ATMEGA16 i ilość stanów
Ilość wypowiedzi w tym wątku: 6

  • 1. Data: 2010-07-30 15:51:47
    Temat: ADC w ATMEGA16 i ilość stanów
    Od: Jan Górski <g...@o...pl>

    Mam wrażenie, że ilość stanów rzeczywistych w ADC 10bit jest niższa od
    ilości możliwych (czyli 10 bit). ADC skonfigurowany jest na AREF =
    internal.

    masa -----/\/\/ 1MOHM /\/\/------|/tuADC/|---------|fototranz|------
    AREF

    Skonstruowałem prosty czujnik optyczny na fototranzystorze połączonym
    w szereg z 1Mohm'owym rezystorem. Napięcie na 'dzielniku' waha się od
    0 do AREF V, tak, że po oświetleniu fototranzystora, napięcie na
    dzielniku rośnie(fototranzystor przewodzi). Do "dzielnika" wpiąłem
    wejście ADC.

    Wyniki, jakie osiągam powoli zakrywając 'oczko' fototranzystora
    zmieniają się dość skokowo, czasem znacznie. Powinno być dość powoli.
    Podobnie jest, jak podepnę wejście ADC do regulowanego rezystora, co w
    tym wypadku łatwiej wytłumaczyć kiepskimi ścieżkami węglowymi.


    KOD : -------------------------------------------

    #include <avr/io.h> // dostęp do rejestrów
    #include <avr/interrupt.h> // funkcje sei(), cli()
    #include <util/delay.h>
    #include <dodane/mojLCD.h>
    #include <stdlib.h>

    void lcd_print(char *str) {
    unsigned char i=0;

    while(str[i]!=0) {
    lcdData(str[i]);
    i++;
    }

    }

    void adc_init(void) // Function to initialise the ADC feature
    {
    ADCSRA=0X00; // Clear previous ADC results and status flags
    ADMUX=0X40 ; // 0x40 for 10 bits (0x60)
    ADCSRA=0X87; // We have set the ADSC bit to start a conversion, and
    the
    // ADPS bits are set so that the prescaler is 128
    ADCSRA=0X80; // ADEN is set, to enable the ADC
    }




    unsigned int adc_start(unsigned char channel) // Function to perform
    an ADC conversion, Takes 0-8 as input
    // to select which input to convert
    {
    unsigned char i;
    ADCH=0x00; // Clear the previous result
    ADCL=0x00; // Clear the previous result

    i=channel&0x07; // Decide which line to perform ADC conversion on
    ADMUX=i|0x60; // Enter which line to perform in the ADC control
    register
    ADCSRA|=1<<ADSC;

    while(ADCSRA & (1<<ADSC)); // wait for conv. to complete
    unsigned int temp=ADC; //unsigned int temp=ADC; for 10 bits
    return temp;
    }


    /* ---------------- Sample ADC Call -----------------------*/
    int main(void) {
    unsigned int result=0;
    char str[10];
    _delay_ms(500);
    lcd_init();
    adc_init();
    while(1) {
    result=adc_start(0); // This performs ADC conversion on Pin A0 and
    stores the result
    lcdCommand(HD44780_CLEAR);
    _delay_ms(2);
    lcd_print("ADC : ");
    itoa(result,str,10);
    lcd_print(str);
    _delay_ms(50);
    }
    return 0;
    }

    ----------------------------------------------------
    -


  • 2. Data: 2010-07-30 16:19:19
    Temat: Re: ADC w ATMEGA16 i ilość stanów
    Od: Michoo <m...@v...pl>

    Jan Górski pisze:
    > Mam wrażenie, że ilość stanów rzeczywistych w ADC 10bit jest niższa od
    > ilości możliwych (czyli 10 bit). ADC skonfigurowany jest na AREF =
    > internal.
    Do tej pory za każdym razem gdy słyszałem, że ADC w atmedze nie działa
    to była to wina softu.

    > void adc_init(void) // Function to initialise the ADC feature
    > {
    > ADCSRA=0X00; // Clear previous ADC results and status flags
    > ADMUX=0X40 ; // 0x40 for 10 bits (0x60)
    > ADCSRA=0X87; // We have set the ADSC bit to start a conversion, and
    > the
    > // ADPS bits are set so that the prescaler is 128
    Komentarze kłamią.
    0x87 to 10000111 czyli ustawiasz prescaler i ADEN a nie ADSC
    > ADCSRA=0X80; // ADEN is set, to enable the ADC
    A w tym miejscu ustawiasz prescaler na 0 i ADEN na 1.

    --
    Pozdrawiam
    Michoo


  • 3. Data: 2010-07-30 16:34:43
    Temat: Re: ADC w ATMEGA16 i ilość stanów
    Od: Jan Górski <g...@o...pl>

    Powinno być ?
    KOD --------------
    void adc_init(void) // Function to initialise the ADC feature
    {
    ADCSRA=0X00;
    ADMUX=0X40;
    ADCSRA=0X47; // prescaler (128) + ADSC
    ADCSRA|=0X80; // ENABLE
    }
    ------------------------


  • 4. Data: 2010-07-30 20:16:08
    Temat: Re: ADC w ATMEGA16 i ilość stanów
    Od: Michoo <m...@v...pl>

    Jan Górski pisze:
    > Powinno być ?
    Nie wiem co masz w układzie - to Twój projekt

    Taka uwaga - nie wiem skąd u programistów uC bierze się maniera do
    pisania w hex. Może od razu podawać adresy rejestrów zamiast ich
    definicji? np. ((*(volatile uint8_t *)((0x06) + 0x20))) |= 0x20;
    Jak piszesz ADMUX=0X40; to bez zajrzenia do dokumentacji kompletnie nie
    wiem o co chodzi. A zaglądanie do dokumentacji marnuje mój czas. Jak byś
    napisał ADMUX=_BV(REFS0); (jak twój kompilator nie ma to #define _BV(a)
    (1<<a)) to od razu byłoby wiadomo co ustawiasz.

    > KOD --------------
    > void adc_init(void) // Function to initialise the ADC feature
    > {
    > ADCSRA=0X00;
    > ADMUX=0X40;
    > ADCSRA=0X47; // prescaler (128) + ADSC
    > ADCSRA|=0X80; // ENABLE
    Dla zasady wypadałoby tu poczekać na zakończenie tej pierwszej konwersji.
    > }
    > ------------------------
    void setup_adc()
    {
    ADMUX = _BV(REFS0);
    ADCSRA = 0b111;// /128
    ADCSRA |= _BV(ADEN) | _BV(ADSC);
    while( ADCSRA & _BV(ADSC) )
    ;
    }
    nie jest czytelniejsze?

    > unsigned int adc_start(unsigned char channel) // Function to perform
    > an ADC conversion, Takes 0-8 as input
    > // to select which input to convert
    > {
    > unsigned char i;
    > ADCH=0x00; // Clear the previous result
    > ADCL=0x00; // Clear the previous result
    Zbędne, niezdefiniowane zachowanie, ale chyba nie powinno powodować błędów.

    > ADMUX=i|0x60; // Enter which line to perform in the ADC control
    > register
    Dlaczego ustawiasz ADLAR?


    --
    Pozdrawiam
    Michoo


  • 5. Data: 2010-07-30 20:57:41
    Temat: Re: ADC w ATMEGA16 i ilość stanów
    Od: Konop <k...@g...pl>

    > Wyniki, jakie osiągam powoli zakrywając 'oczko' fototranzystora
    > zmieniają się dość skokowo, czasem znacznie. Powinno być dość powoli.
    > Podobnie jest, jak podepnę wejście ADC do regulowanego rezystora, co w
    > tym wypadku łatwiej wytłumaczyć kiepskimi ścieżkami węglowymi.

    Jak chcesz lepiej, to podepnij obwód RC i rozpocznij ładowanie i patrz
    na to, przez jakie stany przechodzi. Oczywiście będą szumy, ale przy
    odpowiedniej stałej czasowej nie powinno być przeskoków :). Tam raczej
    kształt napięcia będzie taki, jaki być powinien. W przypadku
    fotorezystora albo potencjometru tak być nie musi.
    BTW: Sądzę, że efekt zakrywania fotorezystora byłby różny w zależności
    od tego w jaki sposób nakładałbyś osłonę - chodzi mi o kierunek...

    --
    Pozdrawiam
    Konop


  • 6. Data: 2010-07-31 07:01:26
    Temat: Re: ADC w ATMEGA16 i ilość stanów
    Od: Jan Górski <g...@o...pl>

    > Dlaczego ustawiasz ADLAR?

    Wziąłem ten przykład z jakiejś strony, liczyłem, że jest OK i
    sprawdzałem tylko po komentarzach co robi w każdym z kroków. Okazuje
    się, że jednak było sporo błędów. Dziękuję za pomoc w ich odnalezieniu
    i dalszym wyjaśnieniu używania ADC.
    Jeśli natomiast chodzi o ADLAR, to przy ADLAR=1 odczytanie "unsigned
    int rezultat = ADC;" daje bardzo dużą rozpiętość wartości. Na oko
    jakieś 16bitów :) Ostatnie to w większości jakieś śmieci, ale nawet
    one zdają się stabilizować, jeśli wyłączę migające źródła światła, np
    monitor. Po usunięciu ADLAR oczywiście 10 bitów.

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: