Zaslal: po květen 15 2023, 20:36 Předmět: Zákmity na rotačním encoderu
Zdravím, řeším takový problém,
mám zařízení viz foto:
Jedná se o laserový efekt stavěný z toho, co bylo doma.
Pomocí encoderu chci sledovat polohu paprsku.
Zatím chci pouze čítat pulzy a po každém otočení - to jest 16 náběžných hran, je chci vynulovat.
Bohužel program nefunguje. i pokud je proměnná tik > 16 tak stále jede dále.
Představa je cca 2000 RPM - aby byl paprsek stabilní a neblikal. To je cca 530 impulzů za sekundu.
mezní frekvence je cca 10 kHz, takže tady by problém být neměl.
Nejsem si jistý kvalitou vstupního signálu, ale i kdyby to byly zákmity, tak by je to mělu nulovat správně.
Zde je blok kódu, který nefunguje.
kód:
int interruptPin = 2;
int tik = 0;
void setup()
{
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), blik, FALLING);
Serial.begin(9600);
}
void blik()
{
tik ++;
Serial.println(tik);
return tik;
}
void loop()
{
if (tik > 16) {
tik = 0;
Serial.println(tik);}
}
Ladíš program na správné (stejné) desce, jako je nastavena v IDE?
A co znamená: "Jede dále" ? Proč by neměl?
Vždyť nevoláš "DetachInterrupt"
Ještě zruš Serial.print uvnitř void blik().
Zaveď si proměnnou byte tisk=0;
Uvnitř void blik()
{ tik++; //pripocti
tisk=1; //nastav tisk
}
Do loop pak přidej
If (tisk ==1) //došlo ke změně
{Serial.println(tik); //vypiš kolik je tik
tisk=0; //jen jednou
}
If(tik >16) // víc jak 16?
{
tik = 0; //vynuluj
}
2chromnikl: Taky by chtělo vědět co je to za enkodér (foto nějak chybí), to máš nějaký optický s tvarovačem výstupních impulsů, nebo mechanický (když jsi vlákno nazval tak, jak jsi ho nazval…)?
A ještě drobný detail, když máš v interruptu komunikaci po serialu rychlostí 9600bd, tak ho určitě nevypíšeš 530x za vteřinu (s tím, co se pak ještě děje v pc), to z toho inrerruptu časově skoro nevylezeš … zvýšil bych té lince rychlost.
Tohle ale není enkodér, to co jsi vytvořil je ekvivalent inkrementu. Dej odkaz na ten čínský modul, nějakou elektroniku tam vidím, nemůžeme říci jistě že tvarování impulsu tam není ošetřené. Jak jsi vlastně vydedukoval, že tě trápí zrovna zákmity? Osciloskopem?
To že máš sériovou linku jen pro ladění na věci nic nemění, jde o to že je potřeba si uvědomovat souvislosti a dělat věci pořádně (používat to správným způsobem). Přerušovací rutiny mají obecně být co nejkratší, a tvá tráví ~50 % celkového procesorového času na jednom jediném řádku (a přitom stačí jen zvýšit rychlost linky). A nebo jinak, v interruptu přeci vůbec nepotřebuješ dělat nějaký výpis, nech tam jenom
kód:
tik++
, jestli se to napočítá přeci vidíš v hlavní smyčce (a nebo si dej na nějaký pin ledku a ovládej ji místo té linky, pokud to chceš vidět).
Naposledy upravil Mahoney dne út květen 16 2023, 8:52, celkově upraveno 1 krát.
Založen: Apr 02, 2011 Příspěvky: 18544 Bydliště: Nový Bydžov
Zaslal: út květen 16 2023, 8:52 Předmět:
Já bych do toho zatím přerušení netahal nožná ani nebude potřeba. Udělej si jednoduchej prográmek kterej čte signál z toho optickýho incrementu. A jen bych to co vstoupí do Arduina hned poslal na jinej port a kouknul na to osciloskopem jak na vstupním portu, tak na výstupním jestli tam jsou nějaký zákmity či ne. A zároveň tak můžeš vyzkoušet, kolik otáček to zvládne snímat.
U mechanickýho n-codéru s dvouma kontaktama se s tvarováním moc nemažou, dávají se pouze dvě keramiky 10N proti zemi. Když s ním něco ladím, i bez těch kondíků to krokuje správně. Ale používám knihovnu rotary.h. Moc jsem nezkoumal, jestli a jak tam mají zákmity ošetřený. _________________ Jirka
@chromnikl
funkce Serial.print je "pomalá" ve srovnání s rychlostí 530 impulzů /s. Tvůj program ti nebude vypisovat správně proměnnou tik. A už vůbec nevolej Serial.print uvnitř přerušení !
Nevím co má program dělat, co má být výsledná hodnota?
Zatím jenom zkouší napočítat těch 16 otvorů, co má na tom 3D printed kole, ale jelikož mu tam stejně chybí alespoň kontrolní otvor na celou otáčku + čidlo, nebo něco na těch rotujících zrcátkách, tak to stejně nebude mít jak zkontrolovat (teoreticky by mohl mít hallovu sondu na té desce motoru zespodu, ale nevím). To by ale nevadilo, mě by spíš zajímalo jak vydedukoval, že má na optickém čidle zákmity.
Neříkej tomu zákmity, zákmity mohou mít jen mechanické kontakty (myslel jsem, že ti to dojde). Jsou to nejspíš odrazy, máš to kolo lesklé a otvory nejsou rovnoměrné, projeď je jehlovým pilníkem abys je zarovnal, a plochy těch kol polep něčím matným (nebo nastříkej matnou černou barvou ze spreje, ale aby ti chytla na plast, musíš předtím ještě použít primer na plasty). Další věc je, že když máš snímání optozávorou, tak i když je infračervená, musíš ji zastínit od okolního osvětlení, může reagovat na něco zvnějšku. Další věc je stínění vedení se signálem od závory, máš dole pod tím motor a ten má cívky a magnety (motor z CD/DVD ROM je oběžka, takže rotují magnety), obyčejný drát taky může něco pochytat, je to v podstatě anténa a ten Atmel vedle má na vstupech poměrně velký vstupní odpor, je to CMOS obvod, takže ti to klidně může sejmout taky.
Ak dochádza k falošným odpalom, možno by to šlo spraviť i softwarovo, ale nebude to rýchle... Vyskúšaj nasledovné - toto čaká min. 1ms od odpalu. Ak to bude až príliš hluché a pomalé, zmeň tú tisícku na niečo menšie; ak to stačiť nebude, tak ju zvýš.
Kód počíta s tým, že je pin 2 prizemňovaný, skús ten inkrement zapojiť tak. Ak to nie je možné, nahraď INPUT_PULLUP na INPUT, FALLING na RISING a "== LOW" na "== HIGH".
@nixdorf
zajímavé minimalistické řešení, ale pozor na micros() je zde jedno nebezpečí:
1/ Pokud přijde přerušení blink() v době, kdy bude hodnota micros() blízko přetečnení např. N=(0xFFFFFFFF - 800);
2/ potom výraz (micros() > us_tick + 1000) bude okamžitě pravdivý, tj. ( N> (0xFFFFFFFF-800) + 1000), tj. (N>200);
Řešení: závorka "sčítání", by se měla nahradit "odečítáním"
// původně
(micros() > us_tick + 1000)
// nově
(micros()- us_tick > +1000)
Časy uváděny v GMT + 1 hodina Jdi na stránku 1, 2Další
Strana 1 z 2
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.