Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[atmega8][C] ADC, napięciowy czujnik odległości SHARP

23 Jun 2011 21:12 1670 4
  • Level 9  
    Witam.
    Mam pewien problem z inicjalizacją przetwornika ADC i nie wiem gdzie robię błąd a próbowałem wszystkiego więc proszę o pomoc.
    Kod który zamieściłem jest tylko do testów.
    Przetwornik ma odczytywać na bieżąco wartość napięcia na wyjściu czujnika gdzie jego zakres wyjściowy wynosi od 0.2V do 3.2V, ma on wykrywać przeszkody w robocie mobilnym. Korzystam z napięcia referencyjnego z pinu AVcc podłączonego do +5V przez kondensator 100uF do GND, Aref podłączony przez kondensator 100uF do GND. Po wielokrotnych próbach myślałem że procek jest uszkodzony i próbowałem na atmedze16 bez powodzenia. Czujnik też sprawny bo sprawdzałem napięcie na jego pinie wyjściowym, zmienia się w danym przedziale. Nie mam już żadnych pomysłów,a na pewno robię gdzieś błąd, może ktoś widzi gdzie leży problem?

    Code:
    #include <avr/io.h>
    

    int main()
    {
       DDRC = 0x00;
       PORTC = 0x00;
       DDRD = 0xff;       
       PORTD = 0x00;      
       
       
       ADCSRA |= (1<<ADEN) |(1<<ADSC) |(1<<ADFR) |(1<<ADPS1) |(1<<ADPS0);//Włączenie przetwornika,start konwersji,
                                                              //free running,preskaler 8
       
       ADMUX |= (1<<REFS0) |(1<<ADLAR);                            //Napięcie na AVcc, wyrównanie do lewej
       
       for(;;)                                 
       {                                    

          if(ADCH>=400)
          {
             PORTD |= _BV(7);   //Zapal diodę
          }
          else
          {
             PORTD &= ~_BV(7);   //Zgaś diodę
          }
       }
       
       return 0;
       
       }
  • Level 21  
    Rejestry masz 8bitowe wiec czemu odwołujesz się
    Code:
    if(ADCH>=400)
    
          {
             PORTD |= _BV(7);   //Zapal diodę
    }

    Jak już chcesz to zrób to tak:
    Code:
    if(ADC>=400)
    
          {
             PORTD |= _BV(7);   //Zapal diodę
    }
  • Level 9  
    A to fakt. ADCH jest 8bitowy więc maksymalna wartość w nim przechowywana to 256. Sugerowałem się wzorem z dokumentacji tam była wartość 1024 ale to była wartość dla 10bitowej rozdzielczości, dobrze myślę?
    Ale wytłumacz czemu ADC? Przecież to oznacza sam przetwornik, w datasecie niema przecież takiego rejestru.
  • Helpful post
    Level 21  
    Jeśli wykorzystujesz 8bit z przetwornika to do wzoru wstaw 255.ADC, ADCW to są specjalne definicje które maja ułatwić obsługę przetwornika.
  • Level 9  
    Witam. Winą niedziałającego przetwornika była próba porównania liczby większej niż jest w stanie zmieścić się w 8bitach, z wartością w ADCH. Aż mi wstyd... Temat zamknięty i dzięki za pomoc skalsky5000.