Arduino rpm meter sorunu

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

0M42

Devir olayını hemen hemen hallettim gibi ancak şöyle bir sorunum daha var.

Devreyi enerjilediğimde usb kablosu bilgisayara takılı değilse ekrandaki rpm değeri kendi kendine sürekli değişiyor sensörün önüne sabit bir metal koyarsam 0 oluyor ve öyle kalıyor metali kaldırırsam yine rakamlar değişmeye başlıyor.

Usb kablosu bilgisayara takılıyken ise aynı sorun sensöre yada sensörün kablosuna dokununca oluyor. Sanırım bir tür parazitlenme oluyor bunu nasıl önleyebilirim acaba? (problemi tam olarak anlatamadıysam video ekleyebilirim)
***

hasankara

Devrenin gnd si ile, priz toprak pini arasından multimetre kullanarak ac voltaj kademesinde iken ölçüm alın. Eğer 220 volt civarı görüyorsanız, ~2nF 1kv değerinde bir kondansatör bağlantısı yaparak parazitlenmeyi ortadan kaldırma ihtimaliniz var. Yada devrenizi beslediğiniz güç kaynağını değiştirmek, veya güç kaynağının toprak beğlantısını kontrol etmek te sorunu çözme ihtimali doğurabilir.

0M42

Hasan bey söylediğinizi yarın deneyeceğim teşekkürler. Yeni farkettiğim şöyle bir durum daha var devre çalışıyorken sensörün gövdesine çıplak el ile dokununca arkasındaki kırmızı led soluk bir şekilde yanıyor. Acaba sensörde mi sorun var bu yüzden mi ekrana değer olarak yansıyor bilemedim malesef elimde başka endüktif sensör de yok.

Ama kablosuna dokununca da ekranda rpm değeri değişiyor buna bir anlam veremedim. Yarın söylediğinizi deneyip sonucu buraya yazacağım.
***

0M42

Alıntı yapılan: hasankara - 05 Mart 2023, 00:29:59Devrenin gnd si ile, priz toprak pini arasından multimetre kullanarak ac voltaj kademesinde iken ölçüm alın. Eğer 220 volt civarı görüyorsanız, ~2nF 1kv değerinde bir kondansatör bağlantısı yaparak parazitlenmeyi ortadan kaldırma ihtimaliniz var.

Ölçümü yaptım hasan bey voltaj görünmüyor. Daha sonra başka bir güç kaynağı ile deneme yaptım, toprak bağlantısınıda gözden geçirdim ama bir değişiklik olmadı sorun devam ediyor.

***

mehmet

#19
Kodlarınızı görebilir miyiz?
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

0M42

Tabiki

#include<LiquidCrystal.h>
LiquidCrystal lcd(3,4,5,6,7,8);
volatile uint32_t rev=0;
float rpm;
float rpmx;
uint32_t oldtime=0;
uint32_t newTime;
void isr() //interrupt service routine
{
rev++;
}
void setup()
{
lcd.begin(16,2); //initialize LCD
attachInterrupt(0,isr,RISING); //attaching the interrupt
}
void loop()
{
delay(600); //detaches the interrupt
newTime=millis()-oldtime; //finds the time
rpm=(float(rev)/float(newTime))*60000; //calculates rpm
oldtime=millis(); //saves the current time
rev=0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("-- AYNA HIZI --");
lcd.setCursor(2,1);
byte basamak=0;
while (rpmx>0)
{
rpmx=rpmx/10;
basamak++;
}
lcd.print( rpm);
lcd.print("  d/dk.");
lcd.print("     ");
}

Son durum bu şekilde;

***

fide

Sensör çıkışının pnp yada npn olmasına göre pull-up yada pulldown gerekebilir. + Besleme ile sensör çıkışı arasına yada sensör çıkışı ile gnd arasına 1k yada 10k ekleyin eğer yoksa.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

0M42

Npn sensör kullanıyorum çıkışa 10k pull up direnci bağladım (+5 volttan sensör çıkışına) ama değişen bir şey olmadı
***

mehmet

Zaman alma mantığınız yanlış.
1000ms hesaplamanız lazım.
Newtime > 1000 olduğu zaman rev değşkeni
sıfırlanıp devir hesaplanmalı.
Elektriksel bir durum yok bence.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

mehmet

#24
D3 hem LCD 'de, hem de kesmede kullanılmış.
Alttaki koda göre pinleri değiştiriniz.
Simülasyonda çalıştırdım.

#include<LiquidCrystal.h>

LiquidCrystal lcd(8,9,10,11,12,13);

volatile uint32_t rev = 0;
float rpm;
float rpmx;
uint32_t oldTime = 0;
uint32_t newTime;

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

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

void loop(void)
{
   delay(999); //detaches the interrupt
   newTime = millis()- oldTime; //finds the time
   rpm = (float(rev) / float(newTime)) * 60000; //calculates rpm
   rev=0;
   
   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print("-- AYNA HIZI --");
   lcd.setCursor(2, 1);
   //byte basamak = 0;
   //while (rpmx > 0)
   //{
   //   rpmx = rpmx / 10;
   //   basamak++;
   //}
   lcd.print( rpm);
   lcd.print("  d/dk.");
   lcd.print("     ");
   
   oldTime = millis(); //saves the current time
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

kimlenbu

İki okuma süresi arasına ekrana yazma süresi de dahil, basamak sayısı değişince bile hata oluşur. Pull up/pull down yoksa kararsız okuma yapar, boştayken kafasına göre değer göstermesi bu yüzden.

Süreyi delay ile değil timer kesmesi ile kontrol edin, timer kesmesi gelince hesaplamaları yapsın, ekrana yazdırılabilir bayrağını set etsin.

0M42

Alıntı yapılan: mehmet - 06 Mart 2023, 13:18:52D3 hem LCD 'de, hem de kesmede kullanılmış.
Alttaki koda göre pinleri değiştiriniz.
Simülasyonda çalıştırdım.

#include<LiquidCrystal.h>

LiquidCrystal lcd(8,9,10,11,12,13);

volatile uint32_t rev = 0;
float rpm;
float rpmx;
uint32_t oldTime = 0;
uint32_t newTime;

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

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

void loop(void)
{
   delay(999); //detaches the interrupt
   newTime = millis()- oldTime; //finds the time
   rpm = (float(rev) / float(newTime)) * 60000; //calculates rpm
   rev=0;
   
   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print("-- AYNA HIZI --");
   lcd.setCursor(2, 1);
   //byte basamak = 0;
   //while (rpmx > 0)
   //{
   //   rpmx = rpmx / 10;
   //   basamak++;
   //}
   lcd.print( rpm);
   lcd.print("  d/dk.");
   lcd.print("     ");
   
   oldTime = millis(); //saves the current time
}

Mehmet bey kodu yükleyip çalıştırdım yine rakamlarda atlama oluyor ama daha az yani atlama aralığı daralmış gibi. Bir de rpm i sanki fazla gösteriyor 100 rpm dönüyorsa 250 gibi gösteriyor.     pinMode(2, INPUT_PULLUP);  satırı ile pull up eklenmiş oluyor değil mi?
***

mehmet

Tam bir şema çıkarmanız mümkün mü?
Besleme ve tüm sinyaller. GND dahil.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

0M42

Mehmet bey devre her şeyi ile aşağıdaki şemanın aynısı

***

mehmet

Sensörün sarı kablosu ile +5V arasına
1K ekleyin. Zira mcu içindeki pullup
direnci ~50K.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr