logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Rozwiązano] Sterowanie zaworami 24V przez ATMega328P-PU i 2N2222A - co może być nie tak?

RebellionArts 07 Paź 2024 15:38 540 14
  • #1 21254091
    RebellionArts
    Poziom 23  
    Posty: 594
    Pomógł: 56
    Ocena: 150
    Witam,

    Mam problem i nie mogę znaleźć odpowiedzi, sam nie wiem co może być nie tak i w internecie na forach nie widziałem podobnego problemu.
    Mianowicie.

    Zaprojektowałem układ elektroniczny do sterowania zaworami, zawór działa na 24V i prąd około 63mA. Zawór załączany jest przez tranzystor 2N2222A.
    Sercem sterownika jest ATMega328P-PU, wszystkie podstawowe komponenty jak kwarc 16MHz z 22pF, 10k Ohm na RESET, zasilanie filtrowane jest kilkoma kondensatorami ceramicznymi 100nF i innymi elektrolitycznymi (wszystko widać na schemacie poniżej). Aktualnie nie ma układu LM317 - podłączyłem się przewodami z przetwornicy DC do kondensatora C9 (odpowiednia + i -).

    Układ komunikuje się z klawiaturą po i2c, układ sterowania zaworami jest slave a klawiatura master. Do zasalania układu klawiatury wziąłem zasilanie z układu sterowania zaworami.

    Schemat obwodu sterownika zaworów z mikrokontrolerem ATMega328P-PU

    Kod programu:
    
    #include <Wire.h>
    
    #define cv1 17
    #define cv2 16
    #define cv3 15
    #define cv4 14
    #define cv5 10
    #define cv6 9
    #define cv7 8
    #define cv8 7
    
    void setup() {
      Wire.begin(8);                 // Ustaw mikrokontroler jako urządzenie I2C Slave z adresem 8
      Wire.onReceive(receiveEvent);   // Rejestracja funkcji wywoływanej po odebraniu danych
    
      pinMode(cv1, OUTPUT);
      pinMode(cv2, OUTPUT);
      pinMode(cv3, OUTPUT);
      pinMode(cv4, OUTPUT);
      pinMode(cv5, OUTPUT);
      pinMode(cv6, OUTPUT);
      pinMode(cv7, OUTPUT);
      pinMode(cv8, OUTPUT);
    
      // Ustawienie domyślnych stanów zaworów na LOW
      resetAllValves();
    }
    
    void loop() {
      delay(100);  // Główna pętla nie jest potrzebna, dane są przetwarzane w funkcji receiveEvent
    }
    
    void receiveEvent(int howMany) {
      String data = "";
      while (Wire.available()) {
        char c = Wire.read();
        data += c;
      }
      processData(data); // Przekaż odebrane dane do funkcji przetwarzającej
    }
    
    void processData(String data) {
      // Przetwarzaj dane i steruj odpowiednimi zaworami
      if (data == "z1wl") {
        digitalWrite(cv1, HIGH);
     
      } else if (data == "z1wy") {
        digitalWrite(cv1, LOW);
      
      } else if (data == "z2wl") {
        digitalWrite(cv2, HIGH);
    
      } else if (data == "z2wy") {
        digitalWrite(cv2, LOW);
     
      } else if (data == "z3wl") {
        digitalWrite(cv3, HIGH);
      
      } else if (data == "z3wy") {
        digitalWrite(cv3, LOW);
    
      } else if (data == "z4wl") {
        digitalWrite(cv4, HIGH);
    
      } else if (data == "z4wy") {
        digitalWrite(cv4, LOW);
    
      } else if (data == "z5wl") {
        digitalWrite(cv5, HIGH);
     
      } else if (data == "z5wy") {
        digitalWrite(cv5, LOW);
      
      } else if (data == "z6wl") {
        digitalWrite(cv6, HIGH);
    
      } else if (data == "z6wy") {
        digitalWrite(cv6, LOW);
    
      } else if (data == "z7wl") {
        digitalWrite(cv7, HIGH);
    
      } else if (data == "z7wy") {
        digitalWrite(cv7, LOW);
    
      } else if (data == "z8wl") {
        digitalWrite(cv8, HIGH);
     
      } else if (data == "z8wy") {
        digitalWrite(cv8, LOW);
    
      } else if (data == "reset") {
        resetAllValves();
      } else {
        Serial.println("Nieznana komenda");
      }
    }
    
    void resetAllValves() {
      digitalWrite(cv1, LOW);
      digitalWrite(cv2, LOW);
      digitalWrite(cv3, LOW);
      digitalWrite(cv4, LOW);
      digitalWrite(cv5, LOW);
      digitalWrite(cv6, LOW);
      digitalWrite(cv7, LOW);
      digitalWrite(cv8, LOW);
    }
    
    



    Problemem jest zmiana stanów na wyjściach. Jak widać po schemacie i kodzie, ATmega steruje 8 zaworami, są one na zmianę załączane (w różnej kolejności wł/wył, rzadko zmienia się stan, działają teraz tylko 4, przez 10 minut jeden, potem się wyłącza i włączane są inne dwa). Po czasie prawie tym samym, 80 minut wszystkie zawory lub jeden się wyłącza, mikrokontroler przestaje dawać zasilania na tranzystor. Zmienia stan z HIGH na LOW, nigdy na odwrót.

    Doszły mnie słuchy że to może być spowodowane przyjmowaniem stringów i zapełnianie się pamięci, ale nie chce mi się w to wierzyć za bardzo bo tych stringów jest wysyłanych tyle co jedno zdanie niezłożone. Chciałbym wiedzieć czy istnieje jeszcze jakaś inna możliwość, czemu się tak dzieje.

    Mogę dodać jeszcze, że tranzystory miałem z dwóch paczek, jedna stara i działa dobrze z rezystorami na PCB i paczka nowa, gdzie musiałem wylutować rezystor 10k Ohm bo powodował cięgle załączenie tranzystora. Stara paczka miała z 9 lat, nigdy nie używane - nie wiem od czego to zależy też.
    Układ też potrafił się wyłączyć od dotyku metalowych części całego układu z zaworami (części aluminiowe rurek), być może jakaś elektrostatyka uszkodziła mikrokontroler? Ale nie jestem przekonany bo złącze do zaworów i część elektryczna jest plastikowa. Jeszcze pracownicy z labu mówili mi, że jak uruchamiają dygestorium (zazwyczaj duży wyciąg oparów ) to potrafi cała elektronika wariować w labie (mierniki, oprawy LED się włączają) - to też może mieć jakiś skutek wadliwego działania? Wyłączenie stanów zazwyczaj się działo kiedy nikt nic nie robi (pozostawione to jest na przeprowadzenie reakcji, układ powinien działać kilka godzin...)

    Proszę o pomoc i podpowiedzi co może być nie tak, napięcia są stabilne na wyjściu przetwornicy dającej 5V, tak samo zasilacz 24V DC do wysterowania zaworów - ma on jednak połączenie z masą tej przetwornicy na 5V.
  • Pomocny post
    #2 21254165
    TMSU
    Poziom 12  
    Posty: 41
    Pomógł: 7
    Ocena: 14
    Tu jest wszystko źle, co byś nie robił z programem to nie będzie dobrze działać. Wyobraź sobie, że zrobiłeś rower z gałęzi z kwadratowymi kołami, to nie ma prawa dobrze działać. Samo płytka drukowana jest źle zaprojektowana, masa tu nie działa jak trzeba przy liniach transmisyjnych. Nie wolno I2C wyprowadzać poza PCB, nawet na PCB nie wszędzie można I2C prowadzić, to jest dość wrażliwy interfejs do transmisji danych na krótkie odległości między układami scalonymi. Zasilanie jest źle zaprojektowane, kondensatory 100n są na sztukę w tym przypadku, one nie mogą być gdziekolwiek. Reset jest źle zaprojektowany, w tym projekcie jest dość mocno podatny na wszelkie zakłócenia. Do zmiany jest koncepcja i projekt płytki. Nad tym co tutaj jest zaprezentowane nie ma nawet co dalej dyskutować.
  • #3 21254180
    RebellionArts
    Poziom 23  
    Posty: 594
    Pomógł: 56
    Ocena: 150
    Dzięki za uwagi.
    To jest prototyp v1, żeby na razie działało dla krótkich reakcji. Też żeby zbadać potrzeby w sterowaniu (były różne możliwości do dyspozycji), już mam w planie v2 zrobić sterowanie po przez transoptory, oddzielić masy od uC i zasilania zaworów oraz zmienić gniazda na techniczne ekranowane z łatwiejszym sterowaniem. Mimo wszystko chciałem wiedzieć co jest nie tak.

    Nie sądziłem że i2c jest aż tak podatna na zakłócenia, jaki polecasz inny protokół komunikacyjny? Przyszłościowo będzie więcej PCB do obsługi grzania czytania wartości z miernika ciśnienia więc będzie kilka slaveów + chciałbym komunikację fullduplex.
    A zasilanie czemu jest źle zaprojektowane?
  • Pomocny post
    #4 21254204
    piotrsawickas
    Poziom 11  
    Posty: 28
    Pomógł: 6
    Ocena: 11
    >>21254091

    Dodaj log debugowy w setupie aby sprawdzic czy nie resetuje Ci się mikrokontroler. Używałbym char[] zamiast String i porównanie stringów strcmp(). Zamiast tej ściany if-else wrzuciłbym komendy do jakiejś tablicy structów. Gdzie struct zawierałby dwa pola on i off które wskazują na komendy. Indeks tablicy wskazywałby który elektromagnes właczasz/wyłączasz. I pętla która jedzie po elementach tablicy i proste strcmp(). Wyłącz też nieużywane peryferia takie jak ADC aby zredukować pobór prądu.

    Ciekawe jak z jakością zasilania które podajesz na scalak? W AVR możesz przechwycić powód resetu.
    Te kondensatory 100n dałbym bliżej nóżek scalaka.
    No i pytanie czy Twój zasilacz jest na tyle wydolny by zasilić cały układ gdy wszystkie elektromagnesy są włączone?

    BTW cz ty chcesz wytrącać aż 19V na tym LM317 ?
  • #5 21254228
    RebellionArts
    Poziom 23  
    Posty: 594
    Pomógł: 56
    Ocena: 150
    piotrsawickas napisał:
    BTW cz ty chcesz wytrącać aż 19V na tym LM317 ?

    Tak, wyliczyłem dla niego wydzielane ciepło i mam radiator, który powinien utrzymać temperaturę na poziomie 63 stopni Celsjusza

    piotrsawickas napisał:
    No i pytanie czy Twój zasilacz jest na tyle wydolny by zasilić cały układ gdy wszystkie elektromagnesy są włączone?

    Jest, ma 15A i ponad 87& sprawności

    piotrsawickas napisał:
    Używałbym char[] zamiast String i porównanie stringów strcmp().

    No właśnie nie wiem czy dopisałem w końcu na głównym poście ale już wprowadziłem zmiany w kodzie na char - tak jak piszesz.
    piotrsawickas napisał:
    Zamiast tej ściany if-else wrzuciłbym komendy do jakiejś tablicy structów. Gdzie struct zawierałby dwa pola on i off które wskazują na komendy. Indeks tablicy wskazywałby który elektromagnes właczasz/wyłączasz. I pętla która jedzie po elementach tablicy i proste strcmp().

    Dzięki, przemyślę to, ale i tak nie zamierzam opierać się na danych z UART do sterowania, szukam lepszego rozwiązania na ten moment.


    piotrsawickas napisał:
    Te kondensatory 100n dałbym bliżej nóżek scalaka.

    tak będzie zrobione w wersji v2

    piotrsawickas napisał:
    Dodaj log debugowy w setupie aby sprawdzic czy nie resetuje Ci się mikrokontroler.


    A możesz mi wyjasnić jak to będzie działać, jak będę mógł to później odczytać?
  • Pomocny post
    #6 21254237
    TMSU
    Poziom 12  
    Posty: 41
    Pomógł: 7
    Ocena: 14
    >>21254180 Linie komunikacyjne I2C (SCL, SDA) to interfejs, sposób komunikacji między układami to protokół. Jeśli chcesz fullduplex to interfejs RS422, ale raczej zbędny jest tu fullduplex, wystarczy interfejs RS485 (halfduplex), najlepiej izolowany i to tego komunikacja za pomocą protokołu Modbus. Możesz też użyć własny protokół, tylko po co wyważać otwarte drzwi. Modbus jest w miarę prosty i odporny na błędy komunikacyjne. Możesz też pomyśleć o interfejsie CAN, trochę bardziej skomplikowany, ale bardziej też odporny na zakłócenia. Być może źle rozumiesz pojęcie "fullduplex", inaczej przecież nie zastosowałbyś I2C. Co do mas zaworów, nie musisz ich rozdzielać, a nawet to nie jest wskazane, lepiej żeby energia zakłóceń była pod kontrolą, a nie była rozpraszana gdzieś w powietrzu. Pomyśl o lepszym zabezpieczeniu przed zakłóceniami niż pojedyncza dioda i to z dużą pętlą ze ścieżki (gasiki RC, warystory, transile (diody TVS)). Zainteresuj się bardziej układami cyfrowymi i ich zasilaniem to jest bardzo ważny aspekt techniki cyfrowej. Bardzo dużo problemów w działaniu układów cyfrowych bierze się ze źle zaprojektowanego układu zasilania. Kondensatory blokujące muszą być jak najbliżej nóżek zasilania, to są takie lokalne magazyny energii i to dzięki nim szybko przełączające układy mają skąd tą energię pobierać, w przeciwnym wypadku z powodu impedancji ścieżek napięcie na samych nogach zasilania układu jest niestabilne (nanosekundowe zmiany napięcia), a to powoduje złe działania układu. Zmniejsz wielkość płytki i zastosuj laminat dwustronny, nie baw się w jednostronne laminaty. W tych czasach nawet już nie bardzo mają ekonomiczny sens. Nawet na dwustronnym czasami jest ciężko zapanować nad zakłóceniami, na jednostronnym jest to niemożliwe. Jeśli nie czujesz się mocny w tym temacie, przypatrz się kilku projektom z netu, wyciągnij jakieś wnioski i zapytaj się zanim na coś się zdecydujesz. Weź pod uwagę, że większość projektów w necie jest źle zaprojektowana, nawet kwiatki zdarzają się u producentów układów na ich płytkach referencyjnych do danego układu. Jeszcze jedna uwaga, nie jest dobrą praktyką zbijanie napięcia o 20V za pomocą stabilizatora liniowego, to nie jest tak że przy takiej różnicy napięć LM317 ma 1A wydajności, tu robią się już mA, w przeciwnym wypadku bez pożądnego radiatora stabilizator smaży się razem z PCB. Użyj przetwornicy impulsowej do takiego obniżenia napięcia, trochę cięższy temat, ale są już gotowe zamienniki impulsowe np. takich 7805 (przykład - AMSRO-7805-NZ)
  • Pomocny post
    #7 21254274
    sp3ots
    Poziom 38  
    Posty: 3073
    Pomógł: 524
    Ocena: 674
    Witam !
    Trochę poprawiłem płytkę:
    Projekt płytki drukowanej z komponentami elektrycznymi
  • Pomocny post
    #8 21254313
    piotrsawickas
    Poziom 11  
    Posty: 28
    Pomógł: 6
    Ocena: 11
    >>21254228
    Co do tego UART, w kodzie użyłeś
    Serial.println("Nieznana komenda");
    Więc sądziłem, że się podpiąłeś do TxD (PD1)
    konwerterem UART-USB na FTDI dla poziomów TTL i obserwujesz logi które zrzuca ci mikrokontroler.

    Nie wiem czy masz pelnoprawny programator/debugger do AVR. Ale generalnie jak projektujesz takie uklady to warto zostawić sobie jakieś możliwości komunikacji diagnostycznej/debugowej. Nawet przeznaczenie jednego pinu na sterowanie diodą LED (dioda statusu) pozwoliłoby ci zwizualizować co się dzieje w układzie. Możesz na przykład zrobić kilka krótkich blysnięc po resecie w setup(), a w głównej pętli on/off co 1s.
  • #9 21254314
    RebellionArts
    Poziom 23  
    Posty: 594
    Pomógł: 56
    Ocena: 150
    TMSU napisał:
    Być może źle rozumiesz pojęcie "fullduplex", inaczej przecież nie zastosowałbyś I2C.

    Właśnie wszystko jest ok, chcę wykorzystać jakiś inny protokół, taki, żeby slave mógł dać znać nie tylko masterowi ale i innemu slave, pomysły co do tego narodziły się podczas wykorzystywania wersji v1.

    TMSU napisał:
    Pomyśl o lepszym zabezpieczeniu przed zakłóceniami niż pojedyncza dioda i to z dużą pętlą ze ścieżki (gasiki RC, warystory, transile (diody TVS))

    dzięki za radę, na pewno wezmę ją pod uwagę przy projekcie v2

    TMSU napisał:
    Zainteresuj się bardziej układami cyfrowymi i ich zasilaniem to jest bardzo ważny aspekt techniki cyfrowej. Bardzo dużo problemów w działaniu układów cyfrowych bierze się ze źle zaprojektowanego układu zasilania. Kondensatory blokujące muszą być jak najbliżej nóżek zasilania, to są takie lokalne magazyny energii i to dzięki nim szybko przełączające układy mają skąd tą energię pobierać, w przeciwnym wypadku z powodu impedancji ścieżek napięcie na samych nogach zasilania układu jest niestabilne (nanosekundowe zmiany napięcia), a to powoduje złe działania układ

    Dużo czytałem o tym ale tak jak napisałeś dalej że internet jest pełen złych przykładów o które się właśnie ja odbijam, ostatnio podpatrzyłem jak zasilany jest układ Arduino, być może wezmę z niego przykład.

    TMSU napisał:
    Zmniejsz wielkość płytki i zastosuj laminat dwustronny, nie baw się w jednostronne laminaty. W tych czasach nawet już nie bardzo mają ekonomiczny sens. Nawet na dwustronnym czasami jest ciężko zapanować nad zakłóceniami, na jednostronnym jest to niemożliwe.

    Jest to układ z laminatem dwustronnym ale druga strona została wyżarta w 95%, ogólnie to u siebie mam prototypownie, buduje wszystko na elementach THT ale po mału przesiadam się na SMT, więc te odstępy były tylko i wyłącznie na potrzeby oddzielenie sekcji sterowania; zasilania; uC, interfejs.

    TMSU napisał:
    Jeśli nie czujesz się mocny w tym temacie, przypatrz się kilku projektom z netu, wyciągnij jakieś wnioski i zapytaj się zanim na coś się zdecydujesz.

    Właśnie wydobywam sekcje zasilania i filtracji z STM32 Nucleo -> też docelowo chce pracować na STMach (STM32F103c8t6 jak w bluepill)

    TMSU napisał:
    Użyj przetwornicy impulsowej do takiego obniżenia napięcia, trochę cięższy temat, ale są już gotowe zamienniki impulsowe np. takich 7805.

    Też mam jedną upatrzoną i zamierzam docelowo kupić po prostu zasilanie i wydzielić je na poszczególne bloki, uważam że szkoda zabawy z budowaniem własnego

    Dzięki wielkie za podpowiedzi. Może masz jakieś materiały jak wejść w elektronikę z projektowaniem? Na co zwracać uwagę i jakich błędów nie popełniać?

    Dodano po 5 [minuty]:

    >>21254274

    Dzięki, nie sądziłem że aż taka ważna jest kwestia podłączonych kondensatorów blisko nóżek.
    Ten RESET to masz też rację, teraz układ działa zdecydowanie lepiej zapewne.
    Ale ciekawi mnie wyciągnięcie 24V bezpośrednio ze złącza, czy naprawdę ma duży wpływ to, że idzie on kilka cm jedną gałęzią?
  • #10 21254318
    piotrsawickas
    Poziom 11  
    Posty: 28
    Pomógł: 6
    Ocena: 11
    >>21254314
    Z ciekawości możesz podesłać linka do specyfikacji tych elektrozaworów?
  • #11 21254324
    RebellionArts
    Poziom 23  
    Posty: 594
    Pomógł: 56
    Ocena: 150
    piotrsawickas napisał:
    Nie wiem czy masz pelnoprawny programator/debugger do AVR. Ale generalnie jak projektujesz takie uklady to warto zostawić sobie jakieś możliwości komunikacji diagnostycznej/debugowej. Nawet przeznaczenie jednego pinu na sterowanie diodą LED (dioda statusu) pozwoliłoby ci zwizualizować co się dzieje w układzie. Możesz na przykład zrobić kilka krótkich blysnięc po resecie w setup(), a w głównej pętli on/off co 1s


    Kiedyś robiłem układ 3 diod do testowania czy układ działa poprawnie, jedna na test od tak, druga na przyjmowanie komunikacji a trzecia migała jak było bez odbierania danych i gdy ustawione były jakieś wyjścia na stan wysoki.
    Tylko że, tyle ich zrobiłem już i nic się ni działo, że już odszedłem od tego.

    To rozumiem, że ten log.debug to po prostu println w setup który wydrukuje się jak układ się zrestartuje... no to na to nie wpadłem jeszcze, i takich błędów nie miałem jeszcze. Możliwe że się rzeczywiście resetuje cały uC. Dziwne bo zasilanie jest OK, tzn klawiatura (która też posiada ATMega328P-PU tak samo zrobioną) ma przyciski i diodę do każdego przycisku (sygnalizacja stanu) nie resetuje się, diody się świecą a układ w kontrolerze zaworów wariuje...

    Dodano po 3 [minuty]:

    piotrsawickas napisał:
    Z ciekawości możesz podesłać linka do specyfikacji tych elektrozaworów?

    https://www.mt24.com/en/Pneumatics/Vacuum-tec...Jgc0ltChmQGEXwg2PgATl_KdFO2RfaRZ7Szh-7c-wZYjZ

    W instrukcji nie ma nic więcej o nich, to co na stronie jest powyżej to wyczerpuje część elektroniczną

    Dodano po 1 [minuty]:

    piotrsawickas napisał:
    Co do tego UART, w kodzie użyłeś
    Serial.println("Nieznana komenda");
    Więc sądziłem, że się podpiąłeś do TxD (PD1)
    konwerterem UART-USB na FTDI dla poziomów TTL i obserwujesz logi które zrzuca ci mikrokontroler.


    Tak, jest.
    Z początku testowałem jak uC odbiera dane, ten jeden println został bo o nim zapomniałem.
  • Pomocny post
    #12 21254334
    piotrsawickas
    Poziom 11  
    Posty: 28
    Pomógł: 6
    Ocena: 11
    >>21254228
    Jeszcze kilka uwag co do kodu. Jak już będziesz robić tę lepszą wersję, to koniecznie włącz watchdoga. To jest podstawa, aby mikrokontroler został zresetowany, gdy hardware wejdzie w dziwny, nieustalony stan. Skonfiguruj też Brown-out detection.
    Jak będziesz robił protokół do komunikacji, to uwzględnij też komunikaty zwrotne wysyłane z mikrokontrolera, np. wiadomość, że układ wstał, możliwość pobrania statusu załączenia elektrozaworów na żądanie.
  • Pomocny post
    #13 21254339
    TMSU
    Poziom 12  
    Posty: 41
    Pomógł: 7
    Ocena: 14
    >>21254314 Fullduplex czy multimaster? Jak multimaster, to raczej szedłbym w kierunku CAN. Slave jest slavem, dlatego że nie pytany, nie gada, a skoro ma odpowiadać na pytania, to jest halfduplex. Arduino i Nucleo w większości przypadków są źle zaprojektowane, to nie są płytki referencyjne, nie ma żadnych badań. Tam nawet nie ma jak dobrze masę wyprowadzić. Kiedyś nawet widziałem przypadek, gdzie któryś Discovery z mikrokontrolerem STM32F7 lub STM32H7 ma schrzaniony layout pod SDRAM, ktoś skopiował ten layout i SDRAM się krzaczył.

    Skoro to jest dwustronna płytka, to gdzie się da na całej górnej warstwie wylej masę. Jeśli będziesz zlecał płytkę, to dla producenta jest to najlepsza opcja, im mniej do trawienia, tym lepiej.

    O STM32F103 już zapomnij, to są starocie, w większości już popodrabiane. Jak masz zamiar wejść w STM32, to najlepiej seria G, np. STM32G0B1, bardzo fajna i niedroga wersja z mnóstwem fajnych peryferiów
    Płytka STM32G0B1CBT6 WeAct Studio z ceną 14,49 zł

    Dodano po 7 [minuty]:

    >>21254314
    RebellionArts napisał:
    Ale ciekawi mnie wyciągnięcie 24V bezpośrednio ze złącza, czy naprawdę ma duży wpływ to, że idzie on kilka cm jedną gałęzią?

    Nie ma znaczenia, ale ścieżka 24V powinna być dość szeroka, im szersza tym mniejsza impedancja. Jeśli za stabilizatorem/przetwornicą będzie w miarę duży kondensator elektrolityczny, to zakłócenia na linii 24V nie powinny wpływać na pracę układu za przetwornicą. Daj dodatkową diodę i kondensator elektrolityczny 100-330uf/35V przed stabilizatorem (kondensator LowESR jeśli to będzie przetwornica).
  • #14 21256140
    RebellionArts
    Poziom 23  
    Posty: 594
    Pomógł: 56
    Ocena: 150
    Dziękuje wszystkim za odpowiedzi. Bardzo mi niektóre pomogły.
    Pozdrawiam
    Temat zamykam
  • #15 21256141
    RebellionArts
    Poziom 23  
    Posty: 594
    Pomógł: 56
    Ocena: 150
    Temat został zamknięty

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik zaprojektował układ do sterowania zaworami 24V z użyciem mikrokontrolera ATMega328P-PU oraz tranzystora 2N2222A. Napotkał problemy z działaniem układu, które mogą wynikać z błędów w projektowaniu płytki PCB, w tym niewłaściwego prowadzenia linii I2C oraz zasilania. Użytkownik planuje wprowadzenie poprawek w wersji v2, w tym zastosowanie transoptorów, oddzielenie mas oraz lepsze zabezpieczenia przed zakłóceniami. W dyskusji poruszono również kwestie dotyczące protokołów komunikacyjnych, sugerując użycie RS485 lub CAN dla lepszej odporności na zakłócenia. Użytkownik został również zachęcony do dodania logów debugowych oraz do rozważenia zastosowania watchdog'a w kodzie.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA