Arduino rpm meter sorunu

Başlatan 0M42, 03 Mart 2023, 11:18:05

0M42

Merhaba, aşağıdaki devreyi oluşturdum ır sensörün önünde sabit cisim varken 0rpm gösteriyor. Engeli kaldırdığımda yada motor yardımı ile senkronize döndürdüğümde rakam saçmalıyor sürekli değişiyor bazen - değer gösteriyor.

Bu sorunun üstesinden nasıl gelebilirim acaba?

#include<LiquidCrystal.h>
LiquidCrystal lcd(3,4,5,6,7,8);
float value=0;
float rev=0;
int rpm;
int oldtime=0;
int time;

void isr() //interrupt service routine
{
rev++;
}

void setup()
{
lcd.begin(16,2);                //initialize LCD
attachInterrupt(0,isr,RISING);  //attaching the interrupt
}

void loop()
{
delay(200);
detachInterrupt(0);           //detaches the interrupt
time=millis()-oldtime;        //finds the time 
rpm=(rev/time)*60000;         //calculates rpm
oldtime=millis();             //saves the current time
rev=0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("-AYNA HIZI RPM-");
lcd.setCursor(11,1);
if(rpm>9)lcd.setCursor(10,1);
if(rpm>90)lcd.setCursor(9,1);
if(rpm>900)lcd.setCursor(8,1);
if(rpm>9000)lcd.setCursor(7,1);
if(rpm>90000)lcd.setCursor(6,1);
if(rpm>900000)lcd.setCursor(5,1);
if(rpm>9000000)lcd.setCursor(4,1);
if(rpm>90000000)lcd.setCursor(3,1);
if(rpm>900000000)lcd.setCursor(2,1);
if(rpm>9000000000)lcd.setCursor(1,1);
if(rpm>90000000000)lcd.setCursor(0,1);
lcd.print( rpm);
lcd.print(" rpm");
lcd.print("   ");
attachInterrupt(0,isr,RISING);

}

***

0M42

Şöyle bir ekleme yapayım ır sensörü devreden çıkardım proximity sensör kullandım aynı sorun yine oldu. Hiç sensör kullanmazsam yani nanonun D2 pini boşta kalsa yine aynı sorun oluyor.
***

sezgin05

Sensör girişini bir dirençle pullup veya pulldown yapmayı deneyin

0M42

#3
Sezgin bey sensör girişi derken voltaj girişi mi yoksa ir ledi mi kastediyorsunuz? Sensörü devreden ayırsam yine aynı sorun oluyor sanki kod üzerinde değişiklik yapmak gerekiyor gibi.
***

mehmet

#4
Setup kısmının başına
pinMode(D2, INPUT_PULLUP);
satırını ekleyiniz.
Atmel mcularda öntanımlı pin durumu
çıkıştır. D2 giriş olarak tanımlanmalıdır.

Bir devirde kaç sinyal beklentiniz var?
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

0M42

Arduino konusunda yeniyim tecrübem yok yapmamı istediğiniz şu şekildemi acab

