filtre için yardım isteği

Başlatan gokhangokcen, 23 Kasım 2018, 15:34:40

gokhangokcen

Merhabalar, geçtiğimiz günlerde yapmış olduğum bir kat sahada sıkıntılar çıkarıyor. Endüstriyel bir makine üzerinde kullanmak için WS3813B modeli ledlerim var. Bu ledleri atmega328p işlemci ile tasarladığım kart üzerinden sürüyorum. Kart iş yerinde son derece normal çalışır iken makine üzerinde bulunan röle, kontaktör, sürücüler vs çalışıyor haliyle kartım belli bir süre sonra kilitleniyor. Elimden geldiğince aklımın yattığı şekilde tedbirleri almaya çalıştım. Ama hala net bir sonuca ulaşabilmiş değilim. Kart 24V dc gerilim ile çalışıyor. Kartın beslemesi panoda bulunan PLC,sürücü ve haberleşme birimlerini besleyen 24V smps güç kaynağından geliyor. Haliyle kablo motorlar kabloları, fan kablolarının olduğu kablo tavasından geliyor. Kullandığım kablo ekranlı kablo bir ucu panodan Toprak hattına bağlı. Kartın çizimi aşağıdaki gibidir;

proteus çizimi

versiyon farkından dolayı açamayan ya da resim olarak bakmak isteyenler için;

Kristale bağlı 22pf kondansatörleri haricen dışarıdan lehimledim. Şemada ve resimde olmayabilir.

alt yüz
üst yüz

kartı kısaca özetleyecek olursam, 24V input var 3 adet, bu uçlara gelen sinyallere göre WS2813 chip'lerini kontrol ediyor. 1. uça sinyal geldiğinde ledler yeşil , 2. uca sinyal geldiğinde kırmızı 3. uca sinyal geldiğinde sarı olarak yanıyor.

Kart belli bir süre sonra gelen inputlara yanıt vermiyor. beslemeyi çekip verince düzeliyor. ama ilerleyen süreçte yine donuyor. Kod ise şu şekilde;

// Use if you want to force the software SPI subsystem to be used for some reason (generally, you don't)
// #define FASTLED_FORCE_SOFTWARE_SPI
// Use if you want to force non-accelerated pin access (hint: you really don't, it breaks lots of things)
// #define FASTLED_FORCE_SOFTWARE_SPI
// #define FASTLED_FORCE_SOFTWARE_PINS
#include "FastLED.h"

///////////////////////////////////////////////////////////////////////////////////////////
//
// Move a white dot along the strip of leds.  This program simply shows how to configure the leds,
// and then how to turn a single pixel white and then off, moving down the line of pixels.
//

// How many leds are in the strip?
#define NUM_LEDS 17

int start_pin = 0;
int stop_pin = 0;
int standby_pin = 0;



// Data pin that led data will be written out over
#define DATA_PIN 15

// Clock pin only needed for SPI based chipsets when not using hardware SPI
//#define CLOCK_PIN 4

// This is an array of leds.  One item for each led in your strip.
CRGB leds[NUM_LEDS];

#define BRIGHTNESS  255

// This function sets up the ledsand tells the controller about them
void setup() {

  pinMode(19, OUTPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);

  // sanity check delay - allows reprogramming if accidently blowing power w/leds
  //delay(2000);

  // Uncomment one of the following lines for your leds arrangement.
  // FastLED.addLeds<TM1803, DATA_PIN, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<TM1804, DATA_PIN, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<TM1809, DATA_PIN, RGB>(leds, NUM_LEDS);
  //FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
  //FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  // FastLED.addLeds<APA104, DATA_PIN>(leds, NUM_LEDS);
  // FastLED.addLeds<WS2811_400, DATA_PIN, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<GW6205, DATA_PIN, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<GW6205_400, DATA_PIN, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<UCS1903, DATA_PIN, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<UCS1903B, DATA_PIN, RGB>(leds, NUM_LEDS);

  // FastLED.addLeds<WS2801, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<SM16716, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<LPD8806, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<P9813, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<APA102, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<DOTSTAR, RGB>(leds, NUM_LEDS);

  // FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<SM16716, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<LPD8806, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<P9813, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<APA102, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<DOTSTAR, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);

  for (int i = 0; i < NUM_LEDS; i = i + 1) {    //Yeşil söndürme bloğu
    leds[i] = CRGB::Black;
    FastLED.show();
    delay(10);
    leds[i] = CRGB::Black;
  }

  FastLED.setBrightness( BRIGHTNESS );
}

