Riadenie DC motorčeka a PSD regulátor (AVR)

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
dodik
Příspěvky: 198
Registrován: 26 lis 2008, 00:00

Riadenie DC motorčeka a PSD regulátor (AVR)

#1 Příspěvek od dodik »

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
Uživatelský avatar
nick-1992
Příspěvky: 114
Registrován: 22 led 2014, 00:00
Bydliště: Rýmařov

#2 Příspěvek od nick-1992 »

Na tohle by byl vhodnější krokový motor
Uživatelský avatar
dodik
Příspěvky: 198
Registrován: 26 lis 2008, 00:00

#3 Příspěvek od dodik »

Nemám k dispozícii krokovy motor s dostatočným výkonom.
Uživatelský avatar
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"

#4 Příspěvek od Ivan_Ryger »

na snímanie polohy si tam radšej dajte optický enkóder, indukčný snímač alebo niečo podobné. Je to oveľa vhodnejšie.

Ivan
Uživatelský avatar
dodik
Příspěvky: 198
Registrován: 26 lis 2008, 00:00

#5 Příspěvek od dodik »

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

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.

Obrázek
Uživatelský avatar
popopepe
Příspěvky: 553
Registrován: 26 říj 2005, 00:00

#6 Příspěvek od popopepe »

Musíš snímat (ideálně přes dvě různá přerušení) každou vzestupnou i sestupnou hranu z obou kanálů, tudíž 4 x víc než normálně.
Uživatelský avatar
dodik
Příspěvky: 198
Registrován: 26 lis 2008, 00:00

#7 Příspěvek od dodik »

.... 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í :wink: Idem sa s tým potrápiť :idea:
Přílohy
Enkoder.pdf
enkoder
(131.53 KiB) Staženo 177 x
Uživatelský avatar
dodik
Příspěvky: 198
Registrován: 26 lis 2008, 00:00

#8 Příspěvek od dodik »

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.

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.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“