Arduino Mega Gerilim Ölcümünde Dalgalanma Problemi Cözümü

Başlatan mfurkan7, 19 Eylül 2022, 16:57:16

mfurkan7

Merhabalar,
Arduino ile 6V'luk pilimin gerilimini ölcüyorum ancak sisteme bagli pompa ve valf calistiginda gerilim düsüyor ve dalgalanma oluyor.
50ms örnekleme aliyorum. 0.47uF'lik 3 seramik kapasitörü paralel baglayip girisin arti ve eksisine baglayip motor sürücümü oradan besledim. Analog pinin ve motor sürücünün GND'lerini ayirdim ancak sonuc hala ayni. Önerileriniz nelerdir?

Sozuak

Şimdi hatırlamyorum detayları ama şöyle yapmıştım. sürekli 20-30 ölçüm alıyor, ilk giren ilk çıkar mantığı ile  sürekli ölçüm değerleri alınıp 20-30 ölçümün ortalaması alınınca dalgalanma da oldukça düşük düzeyde kalıyor. Zaman sabitini biraz yüksek tutmuş oluyoruz. Oraya 10uF kondansatör bile koysanız  bu şekilde ölçüm yapıp ortalama almadıktan sonra dalgalanma olur.

mfurkan7

Hocam,
Sizin dediginiz ortalamayi arduino'da nasil yapabilirim? Bir de ortalama almak yerine delay'i 50ms'den 1000ms'e ceksem is görür mü?

Sozuak

Çok yöntem denemiştim bayağıdır yapmıyorum. Delay melay iş görmüyor. Belli bir sayıda dizi oluşturacaksınız sürekli bu diziye sırayla değer atayacaksınız(okuduğunuz değerleri) ilk giren ilk çıkacak. Bu dizi içinden değerleri alıp ortalamalarını alacaksınız ve göstereceksiniz. Dosyaya bir bakıp o kısmı eklemeye çalışırım.

mfurkan7

Hocam,
Bir deneyeyim dediginizi. Dosyayi bulabilirseniz büyük makbule gecer. Simdiden tesekkür ediyorum.

ilyas KAYA

Arduinonun 5volt beslenmesine 1000uf lik kondansator takip deneyin. Valf vb cihazların arti uçlarına seri çekecekleri akim kadar diyot bağlayın deneyin

mfurkan7

Alıntı yapılan: ilyas KAYA - 19 Eylül 2022, 21:40:52Arduinonun 5volt beslenmesine 1000uf lik kondansator takip deneyin. Valf vb cihazların arti uçlarına seri çekecekleri akim kadar diyot bağlayın deneyin

Hocam,
Pilden besleme yapiyorum. Bir gerilim bölücü ile de pil voltaj degerini okuyorum. Pil ayni zamanda pompa ve valfi de besledigi icin birbirine paralel bagli pompa ve valf aktif olunca ölctügüm pil gerilimi bir anda düsüyor.

1000uF koyunca da ölctügüm gerilim degeri 10V'a cikiyor. Hem arduino üzerindeki 5v kismina 10v'luk kapasitörü bagladim. Olmadi. Sonra ölcüm aldigim voltaj bölücü direncine paralel bagladim yine calismadi. 10v harici de capacitörüm yok. En düsügü elimdeki bu kapasitör. Isin kötüsü elimde diyot da yok 500mA'lik. :/

dnacikaya

Protonda kullandığım örneği paylaşıyorum. Arduinoya çevirmelisin. 19 ölçüm alıp ortadan 7-12 değerleri toplanıp 6ya bölünüyor. Filtrenin işe yaraması İlyas hocamın da belirttiği noktaların da sorunsuz olmasına bağlı tabiki.

Dim VAR1 As Word
Dim I1 As Byte
Dim OK1 As Word
Dim TO1 As Word
Dim TEMP1 As Word

For I1 = 0 To 19
    VAR1 = ADIn 0
    VAR1 = OK1[I1] 
    DelayUS 10
Next
TO1 = 0 
For I1 = 7 To 12
TEMP1 = OK1[I1]
TO1 = TO1 + TEMP1
Next
VAR1 = TO1 / 6

mfurkan7

Sizin dediginiz yöntemi de denedim. Nedense olmuyor.
Anahtari acip pompaya akimi verince pilin gerilimi bir anda düsüyor. delay'i de degistirdim. Ek delay ekledim ama yok. Ölctügüm pil gerilimi yine düsüyor.
Düsünüyorum. Üniteyi besledigim pilin gerilimini ölcerken ünite calistiginda okudugum deger nasil degismez diye ama bir cözüm bulamadim.

int pump_positive = 9;
int pump_negative = 8;
int button = 53;
int button_state = 0;

int voltage_input_pin = A0;
float input_voltage_data = 0;
float v_step = 5.071 / 1023.0 ;