// This function runs over and over, and is where you do the magic to light
// your leds.
void loop() {

  start_pin = digitalRead(5);
  stop_pin = digitalRead(6);
  standby_pin = digitalRead(7);

  if (start_pin == HIGH) {
    delay(75);
    start_pin = digitalRead(5);
    if (start_pin == HIGH) {
      for (int i = 0; i < NUM_LEDS; i = i + 1) {         //Yeşil doldurma Bloğu
        leds[i] = CRGB::Green;
        FastLED.show();
        delay(50);
        leds[i] = CRGB::Green;
      }

      for (int i = 0; i < NUM_LEDS; i = i + 1) {    //Yeşil söndürme bloğu
        leds[i] = CRGB::Black;
        FastLED.show();
        delay(50);
        leds[i] = CRGB::Black;
      }

      while (start_pin == HIGH) {
        start_pin = digitalRead(5);
        delay(50);
        }
      }
    }



    if (stop_pin == HIGH) {
      delay(75);
      stop_pin = digitalRead(6);
      if (stop_pin == HIGH) {
        for (int i = 0; i < NUM_LEDS; i = i + 1) {    //Kırmızı bloğu
          leds[i] = CRGB::Red;
        }
        FastLED.show();
        delay(50);

        while (stop_pin == HIGH) {
          stop_pin = digitalRead(6);
          delay(75);
        }

        for (int i = 0; i < NUM_LEDS; i = i + 1) {    //Flash bloğu
          leds[i] = CRGB::Black;
        }
        FastLED.show();
        delay(50);
      }
    }

    if (standby_pin == HIGH) {
      delay(75);
      standby_pin = digitalRead(7);
      if (standby_pin == HIGH) {
        for (int i = 0; i < NUM_LEDS; i = i + 1) {    //mavi bloğu
          leds[i] = CRGB::Blue;
        }
        FastLED.show();

        while (standby_pin == HIGH)
        {
          for (int i = 0; i < NUM_LEDS; i = i + 1) {    //mavi bloğu
            leds[i] = CRGB::Blue;
          }
          FastLED.show();
          delay(100);
          standby_pin = digitalRead(7);
        }
        if (standby_pin == LOW) {
          for (int i = 0; i < NUM_LEDS; i = i + 1) {    //Sönme bloğu
            leds[i] = CRGB::Black;
          }
          FastLED.show();
        }
      }
    }


  }

ilaveten kartın besleme girişine SMPS'ten söktüğüm EMI trafosunu bağladım biraz faydası oldu gibi ama yinede beni tatmin etmedi. başka bir önerisi olan beslemeye şunu yapabilirsin diyeceğiniz noktalar var mıdır?

Girişe sağlam güzel bir filtre tarzı bir şey düşünüyorum izleyeceğim yol nasıl olmalı? Ya da panodan beslemeyi ayırıp kart için ayrı bir güç kaynağı mı kullanmalıyım?(bu işlem oldukça zor ve maliyetli olacak).
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

Melih1802

Blendajli kablonun her iki ucu topraga bagli ise Topraklamaya en yakin kisim bagli kalsin diger tarafin blendajini bosta birakarak dene.

tekosis

Kristale ait yollar simetrik değil, etkileme durumu olabilir. Dahili rc osilatorle bir deneyin.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

gokhangokcen

@Melih1802 hocam kablo ilk mesajımda belirttiğim üzere sizin söylediğiniz ile aynı.
@tekosis kristal yollarının simetrisi o kadar problem oluşturacağını düşünmüyorum.Arduino derleyicisi ile yazmıştım. Sanırım iç osilatör seçemiyoruz.
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

