Skocz do zawartości

[C] ADC atmega8


MasterFun

Pomocna odpowiedź

Witam!

Czy mógłby mi ktoś wytłumaczyć jak użyć przetwornika ADC w praktyce? Generalnie wiem do czego to służy ale jak to wykorzystać? Koniecznie w języku C (w internecie są opisy ale zazwyczaj odnoszą się do bascoma). Chodzi mi o podłączenie potencjometru którym to można by coś sterować w zależności od ustawionej rezystancji (będę wdzięczny za jakiś prosty kod, w którym pokazana by była konfiguracja ADC i sposób odczytu danych). Jeśli macie również jakieś linki do konkretnych artykułów to też poproszę, (czytałem .pdfa Cezarego Klimasza, ale wiele mi to nie powiedziało... 😉

pzdr

Link do komentarza
Share on other sites

Wczoraj napisałem sobie taką fukcje:

konfiguracja rejestrów:

(najszybsze taktowanie)

  ADMUX |= (1<<REFS0)|(0<<REFS1); //porównuje z AVCC,  AREF--||--GND
       //0 tylko dla zasyganlizowania ze jest tam zero bo to nic nie zmienia
       ADCSRA |= (1<<ADEN);

A to funkcja:

int getADC(char number)
//number należy do <0, 7>, kod nie sprawdza szkoda pamięci FLASH
{
       ADMUX &= 0xf0; //zerowanie 4 młodszych bitów
       ADMUX |= number; //ustawianie numeru kanału 

       ADCSRA |= 1<<ADSC; //zaczyna konwersję
       while(ADCSRA & (1 << ADIF));    //dopuki bit ADIF nie jest ustawiony nie jest gotowa kowersja
       ADCSRA &= ~((1 << ADSC) | (1 << ADIF)); //zeruj flage konwersji i rozkaz rozpoczecia
       return ADCW;
}

Nie trzeba w C można w C++ 😉 (ta funkcja jest częścią klasy, mającej obsługiwać mojego robockia). AVR da się też programować w Assemblerze i na przykład adzie czy pascalu.

Link do komentarza
Share on other sites

A można coś prostszego? 😉 Bo generalnie ja początkujący jestem w tej dziedzinie, nie bardzo rozumiem jak ta funkcja ma działać z np. potencjometrem, w jaki sposób odbywa się odczyt z potencjometru, spadek napięcia? Gdzie jest deklaracja do ktorej lini podpiety jest ów potencjometr itd itd... 😉

pozdrawiam i dzięki może w przyszłości skorzystam...

Link do komentarza
Share on other sites

Potencjometr musisz podłączyć do któregoś z wejść przetwornika ADC.

Po szczegóły odsyłam do karty katalogowej.

Odczytujesz z niej numer kanału ADC do którego podpiołeś (nie numer portu) i ten numer wpisujesz w wywołaniu funkcji.

np.:

int T = getADC(5);

odczyta z kanału 5 do zmiennej T.

A tak bym podłączył potencjometr:

+ 5V

|

| |

| |<-- mikrokontroler

| |

|

GND

EDIT

------

Rysunke się troche rozjechał, ale widać o co chodziło 😉

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

No no coraz bardziej rozumiem, a jaki będzie wynik w zmiennej T, liczba binarna na 8 czy 10 bitach? Jaka będzie różnica w wyniku jeśli damy inny potencjometr? Jak będzie wyglądał wynik przy załóżmy 100R, 1k, 100k, dla potencjometru 1M a jaki dla 1k?

Link do komentarza
Share on other sites

Jak będzie wyglądał wynik przy załóżmy 100R, 1k, 100k, dla potencjometru 1M a jaki dla 1k?
Potencjometr działa na zasadzie dzielnika napięcia, więc teoretycznie nie ma znaczenia. Ale jak dasz 1 om to się spali, a jak 10M to nie wiem czy ADC jest na tyle czuły. Ja bym proponował 100k.
a jaki będzie wynik w zmiennej T, liczba binarna na 8 czy 10 bitach?

Na 10 najmłodszych bitach tej zmiennej.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

O widzisz, krótko i na temat, dzięki za odpowiedź, jak znajdę chwile czasu to się pobawię w hardware, wtedy myślę reszte pytań rozwieje praktyka 😉

Oczywiście "pomógł" 😉))