float voltage_array[25];
int voltage_measurement_amount=25;
float voltage_sum;
float av_voltage;


void setup() {
  pinMode(pump_positive, OUTPUT);
  pinMode(pump_negative, OUTPUT);
  pinMode(button, INPUT);
  pinMode(voltage_input_pin, INPUT);
  Serial.begin(115200);
  Serial.println("CLEARDATA");
  Serial.println("LABEL,Time,Started Time, Input Voltage Value");
  Serial.println("RESETTIMER");
}

void loop() {
  button_state = digitalRead(button);
  if (button_state == LOW) {
    digitalWrite(pump_positive, LOW);
    digitalWrite(pump_negative, LOW);
  }
  else {
    digitalWrite(pump_positive, HIGH);
    digitalWrite(pump_negative, LOW);

  }
  input_voltage_data = analogRead(voltage_input_pin) * v_step;
  for(int i=0;i<voltage_measurement_amount;i+=1){
      if (input_voltage_data<0.06){
        voltage_array[i]=input_voltage_data;
      }
      else{
        voltage_array[i]=input_voltage_data+ ((input_voltage_data / 9880) * 9990)+0.02;
      }
      delay(50);

      
  }
  for(int k=7;k<13;k+=1){
    voltage_sum+=voltage_array[k];
  }
  av_voltage=voltage_sum/6;
  

  Serial.print("DATA,TIME,TIMER,");
  Serial.println(av_voltage);
  delay(20);    
  voltage_sum=0;


}

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

muhendisbey

ADC ölçümlerinde standart sapma ve kalanın ortalaması daha iyidir. Çok sapan sonuçlar direk elenir.

Hassas ölçümlerde analog referans girişine (AREF), referans gerilimi uygulamak çok daha iyidir. Bunun için regülatör benzeri 3 bacaklı referans entegreleri var.

ADC girişine direk kapasitör eklerseniz gecikmeye neden olur. Bir anda şarj ya da deşarj olamayacaktır çünkü.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

mfurkan7

Alıntı yapılan: muhendisbey - 20 Eylül 2022, 00:54:34ADC ölçümlerinde standart sapma ve kalanın ortalaması daha iyidir. Çok sapan sonuçlar direk elenir.

Hassas ölçümlerde analog referans girişine (AREF), referans gerilimi uygulamak çok daha iyidir. Bunun için regülatör benzeri 3 bacaklı referans entegreleri var.

ADC girişine direk kapasitör eklerseniz gecikmeye neden olur. Bir anda şarj ya da deşarj olamayacaktır çünkü.

Hocam,
Son durumda motor girisine 1n4007 ve 1000uF 10V kapasitör ekledim. Sapmayi biraz engelledim. Yazilimda da diyotun gerilim düsümünü arti olarak ekledim. Suan anahtar acma ve kapama anlari haric yaklasik dogru degeri veriyor. Ancak merak ettigim konu AREF'i nasil koduma entegre edebilirim ya da donanimima. Biraz daha detay verebilirseniz cok sevinirim. AREF hic kullanmadim.

muhendisbey

#12
https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/

Kod kısmında tek bir komut:
analogReference(EXTERNAL);

Referans gerilimini:
Zener diyot + direnç


Ya da LM336 gibi hazır bir eleman kurulumu kullanılabilir.
https://www.motorobit.com/urun/lm336z5-to-92-5v-programlanabilir-sant-regulatoru
kullanımı:
https://www.analog.com/en/products/lm336-2.5.html#product-overview
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

z


Sadece ortalama alarak yapilmis bir ADC uygulamasi.

Yanlis hatirlamiyorsam 1024 yada 2048 ornek ortalamasi aliniyor.

2014 yil basinda yaptigim bu uygulamada ADC girisi 2.014v olursa mutlu yillar yazisi cikiyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mfurkan7

Alıntı yapılan: z - 20 Eylül 2022, 01:39:33

Sadece ortalama alarak yapilmis bir ADC uygulamasi.

Yanlis hatirlamiyorsam 1024 yada 2048 ornek ortalamasi aliniyor.

2014 yil basinda yaptigim bu uygulamada ADC girisi 2.014v olursa mutlu yillar yazisi cikiyor.
Hocam,
Maksimum arduino mega ile 1201 örnek alabiliyorum zorlamadan. Ancak yine de sizin videonuzdan bunu nasil yaptiginizi cikartamadim. Eger kod vs. varsa ve paylasabilirseniz sevinirim. Bu sisteminize pompa veya bir motor bagli miydi bilmiyorum ama ölcüm oldukca stabil gözüküyor. Benim ölcüm alirkenki problemim pompa-solenoid valf ünitesinin aktif ve deaktif oldugu anda ölcümün sapitmasi.