Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Relpol przekaźnikiRelpol 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.

[Atmega8] Sterowanie stycznika przez przekaźnik

01 Wrz 2010 15:51 4228 9
  • Poziom 13  
    Witam!

    Wykonałem układ do włączania silnika AC lecz mam problem przy sterowaniu. Zadaniem układu jest włączanie silnika na czas ustawiony dowolnie w sterowniku. Układ działa bardzo dobrze bez obciążenia, lecz po podłączeniu przekaźnika pod stycznik uruchomiający silnik czasem zdarza tak, iż po naciśnięciu przycisku "start/stop" przekaźnik zewrze się po czym od razu się rozłączy. Początkowo myślałem, iż jest to sprawa zakłóceń - sprawdziłem - atmega nie resetuje się. Zauważyłem jednak dziwną rzecz, a mianowicie: wygląda to tak jakby timer zliczający czas w dół resetował się w momencie załączenia się stycznika. Drganie styków włącznika też można wyeliminować gdyż flaga zmiany stanu włącznika podczas samoczynnego wyłączenia pozostaje w stanie jak po włączeniu. Czy ktoś spotkał się może z taki zachowaniem? I ma może pomysły co można by z tym zrobić? Poniżej kod programu oraz schemat.
    Code:
    $regfile = "m8def.dat"
    
    $crystal = 16000000

    Config Portd = Output

    Config Pinc.0 = Output                                      ' tranzystory
    Config Pinc.1 = Output
    Config Pinc.2 = Output
    Config Pinc.3 = Output
    Config Pinc.4 = Output
    Config Pinc.5 = Output

    Config Pinb.0 = Input                                       'przyciski
    Config Pinb.1 = Input
    Config Pinb.2 = Input
    Config Pinb.3 = Input
    Config Pinb.4 = Input
    Config Pinb.5 = Output

    Config Debounce = 100

    Set Portb.0
    Set Portb.1
    Set Portb.2
    Set Portb.3
    Set Portb.4

    Reset Portc.4
    Reset Portc.5

    Config Timer0 = Timer , Prescale = 256

    Declare Sub Pobr_znaku(cyfra As Byte)

    Config Timer1 = Timer , Prescale = 256

    On Timer0 Mult_wysw
    On Timer1 Odmierz_1s


    Dim S As Integer
    Dim M As Integer
    Dim Nowa_w As Bit

    Dim S_e As Integer
    Dim M_e As Integer


    Dim Wart_bcd As Byte

    Dim A As Byte
    Dim B As Byte
    Dim C As Byte
    Dim D As Byte
    Dim X As Byte
    Dim Y As Byte
    Dim Z As Byte
    Dim W As Byte
    Dim P As Byte

    X = 0
    Z = 0
    W = 0

    Dim Nr_wysw As Byte

    W1 Alias Portc.3
    W2 Alias Portc.2
    W3 Alias Portc.1
    W4 Alias Portc.0

    S1 Alias Pinb.0
    S2 Alias Pinb.1
    S3 Alias Pinb.2
    S4 Alias Pinb.3

    Mg Alias Pinb.4

    Enable Interrupts

    Enable Timer0
    Load Timer0 , 125

    Counter1 = 3036

    Set Nowa_w

    Readeeprom S_e , 9
    S = S_e

    Readeeprom M_e , 7
    M = M_e


    Set Portc.5
    Wait 5
    Reset Portc.5


    Do

    Portb.2 = 1
    Portb.3 = 1

    Select Case Mg

    Case 1 : Gosub Alarm

    Case 0 : Gosub Wysw_czas

    If W = 0 Then Debounce S4 , 0 , Ustawienia , Sub

    End Select

    Loop
    End

    Ustawienia:

    Set Portc.5
    Disable Timer1

    Readeeprom S_e , 9
    S = S_e

    Readeeprom M_e , 7
    M = M_e

    Do

    If S2 = 0 Then
    Waitms 125
    Incr S

    If S > 59 Then
    S = 0

    Incr M

    If M > 10 Then
    M = 10
    S = 59

    End If
    End If
    End If

    If S3 = 0 Then

    Waitms 125

    Decr S

    If S < 0 Then
    S = 59

    Decr M

    If M < 0 Then
    M = 0
    S = 0

    End If
    End If
    End If

    Debounce S4 , 0 , Ustaw , Sub

    D = M / 10
    C = M Mod 10
    B = S / 10
    A = S Mod 10

    Loop Until Y = 1


    Reset Y
    Reset Portc.5

    S_e = S
    Writeeeprom S_e , 9

    M_e = M
    Writeeeprom M_e , 7

    Return


    Odmierz_1s:

    Counter1 = Counter1 + 3036

    Decr S

    Set Nowa_w

       If S < 0 Then
       S = 59

       Decr M
       If M < 0 Then
       M = 0
       S = 0

       Disable Timer1

       Reset Portc.4
       Reset X
       Reset W
       Readeeprom S_e , 9
       S = S_e

       Readeeprom M_e , 7
       M = M_e

       End If
       End If

    Return

    Sub Pobr_znaku(cyfra As Byte)
    Portd = Lookup(cyfra , Kody7seg)
    End Sub


    Mult_wysw:

    Load Timer0 , 150

    Set W1
    Set W2
    Set W3
    Set W4

    Select Case Nr_wysw

    Case 0:
    Call Pobr_znaku(a)
    Reset W1


    Case 1:
    Call Pobr_znaku(b)
    Reset W2

    Case 2:
    Call Pobr_znaku(c)
    Reset W3


    Case 3:
    Call Pobr_znaku(d)
    Reset W4

    End Select

    Incr Nr_wysw
    If Nr_wysw = 4 Then
    Nr_wysw = 0
    End If
    Return

    Kody7seg:
    Data &B01000000 , &B01111001 , &B00100100 , &B00110000 , &B00011001 ,
    Data &B00010010 , &B00000010 , &B01111000 , &B00000000 , &B00010000 ,
    Data &B10010010 , &B11001110 , &B11000000 , &B10001100


    Wysw_czas:

    Select Case W

    Case 0 : Debounce S1 , 0 , Pr , Sub

    Case 1 : Debounce S1 , 0 , Pr1 , Sub

    End Select


    D = M / 10
    C = M Mod 10
    B = S / 10
    A = S Mod 10

    If Nowa_w = 1 Then

    Wart_bcd = Makebcd(m)
    Locate 1 , 4

    Wart_bcd = Makebcd(s)
    Locate 1 , 7

    Reset Nowa_w


    End If

    Return



    Alarm:

    Disable Timer1

    D = 10
    C = 11
    B = 12
    A = 13

    Reset Portc.4

    Reset X

    Do

    Loop Until Mg = 0


    Readeeprom S_e , 9
    S = S_e

    Readeeprom M_e , 7
    M = M_e



    Return

    Pr:

    Set W

    Enable Timer1

    Set Portc.4

    Return


    Pr1:

    Disable Timer1

    Reset Portc.4

    Readeeprom S_e , 9
    S = S_e

    Readeeprom M_e , 7
    M = M_e

    Reset W

    Return

    Ustaw:
    Set Y
    Return


    Sterowanie
    [Atmega8] Sterowanie stycznika przez przekaźnik

    Zasilanie

    [Atmega8] Sterowanie stycznika przez przekaźnik[/img]
    [3.12.2020, webinar] Zagadnienia pomiarowe w nowoczesnej inżynierii materiałowej. Zarejestruj się
  • Relpol przekaźnikiRelpol przekaźniki
  • Poziom 28  
    Dioda przy przekaźniku powinna być odwrotnie.
  • Poziom 13  
    Czyli ma być wstawiona zaporowo?
    Nie pamiętam już czy to nie błąd na schemacie...ale mogło by to mieć wpływ na takie działanie mojego układu?
  • Relpol przekaźnikiRelpol przekaźniki
  • Moderator Mikrokontrolery Projektowanie
    Jeśli diodę umieściłeś tak jak na schemacie to przekaźnik nie miał prawa się włączyć, chybą, że pierwsza jego próba włączenia spaliła diodę. Powinn ona być umieszczona zaporowo, bo jej istotą jest obcinanie szpilek napięcia indukującego się na cewce przekaźnika w chwili wyłączania.
    Z drugiej strony skąd wiesz, że procesor się nie resetuje? Może tylko EMI powoduje jego chwilowe nieprawidłowe działanie. I co to jest ten kondensator opisany jako Cewa?
  • Poziom 13  
    Tak też myślałem, że z tą diodą był to błąd na schemacie, bo przekaźnik działa dobrze, a samą diodę zmieniłem na szybką 1n4818.
    Nie resetuje się bo napisałem procedurę, która jest przed pętlą do...loop end i nie wchodzi do niej (trwa 5s więc na pewno bym widział). Ten kondensator to cewka - dławik. No więc co byś proponował zrobić, bo tak jak pisałem wcześniej wygląda to tak jakby resetował się timer odpowiedzialny za odliczanie czasu.
  • Poziom 30  
    AVCC przez kondensator do VCC?
  • Moderator Mikrokontrolery Projektowanie
    Sprawdź polaryzację tej diody, być może się spaliła i dlatego przekaźnik działa :) Kolejną rzeczą jest sprawdzenie czy to nie zakłócenia - podłącz mniejsze obciążenie. Odsuń też przekaźnik maksymalnie daleko od procesora, spróbuj do nie podłączać pod 5V zasilające procesor, tylko daj mu osobne zasilanie.
  • Poziom 10  
    Piszesz że flaga załączenia po samoczynnym wyłączeniu pozostaje taka sama, a co z napięciem na pinie procesora sterującym przekaźnikiem? Co z nim?
  • Pomocny post
    Poziom 28  
    Do przeładowania Timer'a1 używaj:

    Code:
    Int_timer1:
    
       Load Timer1 , 62500
       [...]
    Return


    Mam jeszcze jedną regułę z przeszłości aby nie używać obsługi pamięci EEPROM w obsłudze przerwań (starsze wersje BASCOM'a przy rozbudowanych programach powodowały błędne działanie programu). Stosuję to do dziś dnia i nie mam zamiaru sprawdzać to w nowszych wersjach BASCOM'a.

    1. Dodaj kilka 100nF X7R na zasilaniu + tantale oraz zlikwiduj błąd przy AVCC jak już wcześniej jeden z kolegów zauważył
    2. Zamień kondensatory przy kwarcu z 33pF na 18pF
    3. Zrób program testowy:
    a) w przerwaniu co 1s zwiększaj liczbę i wyświetlaj ją na wyświetlaczu
    b) załączaj przekaźnik ręcznie (z realnym obciążeniem na styczniku) przy użyciu switch'a podpiętego do portu
    c) zobacz czy licznik dalej odlicza po wystąpieniu błędu oraz sprawdź realne napięcie na pinie sterowania przekaźnikiem.
  • Poziom 13  
    Witam! Trochę mi to zajęło ale uruchomiłem w końcu mój projekt. Okazało się, iż problem leżał w zakłóceniach sieciowych pojawiających się w momencie włączania silnika. Rozwiązanie: rozdzieliłem masy układu wykonawczego oraz sterowania oraz zbudowałem prosty filtr sieciowy. Pozdrawiam i dzięki za pomoc!!!