motor s encoderom
Moderátori: psichac, Moderátori
motor s encoderom
Zdravím
mám doma tento motorček https://www.pololu.com/product/2823 a chcel by som využívat na riadenie rýchlosti ten quadraturny enkoder na riadenie používam ATmega16 mám to vymyslene tak že kanál A privádzam na INT0 ktorý reaguje na nabežnu hranu a takto počítam impulzy takže využívam iba 1/4 všetkých možných impulzov zatial mi to stačí no neviem ako zistím smer, zatial to nechcem riešit programovo takže sa chcem spýtat nejaké zapojenie z klopných obvodov do ktorých ktorých by som priádzal signály A a B a zistil z nich smer otáčania ?
mám doma tento motorček https://www.pololu.com/product/2823 a chcel by som využívat na riadenie rýchlosti ten quadraturny enkoder na riadenie používam ATmega16 mám to vymyslene tak že kanál A privádzam na INT0 ktorý reaguje na nabežnu hranu a takto počítam impulzy takže využívam iba 1/4 všetkých možných impulzov zatial mi to stačí no neviem ako zistím smer, zatial to nechcem riešit programovo takže sa chcem spýtat nejaké zapojenie z klopných obvodov do ktorých ktorých by som priádzal signály A a B a zistil z nich smer otáčania ?
0
-
- Zaslúžilý člen
- Príspevky: 1375
- Dátum registrácie: 22 Jan 2012, 19:24
- Bydlisko: Nové Mesto nad Váhom
- Vek: 43
Re: motor s encoderom
Pri preruseni pozri stav kanala B a ak je true,tak je jeden smer,ak je false,tak smer druhy.
B-kanal nepotrebuje pin,na ktorom funguje prerusenie,kludne aj na analogu.
B-kanal nepotrebuje pin,na ktorom funguje prerusenie,kludne aj na analogu.
0
- otep69
- Stály člen
- Príspevky: 208
- Dátum registrácie: 31 Okt 2008, 00:00
- Bydlisko: Jarok
- Vek: 35
- Kontaktovať používateľa:
Re: motor s encoderom
Dokonca na to nepotrebujes ani vyuzivat prerusenie.
Princip:
Taketo nieco mozes mat niekde v programe bez toho aby si vyuzival prerusenia.
P.S. tento kod reaguje na kazdu druhu zmenu hodnoty (kazde druhe "kliknutie" enkodera. Riesil som to s manualnym rotacnym enkoderom, ale princip je ten isty.
Princip:
Kód: Vybrať všetko
stav = 0;
if (bit_is_set(PINC, PC0)) //skontroluje ci na pine PC0 je HIGH
stav |= (1 << 1); //ak hej zapise to na 1 poziciu v premennej stav
if (bit_is_set(PINC, PC1)) //skontroluje ci na pine PC1 je HIGH
stav |= (1 << 0); //ak hej zapise to na 0 poziciu v premennej stav
if (stav != prev_stav) //vyhodnoti ci sa zmenil stav enkodera od poslednej kontroly ak sa nerovnaju vyhodnoti ktorym smerom sa pohol
{
if (((stav == 1) & (prev_stav == 2)) || ((stav == 0) & (prev_stav == 3)))
{
//jeden smer
}
else
if (((stav == 3) & (prev_stav == 0)) || ((stav == 2) & (prev_stav == 1)))
{
//opacny smer
}
prev_stav = stav;
P.S. tento kod reaguje na kazdu druhu zmenu hodnoty (kazde druhe "kliknutie" enkodera. Riesil som to s manualnym rotacnym enkoderom, ale princip je ten isty.
0
Teší ma Peter.
F*ck me I am Famous ...
Čo nejde silou, pôjde silou ešte väčšou.
F*ck me I am Famous ...
Čo nejde silou, pôjde silou ešte väčšou.
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: motor s encoderom
S tým sw detekovaním to nie je také jednoduché ako to vyzerá. Musí sa to urobiť dobre. Riešenie od otep69 urobené dobre nie je.
Ak medzi tými dvomi ifmi nastane prerušenie tak uplynie nejaká doba ktorá je daná najhoršou možnou dobou obsluhy. Navyše sa môžu zreťaziť viaceré prerušenia a tak sa doba ešte predĺži. V uvedenom prípade už obsluhy okolo 2μs môžu robiť problémy. (1/(11000*16)=5,6μs)
V takom prípade si ten kód ľahko môže občas prečítať úroveň zodpovedajúcej opačným otáčkam.
V prípade obsluhy s prerušením je to to isté ak sa bude postupovať podľa toho čo písal Tomas. Tiež nie je zaručené že prerušenie sa začne obsluhovať do tých 2μs.
Sw protiopatrenie je vcelku jednoduché, ale v prvom rade si musíte to nebezpečenstvo uvedomiť. A potom aj správne obabrať.
Kód: Vybrať všetko
if (bit_is_set(PINC, PC0)) //skontroluje ci na pine PC0 je HIGH
stav |= (1 << 1); //ak hej zapise to na 1 poziciu v premennej stav
if (bit_is_set(PINC, PC1)) //skontroluje ci na pine PC1 je HIGH
stav |= (1 << 0);
V takom prípade si ten kód ľahko môže občas prečítať úroveň zodpovedajúcej opačným otáčkam.
V prípade obsluhy s prerušením je to to isté ak sa bude postupovať podľa toho čo písal Tomas. Tiež nie je zaručené že prerušenie sa začne obsluhovať do tých 2μs.
Sw protiopatrenie je vcelku jednoduché, ale v prvom rade si musíte to nebezpečenstvo uvedomiť. A potom aj správne obabrať.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
Re: motor s encoderom
no a preto by som to chcel skusit vymysliet cez tie klopne obvody lebo neviem či to može robit v tom najhoršom prípade že sa zretazia prerušenia šarapatu este dodám na atmega ide na 16Mhz este doplním že využívam tam viac prerušení takže, s tým atmegou chcem ovládat 2 taketo motry takže INT0 jeden motor encoder INT1 druhy encoder ,potom časovač 0 mi inkremetuje každu 1ms počitadlo ak dopočíta do 100 , čiže každých 100ms sa vypočítavaju regulatory a nastavenie PWM, samozrejme tam mam komunikaciu s UART kde vysielam hodnoty premenných na zobrazenie ako mi to reguluje, planujem taktiež rozchodit tam I2C a taktiež časovač 1 čo robi PWMky motorom skušam pri pretečení ADCčkom merat prúdy v motoroch ( fázovo korektnáPWM)
0
Re: motor s encoderom
no neviete mi poradit aj s tým hardverovým riešením ? lebo ak chcem vužit všetky impulzy a dam tam XOR tak mi je to zistovanie softverom na hodnotu kanalu B nanič preto to chcem s klopnými obvodami skusit ?nasiel som take dačo čo si o tom myslíte ? http://www.picbasic.co.uk/forum/showthread.php?t=12911
0
Re: motor s encoderom
no obvod som odskušal a pri malých rychlostiach to funguje no pri väčších už to blbne može to byt spôsbene veľkou kapacitou tam kde je pulse generator ?
0
Re: motor s encoderom
Nie je mi jasne aká je výhoda tohto riešenia okrem toho že to ma debouncer ? Veď pomocou mikropočítača je aj tak potrebne spracovávať dva signály síce trochu inak ale predsa
0
Re: motor s encoderom
dobre už som to poriešil tým spôsobom že v prerušení snímam kanal B a určím smer funguje mi to spolahlivo tak už to neriešim aj ked využívam len 1/4 všetkych možných inpulzov už to necham tak hlavne že mi to spolahlivo funguje
0
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: motor s encoderom
tiež by som to riešil cez sw. Môžem vidieť riešenie?
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
Re: motor s encoderom
ISR(INT0_vect){
pocitadlo1++;//inkrementovanie premennej na otačkovy sensor
if((PINC & (1<<PC5))==0){
smer1=1;
}
else{
smer1=0;
}
}
pocitadlo1++;//inkrementovanie premennej na otačkovy sensor
if((PINC & (1<<PC5))==0){
smer1=1;
}
else{
smer1=0;
}
}
0
Re: motor s encoderom
Ideální je použití MCU, který umí IRC dekódovat hardwarově sám, ušetří to dost hw kolem. Takový HW dekodér, který je ovšem ve skutečnosti stejně jen konfigurace hradlového pole v tom MCU je třeba toto: http://www.cypress.com/documentation/co ... er-quaddec Reaguje na každou hranu a nehrozí ztráta impulsů. Pouze při přetečení counteru impulsů je třeba toto ošetřit SW, ale na to je spoustu času až do dalšího přetečení counteru.
0
-
- Podobné témy
- Odpovedí
- Zobrazení
- Posledný príspevok
-
- 22 Odpovedí
- 2088 Zobrazení
-
Posledný príspevok od používateľa romiadam
-
- 18 Odpovedí
- 6925 Zobrazení
-
Posledný príspevok od používateľa AdamVarga
-
- 2 Odpovedí
- 573 Zobrazení
-
Posledný príspevok od používateľa enigma
-
- 18 Odpovedí
- 1971 Zobrazení
-
Posledný príspevok od používateľa cs001
-
- 16 Odpovedí
- 1796 Zobrazení
-
Posledný príspevok od používateľa Amaterr