Obsluha pøerušení na "nepøerušitelných" pinech
Moderátor: Moderátoři
Obsluha pøerušení na "nepøerušitelných" pinech
Ahoj. Pokouším se rozchodit snímání otáèek na http://www.robot-electronics.co.uk/htm/emg30.htm . Motorky mám dva. Otáèky "snímám" teï tím, že se kontroluje stav daného pinu, což je ale kravina, protože když je 3 cykly za sebou log0 a pak log1 hází to docela zajímavá èísla. Potøeboval bych od daného vstupu vyvolat pøerušení aby to mìøení mìlo cenu. Problém je, že budu potøebovat celkem 4 vstupy pro dva motorky a mùj mcu atmega16 má jen "pøerušitelné" INT0 a INT1. Jak tohle vyøešit?
Tak se mi to podaøilo èásteènì vyøešit pomocí:
Ale takhle nepoznám smìr otáèení.
Kód: Vybrat vše
if (bit_is_set(PIND, PD3) && bit_is_set(PIND, PD6) && ! speedLcounted) {
speedL1++;
speedLcounted = 1;
}
if (((bit_is_set(PIND, PD3) && ! bit_is_set(PIND, PD6)) || (! bit_is_set(PIND, PD3) && bit_is_set(PIND, PD6))) && speedLcounted) {
speedLcounted = 0;
}
Vyøešeno:
Teï to dám asi do pøerušení nìjakýho timeru, aby se to spouštìlo "na èas" a mìlo by být po problému. Nebo je tam ještì nìjaká zádrhel? Ještì mì ale pøekvapuje jedna vìc. Enkodér by mìl dávat 360 pulsù/otáèku høídele, ale já dosahuju jen 290pulsù pøi pwm 255.
Kód: Vybrat vše
if (bit_is_set(PIND, PD3) && bit_is_set(PIND, PD6) && ! speedLcounted) {
speedL1++;
speedLcounted = 1;
if (!speedLdirTest) speedLdir = 0; else speedLdir = 1;
}
if ((bit_is_set(PIND, PD3) && ! bit_is_set(PIND, PD6)) && speedLcounted) {
speedLcounted = 0;
speedLdirTest=0;
}
if ((! bit_is_set(PIND, PD3) && bit_is_set(PIND, PD6)) && speedLcounted) {
speedLcounted = 0;
speedLdirTest=1;
}
Co zkusit OR hradlo na vyvolání přeprušení od libovolného motoru a potom si hnedka šáhnout na jiný pin a tím poznat, kdo to byl?
Asi takto:
Vstupy od snímačů přivést na libovlné dva vstupní piny.
Přes OR hradlo přivést signál také na INT0.
Po přerušení okamžitě šáhnout na ty vstupní piny a tím poznat, kdo to byl.
Vrátit se do programu a zařídit se podle toho, kdo to byl.
Jinak OR hradlo se dá udělat pomocí dvou diod a jednoho odporu![Smile :-)](./images/smilies/icon_smile.gif)
Asi takto:
Vstupy od snímačů přivést na libovlné dva vstupní piny.
Přes OR hradlo přivést signál také na INT0.
Po přerušení okamžitě šáhnout na ty vstupní piny a tím poznat, kdo to byl.
Vrátit se do programu a zařídit se podle toho, kdo to byl.
Jinak OR hradlo se dá udělat pomocí dvou diod a jednoho odporu
![Smile :-)](./images/smilies/icon_smile.gif)
360 impulsů na 1 otáčku je pro účely měření rychlosti nesmyslně přesné rozlišení, to je spíš na polohování...
Směr otáčení se zjišťuje posloupností fází, proto jsou tam ty Hallovy sondy dvě. I když nevím, proč zjišťovat směr, když ten přece vyplývá ze zadaného napětí (polarity). Zjišťování směru by mělo význam jen při pasivním pohybu.
Ani otáčky bys nemusel zjišťovat, když budeš motor s enkodérem řídit jako "analogově krokový": motor dostane napětí a po potvrzení enkodérem, že tam dojel, "krok" skončí, příp. vykonává další. Po zastavení motoru výkonová logika motor zkratuje, takže nepřejede do další polohy. Vůbec nepotřebuje na pohon dozírat a MCU se může věnovat jiným věcem, třeba obsloužit nadproud motoru (robot jede do zdi nebo pohon namotal kočku)
Směr otáčení se zjišťuje posloupností fází, proto jsou tam ty Hallovy sondy dvě. I když nevím, proč zjišťovat směr, když ten přece vyplývá ze zadaného napětí (polarity). Zjišťování směru by mělo význam jen při pasivním pohybu.
Ani otáčky bys nemusel zjišťovat, když budeš motor s enkodérem řídit jako "analogově krokový": motor dostane napětí a po potvrzení enkodérem, že tam dojel, "krok" skončí, příp. vykonává další. Po zastavení motoru výkonová logika motor zkratuje, takže nepřejede do další polohy. Vůbec nepotřebuje na pohon dozírat a MCU se může věnovat jiným věcem, třeba obsloužit nadproud motoru (robot jede do zdi nebo pohon namotal kočku)