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

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
agadirCZ44
Příspěvky: 17
Registrován: 05 led 2015, 01:00

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

#1 Příspěvek 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 :)

Uživatelský avatar
ZdenekHQ
Administrátor
Administrátor
Příspěvky: 25593
Registrován: 21 črc 2006, 02:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#2 Příspěvek 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.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]

Uživatelský avatar
agadirCZ44
Příspěvky: 17
Registrován: 05 led 2015, 01:00

#3 Příspěvek od agadirCZ44 »

jo pardon myslím ATMEGA16A

Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 01:00

#4 Příspěvek 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
Naposledy upravil(a) frpr666 dne 14 bře 2017, 17:20, celkem upraveno 1 x.

Uživatelský avatar
Atlan
Příspěvky: 4499
Registrován: 10 kvě 2004, 02:00
Bydliště: Košice

#5 Příspěvek od Atlan »

Po prepnuti vstupu je nutne chvilku pockat a az tak spustit prevod, vid datasheet.

Uživatelský avatar
agadirCZ44
Příspěvky: 17
Registrován: 05 led 2015, 01:00

#6 Příspěvek 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 ?

Uživatelský avatar
ZdenekHQ
Administrátor
Administrátor
Příspěvky: 25593
Registrován: 21 črc 2006, 02:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#7 Příspěvek 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í.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#8 Příspěvek 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 :)

Uživatelský avatar
agadirCZ44
Příspěvky: 17
Registrován: 05 led 2015, 01:00

#9 Příspěvek od agadirCZ44 »

tak není tak línej jen já se to musím naučit :) díky za rady :)

Uživatelský avatar
agadirCZ44
Příspěvky: 17
Registrován: 05 led 2015, 01:00

#10 Příspěvek od agadirCZ44 »

tak jsem zvedl taktovací frekvenci převodníku z 125kHz na 1Mhz a už to běží :) díky

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#11 Příspěvek 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 :)

Uživatelský avatar
Atlan
Příspěvky: 4499
Registrován: 10 kvě 2004, 02:00
Bydliště: Košice

#12 Příspěvek od Atlan »

Nechces pouzit toto MSGEQ7

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“