Arduino Uno ile küçük bir proje yapıyordum. Diferansiyel tekerlek sisteminin ne kadar ileri gittiğini ölçmek için kodlayıcıları kullandığım için kesintiler içeriyordu. Robotum yalnızca ileri doğru hareket ediyor. Bu yüzden her kodlayıcıdan yalnızca tek bir kanal kullanıyorum. İşte iki kesme rutinim:
ISR (INT0_vect) {encoderRPos = encoderRPos + 1; } ISR (INT1_vect) {encoderLPos = encoderLPos + 1;}
encoderRPos
ve encoderLPos
değişkenleri uçucu tiptedir int
. Herhangi bir kesme rutininde değişime uğrayan değişkenlerin uçucu tipte olması gerektiğini anlıyorum. Bu, kodun bu değişkenleri kullanan diğer bölümlerini her an değişebileceği konusunda uyarmak içindir.
Ancak kodumda olanlar biraz tuhaftı ve bunu açıklayamadım. Sol tekerleğin hareket ettiği mesafeyi şu şekilde hesaplıyorum:
#define distancePerCount 0.056196868 float SR = distancePerCount * (encoderRPos - encoderRPosPrev); float SL = distancePerCount * (encoderLPos - encoderLPosPrev); encoderRPosPrev = encoderRPos; encoderLPosPrev = encoderLPos;
Ancak aşağıdakini seri monitörümde yazdırdığımda bir anormallik fark ediyorum:
Üçüncü sütuna bakarsanız, (SL) değeri bir süreliğine çok yüksek. Bu tüm hesaplarımı altüst ediyor.
Aldığım SL'nin değerini (3682) alırsam elde edebileceğim tek ipucu, ki bu her zaman sabittir ve geri hesaplar (encodeLPos - encoderLPosPrev)
unsigned int
'in maksimum değerine yakın olan 65519.66 değerini alacağım. Bu da (encoderLPos - encoderLPosPrev)
'nin bir taşmaya neden olduğu ve farkı alınan değerlerin ikisi de sadece 5000 civarında olduğu anlamına geliyor!
Ve ben bunu çözmeyi başardım. Şans eseri oldu. Kodu şu şekilde değiştirdim:
static int encoderRPosPrev = 0; statik int kodlayıcıLPosPrev = 0; int diffL = (encoderLPos - encoderLPosPrev);
int diffR = (encoderRPos - encoderRPosPrev); float SR = distancePerCount * diffR; float SL = distancePerCount * diffL; encoderRPosPrev = encoderRPos; encoderLPosPrev = encoderLPos;
Ne olduğunu anlayamıyorum. Uçucu değişkenlerle ilgili bilmem gereken bir şey var mı?
Güncelleme: Bir göz atmak isterseniz, kodun tamamı burada. Ve kabul edilen yanıtta önerilen şeye değiştirdikten sonra da çok iyi çalışıyor.