Skocz do zawartości

Pomocna odpowiedź

Napisano

Cześć

ADC w mojej ATmedze1284 przejawia dziwne zachowanie. Chciałem uruchomić układ jak w przykładzie na stronie AVR ADC z tą zmianą, że zamiast przycisku pomiary są wykonywane w pętli.

Schemat połączenia zgodny z linkiem powyżej.

Wyniki pomiaru przekazuję dodatkowo na wyświetlacz.

Początkowo używałem samego potencjometru (bez rezystora) a więc po osiągnięciu napięcia ~2,56 V wynik powinien wynieść 1023 natomiast wyniki na wyświetlaczu dochodzą do ~960 i dopiero po przekroczeniu tej granicy wartość podnosi się do 1023. Praca potencjometru po podłączeniu jego wyjścia do ADC jest bardzo nieliniowa (potencjometr liniowy 10k).

Z kolei pomiary napięcia na potencjometrze odłączonym od ADC pokazują pracę liniową.

Drugi problem to taki, że jeśli zrobię już ten dzielnik napięcia z potencjometrem żeby nie tracić na rozdzielczości to maksymalny wynik na wyświetlaczu wynosi 7. W tym przypadku także zmierzyłem napięcia po odłączeniu od ADC i zmienia się ono liniowo w zakresie 0-2,5 V.

Trzeci problem to taki, że po zmianie napięcia referencyjnego z wewnętrznego 2,56 V na Vref=Avcc (nie robię wtedy dzielnika) to maksymalny wynik na wyświetlaczu to 35.

Pytanie - błąd w kodzie czy upalony mikrokontroler?



/*
*/

#include <avr/io.h>
#include <avr/include/util/delay.h>
#include <stdbool.h>
#include <stdlib.h>
#include "hd44780.h"
#include "hd44780.c"




int main(void)
{
   DDRA = 0xFF;
   DDRB = 0xFF;
   DDRC = 0xFF;
   DDRD = 0xFF;
   DDRC &= ~(1<<PC0);  //ADC0

   MCUCR |= (1<<JTD); //wylaczenie JTAG
   MCUCR |= (1<<JTD);

   LCD_Initalize();

   ADMUX |= (1<<REFS0)| (1<<REFS1);    //wewnętrzne 2,56 V
   ADCSRA |= (1<<ADPS0) | (1<<ADPS1);  //dzielnik zegara 8 - 1MHz/8 = 125000Hz
   ADCSRA |= (1<<ADEN);                //uruchomienie ADC

   ADCSRA |= (1<<ADSC);                //Pierwsa konwersja

   volatile uint16_t wynik;

   while(1)
   {
   while(ADCSRA & (1<<ADSC))       //czekam na zakonczenie konwersji
   {}
       wynik = ADC;
       char bufor[5];
       itoa(wynik,bufor,10);        //uzywane zamiennie z utoa
       LCD_WriteText(bufor);
       _delay_ms(30);
       LCD_Clear();
       ADCSRA |= 1<<ADSC;          //nowa konwersja
   }

   return 0;
}

__________

Komentarz dodany przez: Treker

deshipu piwo dla ciebie.

Robiąc schemat zorientowałem się, że ATMega1284 ma ADC na porcie A a nie na porcie C jak ATMega328p, którą także posiadam i z którą cały czas pracowałem. Kod poprawiłem i wydaje mi się, że wszystko jest ok.

Jeszcze raz wielkie dzięki 🙂

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...