Skocz do zawartości

[C] ADC atmega8


MasterFun

Pomocna odpowiedź

a racja celne uwagi zaraz to zmienie i zobacze co z tego wyjdzie, tylko moje pytanie odnosi się jeszcze do wartości napięcia które reguluje, jak sprawdzić jaki to zakres i jak go w zapisać w pętli bo chyba nie tak: np.

pomiar==2.3; //2,3v
Link do komentarza
Share on other sites

Przetwornik jest 10 bitowy, wiec jest 1024 różnych wartości od 0 - 0V do 1023 - napięcie zasilania (tal konfiguracji podanej przeze mnie) więc V=V(zasilania)*pomiar/1023

Link do komentarza
Share on other sites

Prościej użyć instrukcji switch

np:

   switch(zmienna) 
   {
	case 23 :
	PORTA = ~1;
	break;

	case 24 :
	PORTA = ~3;
	break;

	case 25 :
	PORTA = ~7;
	break;

	case 26 :
	PORTA = ~15;
	break;

	case 27 :
	PORTA = ~31;
	break;

	case 28 :
	PORTA = ~63;
	break;

	case 29 :
	PORTA = ~127;
	break;

	case 30 :
	PORTA = ~255;
	break;


	default:/* jeśli żaden z wcześniejszych wariantów */ 
	PORTA=0xff;

A co do napięcia to jest tak że 1024 to napięcie równe aref (maksymalna wartośc to 1023 ale to taki szczegół)

Musisz to podzielić przez jakaś wartość by otrzymać jakie jest napięcie.

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

Można użyć dzielnik napięcia.

Jeśli napięcie będzie się mierzyło względem 5V, to trzeba zbudować taki, żeby na µkontroler przy 30V podawać 5V. Czyli mniejszy rezystor podłączony między µkontrolerem a masą musi być 5 razy mniejszy niż między µkontrolerem a mierzonym sygnałem. Lepszym rozwiązaniem byłoby na pewno coś na na wzmacniaczu operacyjnym..

Link do komentarza
Share on other sites

wiec troszke zmodernizowałem program ale nadal nie bardzo wiem jakie wartości mam wpisać do warunków zapalania diod. RAV napisałeś, że

V=V(zasilania)*pomiar/1023
tylko jak to zastosować w tych if'ach skoro napięcie na potencjometrze zmiania sie od 0 do 2.45V. Mógłby ktoś mi to na chłopski rozum wytłumaczyć bo jakiś mało pojętny jestem;/

#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 = _BV(1)|_BV(3)|_BV(2); //diody pod PB1, PB2, PB3 
PORTB= _BV(1)|_BV(3)|_BV(2); 

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)) {}; 
	PORTB = _BV(1)|_BV(3)|_BV(2);//diody zgaszone

       pomiar=ADCH;

           if((pomiar >= ?) && (pomiar < ?)) // nie wiem jak to przeliczyć pod C
           { 
           PORTB &= ~_BV(1); //dioda na PB1 świeci 
           } 
           if((pomiar >= ?) && (pomiar <?)) 
           { 
           PORTB &= ~_BV(2);//dioda na PB2 świeci 
           } 
           if((pomiar >= ? ))
           { 
           PORTB &= ~_BV(3);//dioda na PB świeci 
           }    
       delay_ms(100); 
   } 
}
Link do komentarza
Share on other sites

Wybrałeś Vcc jako napięcie odniesienia [ADMUX |= _BV(REFS0);] oraz tryb 8-mio bitowy [ADMUX |= _BV(ADLAR);], więc wartość '0' będzie oznaczała wartość napięcia równe GND (0V), a wartość '255' będzie oznaczała wartość napięcia równe Vcc (zakładam tutaj 5V, bo nie znam Twojego układu).

Policz to sobie zatem z proporcji:

255 = 5V

zmierzona wartość = xV

co daje:

xV = 5V * zmierzona wartość / 255

czyli dla przykładu mając zmierzoną wartość == 110 mamy:

xV = 5V * 110 / 255 ~= 2,157V

albo odwrotnie, jeśli chcesz mieć np. przedziały napięciowe podzielone na 4 (brak diody, 1, 2, 3 diody), to będzie to co 5V/4 => 1,25V:

zmierzona wartość = xV * 255 / 5V

0V .. 1,25V => 0 .. 63

1,25V .. 2.5V => 64 .. 127

2.5V .. 3.75V => 128 .. 191

3.75V .. 5V => 192 .. 255

I tych pogrubionych wartości właśnie używasz w swoich ifach.

Hope it helps 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

acha no to kumam jak to zrobić tylko jeszcze jedno pytanie mam

czyli dla przykładu mając zmierzoną wartość == 110 mamy:

xV = 5V * 110 / 255 ~= 2,157V

a w moim przypadku czym jest ta "zmierzona" wartość, mam ją zmierzyć miernikiem czy to jest to co mam w adc?

A układ mam zasilony z USB

Link do komentarza
Share on other sites

ach to już rozumiem coś mi sie w główce zapętliło sorki;) bo stosując podane przez Marooned sposów obliczenia niby sie zapalają diody tylko mam jakiś problem z opóźnieniem bo zamiast sie świecić to migają i zazwyczaj tylko jedna a reszta tylko raz mrugnie i przestaje być aktywna

Link do komentarza
Share on other sites

Tam masz wynik pomiaru. Liczbę od 0 do 1023, wprost proporcionalną do mierzonego napięcia.

Nie wiem czy dobrze zrozumiałem, ale napisałeś, że w rejestrze 8b mieści się dana 10b (1024 można wyrazić minimum na 10b).

Wynik pomiaru leci do dwóch rejestrów ADCH oraz do ADCL. W ADCL mieszczą się tylko dwa bity. i w połączaniu te dwa rejestry dopiero zawierają 10b wynik pomiaru.

  • Lubię! 1
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!

Gość
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.