Stránka 1 z 2

Rychlost Arduina

Napsal: 23 led 2021, 10:43
od Ludek
Zdravím, jen dotaz.
Chtěl jsem udělat generátor (plus mínus) 50kHz a pomocí anaogového vstupu měnit střídu,
resp. pouze dobu pulzu HIGH. Pulz LOW nechat konstantní. A ejhle ono to čte analog pin pomalu :-(
Je nějaké řešení?

Re: Rychlost Arduina

Napsal: 23 led 2021, 10:57
od Caster
Těch 50 kHz by měl ADC zvládnout v pohodě. Podívej se an článek ATmega ADC.

Re: Rychlost Arduina

Napsal: 23 led 2021, 13:01
od Ludek
Jo jo, vidím, ale nedokážu napsat kod, abych to vyzkoušel... :-(

Re: Rychlost Arduina

Napsal: 23 led 2021, 14:29
od Caster
Budeš muset ovládat přímo registry, jak na to v článku "How to make an Arduino fast enough to...". Dosáhneš rychlosti vzorkování až 166 kHz ;) .

Re: Rychlost Arduina

Napsal: 23 led 2021, 19:16
od Ludek
Paráda, díky. Zkusím se s tím poprat.

Re: Rychlost Arduina

Napsal: 24 led 2021, 15:11
od Ludek
Tak to šlape, ale jsem úplný neznalec :-(
je tam rada :
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
sbi (ADCSRA, ADPS2);
cbi (ADCSRA, ADPS1);
cbi (ADCSRA, ADPS0);

a podle tabulky je to nastaveno dělení na 16, Jak to změnit třeba na děleno 8?

Re: Rychlost Arduina

Napsal: 24 led 2021, 16:15
od ondraN
To jsou dvě makra, jedno pro nastavení libovolného bitu v byte (sbi) a druné pro shození libovolného bitu v byte (cbi).
Pokud chceš byte vydělit 8, tak musíš použít logický shift. Posun vpravo o jedno místo dělí dvěma, o dvě místa dělí čtyřmi, o tři místa dělí osmi a tak dál. Posun vlevo zase násobí o 2,4,8,16 ...

Kód: Vybrat vše

byte	value=16;
value=value>>3; //identicke jako value/8 ale rychleji
value=value<<3; //identicke jako value*8 ale rychleji
Jde to i pro unsigned int nebo unsigned long a je treba dat bacha na preteceni

Kód: Vybrat vše

byte	value=128;
value=value<<1; //uz nebude 256, ale 0, protoze pretece posledni bit

Re: Rychlost Arduina

Napsal: 24 led 2021, 19:29
od Ludek
Ondro, to chápu,
ale já dal do setupu jen to co jsem napsal a nikde nevidím žádné číslo, které mám změnit...
Ty uvádíš byte a value a já ho tam nikde nemám :-)

Re: Rychlost Arduina

Napsal: 24 led 2021, 20:33
od ondraN
Podívej se do datasheetu ATMega328P na stránku 208. Možná ti to pak už bude jasnější. Z tvojí otázky jsem nepochopil na co se vlastně ptáš. Bity ADSPx určují, jaká frekvence z předděliče bude přivedena na převodník.

Re: Rychlost Arduina

Napsal: 24 led 2021, 21:10
od ondraN
Na straně 219 toho manuálu je nastavení předděliče. To jak máš v ukázce kódu je nastavení f/16. Pro f/8 to musí být takhle

Kód: Vybrat vše

cbi (ADCSRA, ADPS2);
sbi (ADCSRA, ADPS1);
sbi (ADCSRA, ADPS0);
To nastaví v registru ADCSRA bity ADSP0=1, ADSP1=1, ADSP2=0.
Akorát si dej pozor, ať nepřekročíš max. frekvenci 200kHz pro plné rozlišení. Při nastavení děliče 16 a frekvenci arduina 16MHz jseš na 1MHz a přesnost měření už rozhodně není 10 bitů, ale tak spíš 4-5bitů.
Ještě pro upřesnění, jedno měření trvá 13 cyklů, takže frekvence měření je 13x nižší než frekvence pro AD převodník.