Tegin Arduino Unoga väikest projekti. See hõlmas katkestusi, kuna kasutan koodereid, et mõõta, kui palju diferentsiaalrataste süsteem edasi liigub. Minu robot liigub ainult edasi. Nii et ma kasutan igast kooderist ainult ühte kanalit. Siin on minu kaks katkestamise rutiini:
ISR (INT0_vect) {encoderRPos = encoderRPos + 1; } ISR (INT1_vect) {encoderLPos = encoderLPos + 1;}
Muutujad encoderRPos
ja encoderLPos
on tüüpi kõikuvad int
. Saan aru, et muutujad, mis läbivad muutusi mis tahes katkestusrutiinis, peavad olema tüübilt kõikuvad. Selle eesmärk on hoiatada neid muutujaid kasutavaid koodi teisi osi, et see võib igal ajal muutuda.
Kuid minu koodis toimunu oli natuke kummaline ja ma ei suutnud seda seletada. Vasakpoolse ratta abil liigutatud kauguse arvutamiseks toimige järgmiselt.
#define distancePerCount 0.056196868 float SR = distancePerCount * (encoderRPos - encoderRPosPrev); ujuk SL = distancePerCount * (kooderLPos - kooderLPosPrev); kooderRPosPrev = kooderRPos; encoderLPosPrev = encoderLPos;
Kuid kui jadamonitorile printin järgmise, märkan kõrvalekaldeid:
Kui vaadata kolmandat veergu, on (SL) selle väärtus mõnda aega liiga kõrge. See häirib kõiki minu arvutusi.
Ainus vihje, mille saan, kui võtan saadud SL väärtuse (3682), mis on alati konstant, ja arvutan tagasi (encodeLPos - encoderLPosPrev)
, Saan 65519,66, mis on lähedal unsigned int
maksimaalsele väärtusele. Mis tähendab, et (encoderLPos - encoderLPosPrev)
põhjustab ülevoolu, samas kui mõlemad väärtused, mille erinevus võetakse, on ainult kuskil 5000!
Ja mul õnnestus see lahendada. See oli õnneks. Nii muutsin koodi:
static int encoderRPosPrev = 0; staatiline int kodeerijaLPosPrev = 0; int diffL = (kooderLPos - kooderLPosPrev);
int diffR = (kooderRPos - kooderRPosPrev); ujuk SR = distancePerCount * diffR; ujuk SL = distancePerCount * diffL; kooderRPosPrev = kooderRPos; encoderLPosPrev = encoderLPos;
Ma ei saa juhtunust aru. Kas lenduvate muutujate kohta oleksin midagi teada pidanud?
Värskenda: siin on kogu kood, kui soovite kunagi pilgu heita. Ja see töötab väga hästi pärast selle muutmist vastuvõetud vastuses pakutuks.