Riadenie DC motorčeka a PSD regulátor (AVR)
Moderátor: Moderátoři
Riadenie DC motorčeka a PSD regulátor (AVR)
Ahojte, mám jeden problém, chcel by som ovládať polohu ramena, ktoré je pripevnené na DC motorček s prevodovkou. Rameno by malo vykonávať pohyb v rozsahu 2∏ (rýchlosť je asi 1ot/min).
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
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: 1265
- Registrován: 02 bře 2005, 01:00
- Bydliště: Bratislava, Petrzalka
Sorry že tak neskoro. Objednal som enkóder z číny a konečne došiel. Má dve fázy, a 400imp/ot. Podľa datasheetu je možné získať 1600imp/ot. Zatiaľ to mám zapojené tak že jedna fáza je na INT2 a druhá je na klasický vstup.
V programe to vyzerá takto
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.
![Obrázek](http://www.qsl.net/p/pa3ckr/bascom%20and%20avr/interrupts/rotary-encoder.gif)
V programe to vyzerá takto
Kód: Vybrat vše
ISR(INT2_vect)
{
_delay_ms(1);
if (!(PINB & (1 << PB1)))
{
count++;
}
else count--;
}
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.
![Obrázek](http://www.qsl.net/p/pa3ckr/bascom%20and%20avr/interrupts/rotary-encoder.gif)
.... už som si niečo k tomu preštudoval, v prílohe je pdfko ako na snímače, je tam v podstate ten môj návrh a aj ten tvoj použitím dvoch ext. prerušení
Idem sa s tým potrápiť ![Idea :idea:](./images/smilies/icon_idea.gif)
![Wink :wink:](./images/smilies/icon_wink.gif)
![Idea :idea:](./images/smilies/icon_idea.gif)
- Přílohy
-
- Enkoder.pdf
- enkoder
- (131.53 KiB) Staženo 132 x
Tak sa mi to podarilo, mal som s tým zo začiatku problémy, lebo som mal na každej fáze (A, B) 100n kondenzátor pripojený na zem.
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.
Teraz sa idem pustiť do kódu PSD regulácie.
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--;
}
}