Rychlost Arduina

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Rychlost Arduina

Příspěvek od Ludek » 23 led 2021, 10:43

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í?

Uživatelský avatar
Caster
Příspěvky: 380
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: Rychlost Arduina

Příspěvek od Caster » 23 led 2021, 10:57

Těch 50 kHz by měl ADC zvládnout v pohodě. Podívej se an článek ATmega ADC.

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Rychlost Arduina

Příspěvek od Ludek » 23 led 2021, 13:01

Jo jo, vidím, ale nedokážu napsat kod, abych to vyzkoušel... :-(

Uživatelský avatar
Caster
Příspěvky: 380
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: Rychlost Arduina

Příspěvek od Caster » 23 led 2021, 14:29

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

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Rychlost Arduina

Příspěvek od Ludek » 23 led 2021, 19:16

Paráda, díky. Zkusím se s tím poprat.

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Rychlost Arduina

Příspěvek od Ludek » 24 led 2021, 15:11

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?

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Rychlost Arduina

Příspěvek od ondraN » 24 led 2021, 16:15

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

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Rychlost Arduina

Příspěvek od Ludek » 24 led 2021, 19:29

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 :-)

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Rychlost Arduina

Příspěvek od ondraN » 24 led 2021, 20:33

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.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Rychlost Arduina

Příspěvek od ondraN » 24 led 2021, 21:10

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.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 11 hostů