Rychlost Arduina
Rychlost Arduina
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í?
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
Těch 50 kHz by měl ADC zvládnout v pohodě. Podívej se an článek ATmega ADC.
Re: Rychlost Arduina
Jo jo, vidím, ale nedokážu napsat kod, abych to vyzkoušel...
Re: Rychlost Arduina
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
Paráda, díky. Zkusím se s tím poprat.
Re: Rychlost Arduina
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?
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
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 ...
Jde to i pro unsigned int nebo unsigned long a je treba dat bacha na preteceni
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
Kód: Vybrat vše
byte value=128;
value=value<<1; //uz nebude 256, ale 0, protoze pretece posledni bit
Re: Rychlost Arduina
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
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
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
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
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.
Kód: Vybrat vše
cbi (ADCSRA, ADPS2);
sbi (ADCSRA, ADPS1);
sbi (ADCSRA, ADPS0);
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.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 32 hostů