Skocz do zawartości

[C] Getadc(channel) z Bascoma, jak będzie w C?


ElectroBeginner

Pomocna odpowiedź

WItam, próbuję zaprogramować robota, który ma reagować na odczyty z 8 czujników. W Bascomie takie coś:

Wartosc_adc = Getadc(7)
Sharp = Wartosc_adc
'Transoptory:
Wartosc_adc = Getadc(6)
Sens6 = Wartosc_adc
Wartosc_adc = Getadc(5)
Sens5 = Wartosc_adc
Wartosc_adc = Getadc(4)
Sens4 = Wartosc_adc
Wartosc_adc = Getadc(3)
Sens3 = Wartosc_adc
Wartosc_adc = Getadc(2)
Sens2 = Wartosc_adc
Wartosc_adc = Getadc(1)
Sens1 = Wartosc_adc
Wartosc_adc = Getadc(0)
Sens0 = Wartosc_adc

bierze z 8 czujników a w C w zainicjowaniu ADC ustawia się MUXy, które odpowiadają za jeden kanał, jak zrobić aby było na wszystkie na raz i jaka komenda będzie odpowiedzialna za np. odczyt z kanału 0, 1 ... 7 ?

Dzięki z góry!

Link do komentarza
Share on other sites

Jeżeli dobrze Cie rozumiem to:

nie da się naraz odczytać wszystkich kanałów.

Ustawiasz za pomocą MUX kanał numer 0 i robisz konwersje i odczytujesz wynik.

Następnie ustawiasz za pomocą MUX kanał numer 1 i robisz konwersje i odczytujesz wynik.

i tak dalej.

Link do komentarza
Share on other sites

Nie wiem jakiego uK używasz.

Na przykłąd w Atmega8 jest tylko jeden przetwornik ADC. Natomiast ten przetwornik możesz podłączyć do jednej z 6 nóżek (lub 8 w obudowie SMD). I wtedy możesz mierzyć napięcie z sześciu sygnałów. Ale oczywiście nie jednocześnie, bo tak jak mówiłem jest tylko jeden przetwornik.

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

char ADC_Konwersja()
{
char dana=0;
ADCSRA |= (1<<ADSC);                                  //Uruchomienie konwersji
while(bit_is_clear(ADCSRA, ADIF)) {};           //Czekam aż skończy się konwersja
dana = ADCH;					              //Odczyt
ADCSRA |= (1<<ADIF);                                  
return dana;
}

int main()
{
               ADMUX &= 0b11100000;         //Wyzerowanie  bitów numeru kanału
	ADMUX |= 0;                            //Wpisanie numeru kanału
	Wynik[0]=ADC_Konwersja();  //Konwersja i zapis wyniku do tablicy wynik

               ADMUX &= 0b11100000;        //Wyzerowanie  bitów numeru kanału
	ADMUX |= 1;                           //Wpisanie numeru kanału
	dana=ADC_Konwersja();       //Konwersja i zapis wyniku do tablicy wynik

               ADMUX &= 0b11100000;       //Wyzerowanie  bitów numeru kanału
	ADMUX |= 2;                          //Wpisanie numeru kanału
	dana=ADC_Konwersja();      //Konwersja i zapis wyniku do tablicy wynik

itd dla pozostałych kanałów

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

Ja korzystam z czegoś takiego:

void config_adc(void)
{
	ADCSRA |= _BV(ADEN) |_BV(ADPS2) |_BV(ADPS1);	
}

uint16_t get_adc(uint8_t channel)
{
ADMUX = (ADMUX &= ~0x07) | (channel & 0x07);
ADCSRA |= _BV(ADSC);
while(ADCSRA & _BV(ADSC));
return ADC;
}

Config będziesz musiał dopasować do swojego taktowania.

Link do komentarza
Share on other sites

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

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.