Skocz do zawartości

Zakłócenia elektromagnetyczne na przewodach sygnałowych Arduino


czaj

Pomocna odpowiedź

Hej

Buduję sobie kilka urządzeń które zasilane są 230V i sterowane przez Arduino. W urządzeniu jest sporo przekaźników, które sterują np. pracą lewo/prawo silnika na 230V, do tego sporo silników krokowych, czujników, włączników, krańcówek itp.
Miałem spory problem z zakłóceniami elektromagnetycznymi na przewodach sygnałowych z czujników, włączników, krańcówek. Krótko mówiąc działy się cuda i dziwne rzeczy 😛

Rozwiązałem problem programowo przez sprawdzanie czy przycisk/krańcówka jest włączona jakiś czas i dopiero uruchamianie głównej operacji.

Poniżej kod tego rozwiązania:

int ostatniStan2 = HIGH;
bool ledOn = false;
unsigned long poprzednia_Millis; 
unsigned long aktualna_Millis;
bool wlacz = false;

void loop(){

  int stan2 = digitalRead(PRZYCISK_2);
  
  if ( digitalRead(PRZYCISK_2) == LOW ){     //--- wlaczenie / wyłączenie przycisku ---
    if ( wlacz == false ){ 
      poprzednia_Millis = millis();
    }; 
    wlacz = true; 
  }else{ 
    wlacz = false;
    ostatniStan2 = HIGH;
  }
    
  aktualna_Millis = millis();
    
  if ( wlacz == true and ( aktualna_Millis - poprzednia_Millis ) >= 200 ){    //---- sprawdzenie czy przycisk jest wciśnięty jakiś czas
      
    wlacz = false;
      
    if( ostatniStan2 == HIGH && stan2 == LOW ) {     //--- sprawdzenie zmiany stanu przycisku żeby nie było zapętlania operacji
        
      //--- wlasciwa operacja ktora wykonuje się jak przycisk jest wciśnięty  ---
      switch(ledOn){    
        case false: digitalWrite(LED_0, HIGH); ledOn = true; break;      
        case true: digitalWrite(LED_0, LOW); ledOn = false; break;       
        default: break;    
      } 
            
    }
    ostatniStan2 = stan2;
  }
  
}

Działa to całkiem sprytnie i praktycznie wyeliminowało problemy z zakłóceniami, ale jest upierdliwe do stosowania w kodzie. Za każdym razem muszę powielać kod,zmienne itp.

Próbowałem to wsadzić w void, ale żeby void zadziałała muszą być osobne pętle lub delay-e. To odpada bo sterowanie silnikami krokowymi mam w Timer-rze ( ISR(TIMER1_COMPA_vect) )

Możecie coś polecić jak to uprościć?? Kombinować z włożeniem tego do Timer-a ??
Pzdr

Link do komentarza
Share on other sites

1 godzinę temu, czaj napisał:

No tak, rozważałem taką opcję, ale chciałem... pójść "na skróty" 😕

Rozwiązania sprzętowe zawsze są najlepsze (poza paroma wyjątkami).

A jak chcesz naprawdę na skróty to gdzieś były klasy "Debouncer" w różnych repo. Poszukaj takiej i na niej bazuj 😉 

Eg. https://forum.arduino.cc/t/simple-button-debounce-library/257543

Edytowano przez H1M4W4R1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Wstawiłem ww algorytm filtrowania do Timer-a i działa elegancko. Tzn działa na stanowisku testowym 🙂 Zobaczymy co będzie w maszynie 😛
Nie zmienia to faktu że nad filtrami RC też muszę pomyśleć.

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.