Stránka 1 z 1

Využití jednoho A/D převodníku s více vstupy

Napsal: 13 bře 2017, 21:52
od agadirCZ44
Zdravím..
Mám takový problém A/D převodník používat umím ale jak ho nastavit aby po sobě (třeba každou 1ms) střídal vstupy (ADC0-ADC7) a zapsal si každou hodnotu kterou změřil ? díky za nějaký nástřel v cčku :)

Napsal: 13 bře 2017, 22:17
od ZdenekHQ
Víš, my už jsme přestali leštit křišťálový koule a zkoumat, co máš třeba Ty za převodník.

Ale obecně to převodníky neumí, musíš navzorkovat, přečíst, uložit někam do paměti, přepnout na další vstup atd.

Napsal: 13 bře 2017, 22:27
od agadirCZ44
jo pardon myslím ATMEGA16A

Napsal: 13 bře 2017, 22:34
od frpr666

Kód: Vybrat vše

uint8_t buff[8];
volatile uint8_t int_buff[8];
volatile uint8_t int_i;

// every 1 ms

ISR TCNT0_OVF
{
    int_buff[int_i] = adc_get_value();
    int_i++;
    int_i = int_i & 0x03;
    adc_set_channel(int_i); // [edit1, přepnutí kanálu až po převodu]
}

setup()
{
    adc_setup();
    adc_set_channel(0);
    
    tcnt0_setup();
    interrupt_setup();
    sei();
}

loop()
{
  cli();
  memcpy( &buff ,  &int_buff, 8);
  sti();
  printf("ADC0=%d\n", buff[0]);
  printf("ADC1=%d\n", buff[1]);
  printf("ADC3=%d\n", buff[3]);
}
Smajlíky umí někdy otravovat. Je lepší to dávat do CODE. ZdenekHQ

edit1, přepnutí kanálu až po převodu

Napsal: 14 bře 2017, 12:19
od Atlan
Po prepnuti vstupu je nutne chvilku pockat a az tak spustit prevod, vid datasheet.

Napsal: 20 bře 2017, 13:00
od agadirCZ44
no to čekání je právě problém... můj původní plán byl že bude každých 500us odebírat jedno napětí tím pádem 4ms by zabrala celá smyčka. Ale aby nevznikaly přeslechy tak to nejde dostat pod 7ms (56ms smyčka) což je strašně moc a ekvalizér který stavím by se stal skoro nepoužitelným...

Není na to nějaký fígl jak to zrychlit aspoň na 1ms ?

Napsal: 20 bře 2017, 13:20
od ZdenekHQ
To je teda pěkně línej převodník. I externí za pár desítek korun a se seriovou komunikací umí běžně 100ksps.

Ty za stovku mají i 8 vstupů, třeba MCP3208. Dají se i přetaktovat výš za cenu ztráty rozlišení.

Napsal: 20 bře 2017, 13:43
od FHonza
ADC kanál lze měnit i v průběhu převodu, přepne se až po skončení běžícího převodu.

Když použiješ jednoduchý převod (v registru ADCSRA nastavíš bit ADCS), tak první převod po zapnutí bude trvat 25 cyklů A/D převodníku, další pak 13 cyklů. To při frekvenci 200kHz A/D vychází na 125µs pro první, na další pak 65µs. Když Ti bude stačit nižší rozlišení (8bitů), lze A/D převodník taktovat až na 1MHz.

A/D převodník v ATMega16 není tak línej :)

Napsal: 20 bře 2017, 13:58
od agadirCZ44
tak není tak línej jen já se to musím naučit :) díky za rady :)

Napsal: 20 bře 2017, 14:12
od agadirCZ44
tak jsem zvedl taktovací frekvenci převodníku z 125kHz na 1Mhz a už to běží :) díky

Napsal: 20 bře 2017, 14:29
od FHonza
Jenom pak rozlišení je 8 bitů, ne 10. A jestli používáš režim "volný běh", tak nezapomeň, že změna kanálu v ADMUX má efekt až na třetí převod, ne na druhý. Docela sem se s tím natrápil :)

Napsal: 20 bře 2017, 14:33
od Atlan
Nechces pouzit toto MSGEQ7