Elektroda.pl
Elektroda.pl
X
Relpol przekaźniki
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Sterownik na atmega328 zawiesza się

09 Paź 2019 15:57 219 18
  • Poziom 8  
    Witam, robię prosty sterownik na atmega328, jest tam badanie temperatury i wilgotności (dht22) , enkoder do sterowania menu i buzzer do alarmów jeśli temperatura przekroczy jakieś zakresy. Całość steruje dwoma przekaźnikami jeden odpowiada za grzanie a drugi za robienie pary.

    Zasilanie to tania mocno "chińska" ładowarka od telefonu wyrzucona do obudowy o wydajności 1A
    Jest też wyświetlacz LCD 1602

    Niestety napotkałem problem, ponieważ sterownik lubi się zawiesić a często samo zawieszenie poprzedza kilka restartów urządzenia (na tą okoliczność dodałem na ekranie licznik który zwiększa swoją wartości przy każdym włączeniu)

    Całość jest też upakowana w niedużej obudowie.
    Zasilanie AC jest pociagniete po pcb tak aby można było do sterownika wpinac wtyczki od urządzeń, pod tą gałąź zasilania podłączona jest też ta chińska ładowarka.

    Moje spostrzeżenia:
    Urządzenie zawiesza się zwykle po kilku godzinach pracy (zwykle koło 8 godzin) ale nie jest to reguła, czasami zawis występuje wcześniej i często poprzedza go kilka restartów

    Ładowarka dość mocno się grzeje, termowizja pokazuje 50 stopni na obudowie zasilacza po 15 minutach pracy

    Po tych kilku godzinach kiedy dojdzie do zawieszenia się urządzenia w obudowie jest odczuwalne dużo ciepłej niż na zewnątrz (niestety nie sprawdzałem termowizja)

    Moje podejrzenia na chwilę obecną to chiński zasilacz/ładowarka, czy wyższa temperatura może jakoś wpłynąć na jej prace?

    Znalazłem też kilka informacji o dht22 który lubi się zawieszac, jeśli ktoś ma jakieś doświadczenia to też proszę o porady

    Niektórzy wskazują na przekaźniki które potrafią zakłócać pracę avr, czy to prawda? (dookoła procesora jest sporo przewodów)

    Jaka jest temperatura przy której ta atmega może się zawieszac?

    Spotkałem się też z opiniami, że atmega nie nadaje się do takich zadań

    Za wszystkie sugestie będę bardzo wdzięczny
  • Relpol przekaźniki
  • Poziom 34  
    Proponuję nie pisać bzdur i nie czytać tychże znalezionych w internecie. Atmega i wiele innych mikrokontrolerów nadają się do tworzenia różnych sterowników. Niestety nie podałeś praktycznie żadnych danych mogących pomóc zdiagnozować problem. W szczególności:
    -brak dokładnego schematu układu (wiele błędów może powodować zawieszenie AVR i nie zawsze muszą to być błędy sprzętowe)
    -brak wstawienia fotografii wykonanego urządzenia.

    Generalnie nie wiadomo jak sterujesz przekaźnikami, czy są kondensatory odsprzęgające, co z linią RESET, pracujesz z rezonatorem kwarcowym, czy wewnętrznym RC, czy napięcie zasilania jest poprawne i stabilne, co robisz z nieużywanymi liniami, co z AVCC itd.
  • Poziom 8  
    maciej_333 napisał:
    Proponuję nie pisać bzdur i nie czytać tychże znalezionych w internecie. Atmega i wiele innych mikrokontrolerów nadają się do tworzenia różnych sterowników. Niestety nie podałeś praktycznie żadnych danych mogących pomóc zdiagnozować problem. W szczególności:
    -brak dokładnego schematu układu (wiele błędów może powodować zawieszenie AVR i nie zawsze muszą to być błędy sprzętowe)
    -brak wstawienia fotografii wykonanego urządzenia.

    Generalnie nie wiadomo jak sterujesz przekaźnikami, czy są kondensatory odsprzęgające, co z linią RESET, pracujesz z rezonatorem kwarcowym, czy wewnętrznym RC, czy napięcie zasilania jest poprawne i stabilne, co robisz z nieużywanymi liniami, co z AVCC itd.


    załączam schemat i pcb. zdjęcia jak jest to złożone dodam później bo na chwilę obecną nie mam urządzenia pod ręką.

    Na schemacie i pcb są trzy przekaźniki ale sterowanie i sam trzeci przekaźnik nie są nawet wlutowane.

    Reset nie jest używany, podłączony jest tylko do pinu programatora, rezonator 16Mhz, nieużywane linie nie są zdefiniowane (teraz wiem, że to błąd będzie to zaraz naprawione)

    Dodatkowo zauważyłem, że po około godzinie pracy na ekranie lcd widać biegające linie jakby odświeżanie, z mojego doświadczenia wynika, że coś takiego się dzieje kiedy napięcie zasilania spada. Co ciekawe dzieje się tak kiedy oba przekaźniki są wyłączone, a kiedy któryś z nich się włączy to lcd lekko się rozjaśnia i linie znikają tak jakby napięcie wzrosło
  • Relpol przekaźniki
  • Poziom 34  
    Schemat jest narysowany tragicznie. Powinno się stosować przynajmniej w pewnym stopniu etykiety i ewentualnie czasem magistrale. Czy dobrze rozumiem, że zasilanie całości jest podane przez szeregowy rezystor R8? Już sam ten pomysł stanowi poważny błąd. Zakładam poprawne napięcie zasilania +5 V. Mierzyłeś to? Jakie jest zastosowanie C2? Odnośnie płytki, to kwarc jest za daleko od mikrokontrolera. W tym projekcie można przejść na wewnętrzny oscylator RC. Ponadto łuk elektryczny powstający na stykach przekaźników umieszczonych tak blisko mikrokontrolera też może go zawiesić. Inna sprawa to prowadzenie ścieżek od styków przekaźników. Łączenie równoległe styków to średni pomysł lepsze byłby przekaźniki o większej obciążalności. Obciążenie linii programatora diodą i rezystorem może ewentualnie powodować problem, jeśli programator nie ma wystarczającej obciążalności wyjść. Jaki jest sens stosowania transoptorów przy sterowaniu przekaźnikami?
  • Poziom 8  
    maciej_333 napisał:
    Schemat jest narysowany tragicznie. Powinno się stosować przynajmniej w pewnym stopniu etykiety i ewentualnie czasem magistrale. Czy dobrze rozumiem, że zasilanie całości jest podane przez szeregowy rezystor R8? Już sam ten pomysł stanowi poważny błąd. Zakładam poprawne napięcie zasilania +5 V. Mierzyłeś to? Jakie jest zastosowanie C2? Odnośnie płytki, to kwarc jest za daleko od mikrokontrolera. W tym projekcie można przejść na wewnętrzny oscylator RC. Ponadto łuk elektryczny powstający na stykach przekaźników umieszczonych tak blisko mikrokontrolera też może go zawiesić. Inna sprawa to prowadzenie ścieżek od styków przekaźników. Łączenie równoległe styków to średni pomysł lepsze byłby przekaźniki o większej obciążalności. Obciążenie linii programatora diodą i rezystorem może ewentualnie powodować problem, jeśli programator nie ma wystarczającej obciążalności wyjść. Jaki jest sens stosowania transoptorów przy sterowaniu przekaźnikami?



    Schemat rzeczywiście może być mało czytelny ponieważ robiłem w nim kilka zmian na szybko, R8 to dioda LED dla sygnalizacji power, zasilanie oczywiście nie jest podłączone przez rezystor, wejście zasilania to x-1 i x-2. Płytka ma wymiary 10x10cm procesor od przekaźnika znajduje się w odległości 6-7cm przekaźniki są oczywiście na 5v. Mógłbym spróbować to ekranowac jeśli uważasz, że to może być problem. Co do rezonatora, mogę przejść na wewnętrzny. Zastosowałem zewnętrzny z uwagi na zalecenia (większą stabilność). Dioda była w przykładowej aplikacji i sprawdzaja się bardzo dobrze. Nie miałem problemu z programowaniem układu.

    C2 to element dla złącza uart, nie używam go, został głównie dla serial monitora ale ostatecznie nawet raz go nie podłączyłem.

    Zasilanie 5v jest ale tak jak pisałem nie jest idealnie stabilne

    Transoptory zostały ponieważ z początku chciałem zastosować zasilacz stabilizowany na tym pcb i napięcie dla cewek przekaźnikow chciałem brać z osobnego stabilizatora ale zabrakło miejsca na pcb na transformator i stąd pomysł chińskiego zasilacza, a transoptory zostały na wypadek problemów (które jak widać wyszły) miały spełniać swoje zadanie, izolacji galwanicznej i ochrony przed zakloceniami
  • Poziom 34  
    Widać zatem, że do złącza POWER dołączono diodę. Skoro tak się rysuje schematy...

    Te transoptory nie spełniają swojej roli. Nie ma tu izolacji galwanicznej cewek przekaźników od mikrokontrolera. Zresztą nie ma to sensu, skoro przekaźniki zapewniają izolację galwaniczną. Radziłbym zrezygnować z rezonatora kwarcowego, skoro prowadzenie ścieżek wokół niego jest błędne. Przyglądałem się tej płytce i nie dostrzegłem, by odległość do przekaźników była tak duża. Dlaczego na zasilaniu nigdzie nie ma kondensatora elektrolitycznego większej pojemności? Zasilanie może powodować RESET. Możesz zresztą odczytać, co było jego powodem.
  • Poziom 8  
    maciej_333 napisał:
    Widać zatem, że do złącza POWER dołączono diodę. Skoro tak się rysuje schematy...

    Te transoptory nie spełniają swojej roli. Nie ma tu izolacji galwanicznej cewek przekaźników od mikrokontrolera. Zresztą nie ma to sensu, skoro przekaźniki zapewniają izolację galwaniczną. Radziłbym zrezygnować z rezonatora kwarcowego, skoro prowadzenie ścieżek wokół niego jest błędne. Przyglądałem się tej płytce i nie dostrzegłem, by odległość do przekaźników była tak duża. Dlaczego na zasilaniu nigdzie nie ma kondensatora elektrolitycznego większej pojemności? Zasilanie może powodować RESET. Możesz zresztą odczytać, co było jego powodem.



    Wiem, że transoptory w tym układzie nie spełniają swojego zadania ale to nie jest wersja ostateczna dlatego zostały, one chyba nie powinny powodować błędnej pracy atmegi. Złącze power tak jak pisałem jest dla diody Led i powinno nazywać się power led, złącze zasilania ma nazwę vcc in.

    Aktualnie pracuje ten przekaźnik który jest najbardziej odsunięty od procesora

    Kondensatora na wejściu zasilania nie ma bo o nim zapomniałem. Jest dodany na przewodach zasilacza 4700uF.

    Rozumem, że na pewno rezonator jest źle umiejscowiony? Bo podłączenie na schemacie jak rozumiem jest poprawne?

    W jaki sposób odczytać co było powodem resetu?
  • Poziom 34  
    Powód wystąpienia RESET'u można odczytać z rejestru MCUSR - strona 54 datasheet. Jeśli powodem jest np. flaga PORF, albo BORF, to problem może leżeć po stronie zasilania. W przypadku, gdy dojdzie do RESET'u, ale wszystkie flagi będą zerowe, to powód leży w programie - np. przeciążenie stosu, przerwanie które wystąpiło, ale nie ma dla niego wektora w tablicy wektorów przerwań itd. Ścieżki idące do kwarcu są zdecydowanie za długie. Zresztą do czego tu aż 16 MHz?

    Z kondensatorem o tak dużej pojemności niektóre zasilacze impulsowe mogą się nie uruchomić.
  • Poziom 8  
    maciej_333 napisał:
    Powód wystąpienia RESET'u można odczytać z rejestru MCUSR - strona 54 datasheet. Jeśli powodem jest np. flaga PORF, albo BORF, to problem może leżeć po stronie zasilania. W przypadku, gdy dojdzie do RESET'u, ale wszystkie flagi będą zerowe, to powód leży w programie - np. przeciążenie stosu, przerwanie które wystąpiło, ale nie ma dla niego wektora w tablicy wektorów przerwań itd. Ścieżki idące do kwarcu są zdecydowanie za długie. Zresztą do czego tu aż 16 MHz?

    Z kondensatorem o tak dużej pojemności niektóre zasilacze impulsowe mogą się nie uruchomić.


    Jaki kondensator będzie bardziej odpowiedni?

    Z ciekawości, skoro dałem za daleko ten rezonator to dlaczego na płytce arduino uno jest on jeszcze dalej od procesora?

    Dzięki za info o MCUSR, to się na pewno przyda. Dodam, że nie używam żadnego bootloadera w procesorze tego sterownika.

    Czy muszę wyjąć ten rezonator fizycznie z pcb? Czy wystarczy, że przy programowaniu układu wybiorę internal rc?
  • Poziom 34  
    Wystarczy odpowiednio przestawić FUSE BITY. Generalnie ścieżki łączące rezonator z mikrokontrolerem powinny być krótkie. Fakt iż w płytce Arduino zrobiono to w taki sposób nie świadczy o poprawności. Zobacz zresztą to: Link. Wejście wzmacniacza w takim układzie ma wysoką impedancję, wartość napięcia jest ograniczona, więc łatwo o indukowanie się zakłóceń. Przy długich ścieżkach w tym miejscu będą problemy z EMC. W dokumentacji Atmegi328 też o tym piszą na stronie 28. Można ewentualnie przestawić FUSE BITY na "Full Swing Crystal Oscillator" - strona 30. Pewnie z takim ustawieniem działa Arduino.
  • Poziom 8  
    maciej_333 napisał:
    Wystarczy odpowiednio przestawić FUSE BITY. Generalnie ścieżki łączące rezonator z mikrokontrolerem powinny być krótkie. Fakt iż w płytce Arduino zrobiono to w taki sposób nie świadczy o poprawności. Zobacz zresztą to: Link. Wejście wzmacniacza w takim układzie ma wysoką impedancję, wartość napięcia jest ograniczona, więc łatwo o indukowanie się zakłóceń. Przy długich ścieżkach w tym miejscu będą problemy z EMC. W dokumentacji Atmegi328 też o tym piszą na stronie 28. Można ewentualnie przestawić FUSE BITY na "Full Swing Crystal Oscillator" - strona 30. Pewnie z takim ustawieniem działa Arduino.


    Jako, że programuje ten kontroler przez arduino ide (arduino as ISP) a w fuse bitach nigdy nie grzebałem, to pozwolę sobie zapytać czy jeśli w ide ustawie programator na programowanie z internal rc i nie usunę kwarcu z pcb to czy tak może to działać?
  • Poziom 34  
    Kwarc może zostać. Jeśli nic nie robiłeś z FUSE BITAMI i wstawiłeś nowy mikrokontroler, to domyślnie kwarc jest wyłączony. Fabryczne ustawienia to: CKSEL = "0010", SUT = "10", CKDIV8 = "0". Zatem jest to wewnętrzny oscylator RC 8 MHz z podziałem przez 8, zatem zegar wyniesie 1 MHz (strona 27). Kalkulator FUSE BITÓW masz tutaj: Link.
  • Poziom 8  
    maciej_333 napisał:
    Kwarc może zostać. Jeśli nic nie robiłeś z FUSE BITAMI i wstawiłeś nowy mikrokontroler, to domyślnie kwarc jest wyłączony. Fabryczne ustawienia to: CKSEL = "0010", SUT = "10", CKDIV8 = "0". Zatem jest to wewnętrzny oscylator RC 8 MHz z podziałem przez 8, zatem zegar wyniesie 1 MHz (strona 27). Kalkulator FUSE BITÓW masz tutaj: Link.


    Tak jak napisałem, nic nie robiłem z fuse bitami, mikrokontroler jest nowy, nie miał nawet bootloadera, wgrałem go przy pomocy arduino używając uno jako programatora ISP. Będę musiał jeszcze trochę poczytać bo czym są fuse bity wiem ale jeśli dobrze rozumiem, to być może mimo, że wybrałem zewnętrzny oscylator przy programowaniu to mój kontroler działa na 1Mhz
  • Poziom 34  
    Nie do końca rozumiem co piszesz i nie wiem po co cytujesz całą moją wypowiedź. Właściwie dostałeś odpowiedzi na wszystkie swoje pytania. Z ostatniej wypowiedzi nawet nie wiadomo jak programujesz mikrokontroler (bootloader Arduino, czy ISP). Nie ma to jednak wpływu na brak stabilnej pracy układu o ile zostały ustawienia domyślne. Ponadto błędne ustawienia FUSE BITÓW mogą zablokować mikrokontroler.
  • Poziom 8  
    Już chyba wiem, dlaczego się nie rozumiemy. Nie mam normalnego programator ISP, ale mam arduino uno jako osobne urządzenie z własnym procesorem. Tak się składa, że arduino można zaprogramować aby działało jako programator. I podłączając arduino (jako programator) do mojego sterownika jestem w stanie programować go jak za pomocą programatora. Oprogramowanie jakiego używam nazywa się miniCore. Podczas programowania mogę wybrać kilka opcji między innymi wybieram czy ma być zewnetrzny oscylator jeśli tak to jaki i kilka innych rzeczy np bootloader (ja wybieram bez) Cały czas byłem przekonany, że jeśli wybieram oscylator 16Mhz zewnętrzny to miniCore samo przestawi fuse bity podczas programowania. Ale teraz nie jestem tego pewien.
  • Poziom 34  
    Odczytaj zatem w jakichś opcjach tego środowiska wartości LFUSE, HFUSE i EFUSE. Dowiesz się z tego wszystkiego. Wystarczy to wpisać do podanego przez mnie kalkulatora. Domyślne wartości to: LFUSE=0x62, HFUSE=0xD9 i EFUSE=0xFF.
  • Poziom 31  
    By ustawić uC do pracy w Arduino trzeba wgrać bootloader. Wgranie bootloadera to nie tylko wgranie programu, ale przede wszystkim ustawienie fuse bitów. Tak że jeśli to zrobiłeś, to masz je ustawione tak jak skonfigurowałeś w menu. Jeśli coś w menu zmieniasz, to wgrywasz na nowo bootloader co przy okazji ustawia fuse bity.
  • Poziom 34  
    kataklysm101 napisał:
    tak się składa, że arduino można zaprogramować aby działało jako programator. I podłączając arduino (jako programator) do mojego sterownika jestem w stanie programować go jak za pomocą programatora. Oprogramowanie jakiego używam nazywa się miniCore. Podczas

    Coś mieszasz. MiniCore to akurat jest bootloader plus Arduino Core dla ATmega328/ATmega168/ATmega88/ATmega48/ATmega8.
    Czy wykorzystujesz interfejs ISP (MOSI,MISO,SCK) w swoim sterowniku do programowania atmegi?

    kataklysm101 napisał:
    Cały czas byłem przekonany, że jeśli wybieram oscylator 16Mhz zewnętrzny to miniCore samo przestawi fuse bity podczas programowania.

    Owszem tak się dzieje, kiedy wgrywasz bootloader bezpośrednio z Arduino IDE. Oczywiście robi się za pomocą programatora podpiętego do ISP docelowego MCU (może być to ArduinoISP). Jak będziesz wgrywał tylko sam program przez ISP, to żadne fusebity nie ulegną modyfikacji.