Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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!

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.

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.

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

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.

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