semih_s
Hobici
- Katılım
- 16 Aralık 2020
- Mesajlar
- 1,980
@Gokrtl , senin konuna gönderdiğim kod debounce yapıyordu ve delay içermiyordu. kodda bir sorun mu vardı? encoder pozisyonunu yazdırmayan bir versiyonunu ekliyorum.
Bu encoderdeki bounce sorununu kondansatörün çözmemesinin sebebinin birbirine sürterek çalışan kontaklardan kaynaklandığını düşünüyorum kontaklar sürtmeye devam ettikçe encoder içindeki toz vb. maddeler makul debounce süresinden daha uzun sürede tekrar kontak yapıyor olmalılar diye düşünüyorum.
Bu kodla ilgili sorun var mıdır? Ben de yakın zamanda başladım encoder kullanmaya, öğrenmekte olan biri olarak soruyorum...
Kod:
#define ENCDEBUG
#define YON_AC 1 // 1 veya -1 enkoderin artış yönü tayini için
#define encA 2
#define encB 3
int konum,artis,k,enc,enc1,adimBayrak;
int encoder(void);
void setup() {
Serial.begin(115200);
attachInterrupt(digitalPinToInterrupt(encA), encoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(encB), encoder, CHANGE);
pinMode(encA,INPUT_PULLUP);
pinMode(encB,INPUT_PULLUP);
// encoder başlangıç durumu
enc = digitalRead(encB) + (digitalRead(encA) << 1);
enc1=enc;
Serial.println("start");
sei();
}
void loop() {
}
int encoder(void)
{
// encoder durumunu binary olarak enc değişkenine atama
enc = digitalRead(encB) + (digitalRead(encA) << 1);
if (enc1 != enc) // encoder değişmişse işlem yap
{
switch (enc1)// son okunan encoder değerine göre işlem yap
{
case 0b00:
adimBayrak=1; // debounce için bayrak değişken
break;
case 0b01:
switch (enc)
{
case 0b11:
if(adimBayrak)
{
// Azalış yönüne yazılacak kod.
konum-=YON_AC ;
adimBayrak=0;
#ifdef ENCDEBUG
Serial.println(konum);// metin yazdırmıyorum gecikmeye sebep olmamak için
#endif
}
break;
default:
break;
}
break;
case 0b10:
switch (enc)
{
case 0b11:
if(adimBayrak)
{
// atış yönüne yazılacak kod
konum+=YON_AC ;
adimBayrak=0;
#ifdef ENCDEBUG
Serial.println(konum);// metin yazdırmıyorum gecikmeye sebep olmamak için
#endif
}
break;
default:
break;
}
break;
default:
enc1 = enc;
break;
}
enc1 = enc;
//Serial.print("enc: ");Serial.println(enc,BIN);
}
//return enc;
//return artis;
return konum;
}
Bu encoderdeki bounce sorununu kondansatörün çözmemesinin sebebinin birbirine sürterek çalışan kontaklardan kaynaklandığını düşünüyorum kontaklar sürtmeye devam ettikçe encoder içindeki toz vb. maddeler makul debounce süresinden daha uzun sürede tekrar kontak yapıyor olmalılar diye düşünüyorum.
Bu kodla ilgili sorun var mıdır? Ben de yakın zamanda başladım encoder kullanmaya, öğrenmekte olan biri olarak soruyorum...