Skocz do zawartości

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

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

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.

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..

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); 
   } 
}

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

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

Co? Chłopie, odstaw to co bierzesz albo zmień dealera.

A co masz 4 posty wyżej w swoim poście? Co to jest?

pomiar=ADCH;

To jest właśnie odczytanie pomiaru przetwornika A/D.

wiem że czytam to w tym warunku

pomiar=ADCH;
ale to jest chyba postać nie jawna( znaczy że nie wiem jakie są tam liczby) bo już troche mi sie to miesza

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

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

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...