void setup()
{
pinMode(D2, INPUT_PULLUP);
lcd.begin(16,2);                //initialize LCD
attachInterrupt(0,isr,RISING);  //attaching the interrupt



Bir devirde iki sinyal yeterli olur herhalde henüz o kısmın mekaniğini yapmadım bir devirde sensörün önünden engel iki kez geçecek sanıyorum.
***

mehmet

#6
Çok düşük devirlerde iki sinyal yetmez.
Bazı durumlarda yüz sinyal bile
yetmiyor.
Yapacağınız işe göre düzenlemelisiniz.
Düşük devirde iki sinyal arasındaki zamanı
ölçmek daha uygun olur.
Yüksek devirlerde de belli süre içinde sinyal
saymak uygun olur.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

0M42

Bu devreyi mini tornanın ayna devrini ölçmek için kullanacağım. Ayna maksimum 2500 devir, minumum 200 devir dönüyor bu durumda nasıl bir düzenleme yapmalıyım peki
***

fide

Çamaşır makinesi motorunun devrini 5800'e kadar endüktif Omron sensörle ölçmüştüm. Endüktif sensörün IR sensöre göre kolay tarafı ölçmek istediğiniz mile eşit açılarla mıknatıs yapıtırınca devri istediğiniz katsayı ile ölçebiliyor olmanız. Diğer taraftan vida yapısında olması sebebiyle istenilen yere sabitlenmesi ve yaklaşıp uzaklaşması daha kolay. Bendeki sensör 144Hz yani yaklaşık 8500 sinyal/dk (tek mıknatıs için 8500 devir olarak da düşünebilirsiniz.) okuyordu.

Bence kodun farklı değerler göstermesindeki sebep delay(200) satırı. Bu satırın 200ms de bir tepki vereceği şüpheli. Ben olsam bu kısmı timer içinde sıfırlardım.

İki interrupt kurar birinde sizin yaptığınız gibi external kesme ile sayacı artırır diğerinde saniyede bir veya 2-3 defa timer kesme ile sayacı sıfırlardım. Eğer elinizde skop varsa son haneye kadar kesin okuma yapabilirsiniz.

Şahsen delay komutunun, işlemcinin boş olması durumunda artırım yaparak çalıştığını düşünüyorum. LCD yazma kısmında uzun yada kısa formatta rakam yazılması, bu rutin içinde bölme / floating işlem yapılması cycle bazında da olsa gecikmeye sebep olur. Bu da 200ms sürenin sapması yani 220ms belki 230ms arasında sürmesine sebep olabilir. Sonuçta loop içindeki her if şartı aynı koşullar altında gerçekleşmiyor.



Endüktif Sensör     
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

sezgin05

Alıntı yapılan: sezgin05 - 03 Mart 2023, 11:45:37Sensör girişini bir dirençle pullup veya pulldown yapmayı deneyin
Arduino sensör girişi(D2) pinini pullup yapınız. Yada yazılımsal olarak pullup yapabilirsiniz

0M42

#10
Alıntı yapılan: fide - 03 Mart 2023, 14:13:12Çamaşır makinesi motorunun devrini 5800'e kadar endüktif Omron sensörle ölçmüştüm. Endüktif sensörün IR sensöre göre kolay tarafı ölçmek istediğiniz mile eşit açılarla mıknatıs yapıtırınca devri istediğiniz katsayı ile ölçebiliyor olmanız. Diğer taraftan vida yapısında olması sebebiyle istenilen yere sabitlenmesi ve yaklaşıp uzaklaşması daha kolay. Bendeki sensör 144Hz yani yaklaşık 8500 sinyal/dk (tek mıknatıs için 8500 devir olarak da düşünebilirsiniz.) okuyordu.

Bence kodun farklı değerler göstermesindeki sebep delay(200) satırı. Bu satırın 200ms de bir tepki vereceği şüpheli. Ben olsam bu kısmı timer içinde sıfırlardım.

İki interrupt kurar birinde sizin yaptığınız gibi external kesme ile sayacı artırır diğerinde saniyede bir veya 2-3 defa timer kesme ile sayacı sıfırlardım. Eğer elinizde skop varsa son haneye kadar kesin okuma yapabilirsiniz.

Şahsen delay komutunun, işlemcinin boş olması durumunda artırım yaparak çalıştığını düşünüyorum. LCD yazma kısmında uzun yada kısa formatta rakam yazılması, bu rutin içinde bölme / floating işlem yapılması cycle bazında da olsa gecikmeye sebep olur. Bu da 200ms sürenin sapması yani 220ms belki 230ms arasında sürmesine sebep olabilir. Sonuçta loop içindeki her if şartı aynı koşullar altında gerçekleşmiyor.


(Resim gizlendi görmek için tıklayın.)
Endüktif Sensör     

Delay değeri düşük olunca rakamlar çok hızlı değişiyor, değeri arttırırsam arttırdığım kadar rakamların değişimi yavaşlıyor ama benim asıl sorunum devir değerinin atlayarak değişiyor olması. Yani 100 rpm göstermesi gereken değer ekranda 60 oluyor sonra 90 a çıkıyor 115 oluyor sonra tekrar 80 e düşüyor bu şekilde bir tutarsızlık var.

Endüktif sensör ile de denedim sonuç aynı bir şey değişmedi.

Alıntı Yapİki interrupt kurar birinde sizin yaptığınız gibi external kesme ile sayacı artırır diğerinde saniyede bir veya 2-3 defa timer kesme ile sayacı sıfırlardım. Eğer elinizde skop varsa son haneye kadar kesin okuma yapabilirsiniz.

Bu söylediğinizi yapabilecek kadar konuya hakim değilim malesef


03 Mart 2023, 18:57:16
Alıntı yapılan: sezgin05 - 03 Mart 2023, 14:30:56Arduino sensör girişi(D2) pinini pullup yapınız. Yada yazılımsal olarak pullup yapabilirsiniz


Malesef buda çözüm olmadı
***

fide

Elinizde yada erişebileceğiniz bir yerde skop var mı?
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

0M42

Pazartesi gününe kadar imkanım olmaz  :du:
***

fide

Alıntı yapılan: 0M42 - 03 Mart 2023, 20:02:44Pazartesi gününe kadar imkanım olmaz  :du:
Loop rutini içinde bir pini toggle yapın ve bu pinin çıktısını skop ile ölçün. Darbe genişliğinin 200ms den fazla olduğunu ve zamanla değiştiğini göreceksiniz.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr