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

[Atmega8] Sterowanie stycznika przez przekaźnik

lenny35 01 Wrz 2010 15:51 4639 9
  • #1 8464383
    lenny35
    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.
    $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]
  • #2 8464424
    Jaca
    Poziom 31  
    Dioda przy przekaźniku powinna być odwrotnie.
  • #3 8464441
    lenny35
    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?
  • #4 8464837
    tmf
    VIP Zasłużony dla elektroda
    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?
  • #5 8465020
    lenny35
    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.
  • #6 8465108
    landy13
    Poziom 31  
    AVCC przez kondensator do VCC?
  • #7 8465110
    tmf
    VIP Zasłużony dla elektroda
    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.
  • #8 8465422
    nomar600
    Poziom 11  
    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
    #9 8465552
    Jaca
    Poziom 31  
    Do przeładowania Timer'a1 używaj:

    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.
  • #10 8488520
    lenny35
    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!!!
REKLAMA