pozdrawiam, w razie czego będę pytał po pierwszych testach 😉))

Link do komentarza
Share on other sites

o widze, że i ja skorzystam z porad bo również zaczyna swoją przygode z atmega8 i C. Ipróbuje rozgryźć ten przetwornik adc, chciałbym za pomocą potencjometru sterować zapalaniem sie kilku diod(im wieksze napięcie tym wiecej diod sie zaświeci). Bo mam zmontowany układ, potencjometr podpięty pod PC0(ADC0), diody mam pod pinami PB1...PB4. Czytam Datasheet atmegi ale z angielskim troche kiepsko i nie bardzo wiem od czego zacząć i na co zwrócić uwage. Może macie jakieś rady dla początkującego

Link do komentarza
Share on other sites

Dalmierze Sharp są powszechnie używane w robotyce. Taki czujnik łączy się za pomocą trzech przewodów - 5V, masa i sygnał analogowy określający odległość ( i generalnie będący w zakresie 0,8-3,5V). Tamta osoba ma sygnał analogowy czujnika Sharp podpięty pod nóżkę PC3 i mierzy napięcie analogowe na tej nodze mikrokontrolera.
Link do komentarza
Share on other sites

a możecie mi panowie na chłopski rozum wyjaśnić (w przypadku jak chciałbym potencjometrem zpalać diody podpięte do PB1,2,3 w zależnoąci od napięcia) jak to jest z doborem zegara bo mam wybraną 128 i to na jej zasadzie mam zapalać te diody, bo jakoś tutaj tego nie łapie zresztą zobaczcie sami i powiedzcie czy moje rozumowanie ma sens:

#define F_CPU 16000000L
#include <avr/io.h>
#include <util/delay.h>

unsigned int pomiar;        // Zmienna do przechowywania wyniku pomiaru

void delay_ms(uint16_t ms)
{
       while(ms)
       {
               _delay_ms(1);
               ms--;
       }
}



void Inicjalizacja(void)
{

DDRB = 0xE; //000001110 diody pod PB1, PB2, PB3
PORTB= 0xE;


ADMUX |= _BV(REFS0);
ADMUX |= _BV(ADLAR);
// Wybór kanału wejścia - PC0 (ADC0)
ADMUX |= _BV(MUX0);
// Zezwolenie na konwersję
ADCSRA |= _BV(ADEN);
// Wybranie częstotliwości dla taktowania przetwornika
ADCSRA |= _BV(ADPS0);
ADCSRA |= _BV(ADPS1);
ADCSRA |= _BV(ADPS2);
}

int main(void)
{
   Inicjalizacja();



   while(1)
   {
       ADCSRA |= _BV(ADSC);
       while( ADCSRA & _BV(ADSC)) {};


       pomiar=ADCH;
		if (pomiar<64)
		{
		PORTB &= ~_BV(1); //dioda na PB1 świeci
		}
		else if (pomiar == 64)
		{
		PORTB &= ~_BV(2);//dioda na PB2 świeci
		}
		else if (pomiar > 64)
		{
		PORTB &= ~_BV(3);//dioda na PB świeci
		}	
       delay_ms(100);
   }
}
Link do komentarza
Share on other sites

Nie analizowałem konfiguracji ani odczytu z ADC, ale na początku pętli dodałbym gaszenie diod, wtedy będzie świeci dioda której odpowiada aktualne napięcie. Ten kod który teraz masz zaświeca diody, ale w momencie gdy napięcie spadnie diody dalej będą świecic aż do resetu. Dośc trudno będzie też osiągną wynik z ADC równy dokładnie 64, moim zdaniem lepiej dla każdej diody ustawi jakiś przedział, np.:

if((pomiar > 50) && (pomiar < 70))

(50 i 70 są przykładowo, najlepiej je zmienic na swoje)

(Do ADC polecam swoją funkcje 😃 którą zamieściłem kilka postów wyżej (działa dla ATmega8, dla innych może by problem z nazwami rejestrów)

----

Jeśli dioda się zapali należy wywietrzyć pokój i kupi nowy egzemplarz 😉 Sam się łapie na mówieniu / pisaniu "zapali diodę" 😃 .

---

Częstotliwość ADC ma wpływ na szybkość jego pracy. Im większa tym szybciej mamy wynik, ale więcej prądu układ zużywa. W tym przypadku raczej będzie działa z każdą częstotliwością.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.