Kabil ATICI

watchdog timer kullanımı yardımcı olabilir.
Bu işlemcinin kilitlenmesi durumunda, işlemcinin kendiliğinden resetlenmesi için kullanıllan yapıdır.

 
ambar7

ladybird

Hocam kartın beslemesini harici spms'den mi kulanıyorsunuz ? Besleme karta girmeden pi filtre ekleyip deneye bilirsiniz.
"Bana ait sözcükler olsun isterdim. Ama kullandığım bu sözcükler, bilmiyorum kaç bilinçte sürüklendi." Jean Paul Sartre

gokhangokcen

@Kabil ATICI Üstad watchdog timer çok kullanmak istediğim bir çözüm yolu değil sonuçta işin kaynağını bulup kilitlenme sebebini çözmem gerekiyor. Kilitlendi hadi reset at geçiçi çözüm olarak görüyorum.Öneriniz için teşekkür ederim.

@ladybird Evet hocam kartın beslemesi PLC/HMI/Sürücülerin beslemesi ile aynı kaynak. Röle vs gibi donanımlarda bu smps üzerinden besleniyor. Pi filtre ile ilgili bir örnek paylaşabilir misiniz?
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

mehmet

Brown Out en yüksek değerde
açık olsun.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

gokhangokcen

@mehmet üstad denedim. İşlemci hiç ayağa kalkamıyor bu seferde.Devre üzerinde işlemci +/- bacaklarının dibinde 100nf var haricen 1000uf,470uf,100uf,1uf gibi kondansatörlerin hepsini bağladım aynı anda.Acaba voltajda dalgalanma mı oluyor diye yine yok. Elimde osilaskop olmadığı için takip edemiyorum. Ölçü aletim var voltajı ölçtüğümde 23.9V ile 24.1V arasında çok az şekilde oynuyor. Diğer çalışan sistemler hiç sıkıntı olmadan çalışıyor. Ama benim ürün kilitleniyor.
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

Emre_Tuncay_

Cihazınızı metal bir kutunun içine koyma imkanınız varsa öyle deneyin bence. Ardunio pcb'si tasarlanırken EMI/EMC kurallarına pek uyulmamış sanırım. Bende aynı şeyleri çok yaşadım evde denediğim şey motor veya endüstriyel alanda çalışmıyordu.
Kolay Gelsin.

gokhangokcen

@Emre_Tuncay_  hocam ürün led olduğu için mikadan yapılma bir borunun içerisinde kullanıyorum çift yüzlü pcb arka tarafı işlemci regüle vs olduğu kısım üst yüzeyinde ledler var. Ayrıca kart üzerinde hazır arduino değil Atmega328p işlemcisi var. Sadece kod arduino derleyicisinde yazıldı.
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

fide

Besleme hattı üzerine tvs diyot ekleyin, bir de muhtemelen 24 voltu 5 volta switching ile düşürüyırsunuz. Switching entegresi çıkışına 5 volt tvs diyot koyup deneyin.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

mehmet

#12
Pull-up / pull-down dirençlerini
1K civarına kadar düşürün. Özellikle
Reset bacağındaki direnci.
(Çiziminizi görmedim.)
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

gokhangokcen

#13
@fide evet hocam panodaki güç kaynağım 24V smps benim kart üzerindeki ekipmanları ve ledleri beslediğim elemanda lm2576-5 smps kullandım. TVS diyot ile ilgili biraz araştırdım forumumuzda şöyle bir konu başlığı gördüm.

Sanırım oluşan pick/yüksek gerilimleri zener gibi davranarak absorbe ediyor.Doğru mu anlamışım hocam?

@mehmet hocam inputlardaki Pullup dirençlerim 1W 1K smd direnç şu anki hali ile zaten.Resette ise yine dediğiniz gibi +5V'a 1K direnç ile çekili 1K dirence paralel 100nf kondansatör var.
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

fide

Switching esnasında yada dış kaynaklı iğne palslerde zener gibi davranarak voltajı traşlıyor.
Sizin de belirttiğiniz gibi zener gibi davranıyor.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com