Riadenie DC motorčeka a PSD regulátor (AVR)
Moderátor: Moderátoři
Riadenie DC motorčeka a PSD regulátor (AVR)
Snímanie náklonu robím akcelerometrom. Avšak nedokáže dostatočne rýchlo spracovať informácie pri pohybe ramena.
Chcem sa spýtať či na to idem dobre, alebo mám tú metódu s akcelerometrom zahodiť a vymyslieť niečo iné? Ďakujem
- Ivan_Ryger
- Příspěvky: 1366
- Registrován: 02 bře 2005, 00:00
- Bydliště: Jára Cimrman- "Uppsala, Uppsala,... tam jsem taky nebyl"
V programe to vyzerá takto
Kód: Vybrat vše
ISR(INT2_vect)
{
_delay_ms(1);
if (!(PINB & (1 << PB1)))
{
count++;
}
else count--;
}Takto dokážem získať len 400imp/ot.
Neviem ako na 1600. Podľa obrázka dole ma napadá len to že by som vzorkoval každú 1ms, cez nejaký časovač, a v ňom by som najprv zisťoval či ide o rotáciu do ľava alebo do prava. Potom jednotlivé stavy kanálov.

- Přílohy
-
Enkoder.pdf- enkoder
- (131.53 KiB) Staženo 177 x
A, B mám na INT0, INT2 s pripojenými pull-up.
Vyvolanie prerušenia mám pri zmene logickej úrovne, a v prerušení je podmienka kde sa rozhodne log1 alebo log0.
Nastavenie prerušení. Premenná count počíta kroky z IRC.
Kód: Vybrat vše
EICRA |= (1 << ISC00) | (1 << ISC20);
EIMSK |= (1 << INT0) | (1 << INT2);Kód: Vybrat vše
ISR(INT2_vect)
{
if ((PINB & (1 << PB2)) != 0) // sestupna hrana B kanalu
{
if ((PIND & (1 << PD2)) == 0)
count++;
else
count--;
}
else // vzestupna hrana na B
{
if ((PIND & (1 << PD2)) == 0)
count--;
else
count++;
}
}Kód: Vybrat vše
ISR(INT0_vect)
{
if ((PIND & (1 << PD2)) != 0) // sestupna hrana A kanalu
{
if ((PINB & (1 << PB2)) == 0)
count--;
else
count++;
}
else // vzestupna hrana na A
{
if ((PINB & (1 << PB2)) == 0)
count++;
else
count--;
}
}Teraz sa idem pustiť do kódu PSD regulácie.