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

Atmega8, PC814, BT136, detektor zera-regulacja fazowa wł/wył

pawcio4 27 Gru 2010 15:47 8231 11
REKLAMA
  • #1 8919097
    pawcio4
    Poziom 11  
    Witam.
    Od razu przepraszam jeśli taki temat już istnieje, ale ani w google ani elce nie otrzymałem odpowiedzi na mój problem.

    Chciałbym zrobić regulacje fazową wentylatora klatkowego kotłowego do 100W.
    Mam kocioł węglowy w domu i chciałbym zmienić wentylator na klatkowy ze względu na pobór prądu. Aktualnie kocioł pracuje na wentylatorze na prąd stały i regulacja obrotów zrealizowana jest na PWMie.

    Parę tematów na ten temat już było ale nie rozumiem tych programów oraz wszyscy robią to na zasadzie wcisnę przycisk będzie szybciej ,wcisnę drugi będzie wolniej.
    Chciałbym żeby wentylator miał tylko 11 stopniową regulacje którą sczyta z tabeli
    np:
    stop
    10%
    20%
    30%
    ...100%

    zbudowałem układ testowy: Atmega8, PC814, BT136, detektor zera-regulacja fazowa wł/wył
    wgrałem program ze strony : http://avrprojects.info/avr-projects/digital-dimmer-using-atmega8/
    i nie działa. No i dobrze ze nie działa bo mój układ wystawia na INT0 stan niski gdy jest w górnej lub w dolnej połówce sinusoidy a układ ze strony "avrprojects" wystawia stan niski gdy faktycznie przechodzi przez zero. Jak przerobić program by wyszedł mój zamierzony efekt, i czy od razu ktoś może mi wytłumaczyć działanie tego programu a szczególnie reakcje na przyciski?
    $regfile = "m8def.dat"
    $crystal = 4000000
    
    Config Pinb.1 = Output                                      ' Gate Triac
    Config Pind.7 = Input                                       ' Key Up
    Config Pinb.0 = Input                                       ' Key Dn
    
    Config Int0 = Rising
    On Int0 Int0_int                                            ' Initialise the INT0 Interrupt
    
    
    Enable Interrupts
    Enable Int0
    
    
    Dim E As Eram Byte
    Dim B As Byte
    Dim D As Byte
    
    If E > 9 Then E = 9
    B = E
    D = 0
    Set Portb.1
    
    Do
    
    If Pind.7 = 0 Then
     If B > 0 Then Decr B
     Waitms 10
     E = B
    End If
    
    If Pinb.0 = 0 Then
     If B < 9 Then Incr B
     Waitms 10
     E = B
    End If
    
    
    
    Loop
    
    End                                                         ' end program
    
    Int0_int:
    
    Set Portb.1
    For D = 0 To B
     Waitus 200
    Next D
    Reset Portb.1
    
    Return

    Z góry dziękuję za wszelkie zainteresowanie, sugestie, linki, pomoc.
  • REKLAMA
  • #2 8924677
    LordBlick
    VIP Zasłużony dla elektroda
    1. Z tego co widzę, to na schemacie optotriak jest podłączony do PORTB5, a w programie nigdzie nie jest to skonfigurowane - PINX to jest port wejściowy, a nie wyjściowy (PORTX) w AVR...
    2. Pętla w obsłudze przerwania i to z obijaniem się procesorka po kątach jest bzdurą - pomijasz wciśnięcia przycisków, gdy procesor siedzi w krzakach... Od pomiaru czasu jest timer, który powinien w tym momencie zostać załączony, a w przerwaniu od timera dopiero włączamy triaki i zatrzymujemy timer.
    3. Sterowanie silnikiem w sposób fazowy raczej nie jest dobrym pomysłem, częstotliwości sieci nie zmieniasz, więc prędkości obrotowej płynnie też nie będziesz zmieniał.
  • #3 8925947
    pawcio4
    Poziom 11  
    Racja na schemacie popełniłem błąd przepraszam. Optotriak podłączony jest pod portb.1
    kod powinien wyglądać tak?:
    
    Config Portb.1 = Output                                    
    Config Pind.7 = Input                                     
    Config Pinb.0 = Input
    


    Płynna regulacja nie jest potrzebna wystarczy skokowa co ok10%
    Tu jest podobny wątek https://www.elektroda.pl/rtvforum/topic1495041-0.html ale nie rozumiem programów, być może dlatego, że sa napisane w c.
    Jak wykryć przejście przez zero i ustawić przerwania?
  • #4 8927189
    LordBlick
    VIP Zasłużony dla elektroda
    1. To, ze wystarczy co 10% nie zmienia faktu, że sterowanie fazowe robi się na timerze.
    2. Przejścia przez zero nie wykryjesz, ale wystarczy mierzyć czas pomiędzy przerwaniami i go odpowiedni interpretować, aby wiedzieć, w którym momencie to się dzieje.
    Przykładami niestety nie błysnę, bo jestem noga z Bascoma... ;)
  • REKLAMA
  • REKLAMA
  • #8 9007152
    LordBlick
    VIP Zasłużony dla elektroda
    pawcio4 napisał:
    Czy musze to robic za pomocą przerwań INTx?
    Nikt Ciebie nie zmusza, ale by wypadało... ;)
    W nowszych procesorkach są jeszcze do dyspozycji PCINT.
  • REKLAMA
  • #9 9007689
    pawcio4
    Poziom 11  
    chyba moja atmega tego nie ma ;P



    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Portc.0 = Input
    Config Portb.5 = Output
    Config Timer2 = Timer , Prescale = 64
    Config Int1 = Rising
    
    
     If Portc.0 = 0 Then          ' opuznienie = 1wartosc z tabeli jak to zrobic?
     If Portc.0 = 1 Then          ' opuznienie = 2wartosc z tabeli jak to zrobic?
    
    ...
    
    
    PWM_Table:
    Data 124 , 110 , 99 , 88 , 78 , 68 , 58 , 46 , 32 , 0


    Korzystałem z programu "Podział mocy " napisanego przez Jaca.
    Jak pobierać dane z tabeli?
    Czego mi jeszcze brakuje żeby zaczęło to działać?
  • #10 9008560
    Jaca
    Poziom 31  
    W moim poście wyżej masz również źródło BASCOM'a jak to wszystko połączyć w całość.
  • #11 9008635
    pawcio4
    Poziom 11  
    nie mozna tego zrobić w taki sposób:
    $regfile = "m8def.dat" 
    $crystal = 1000000 
    
    Config Portc.0 = Input 
    Config Portb.5 = Output 
    Config Timer2 = Timer , Prescale = 64 
    Config Int1 = Rising 
    
    Do
    
     If Portc.0 = 0 Then
    Timer = 124
     If Portc.0 = 1 Then          
    Timer = 110
    End If
    
    Loop
    
    
    PWM_Table: 
    Data 124 , 110 , 99 , 88 , 78 , 68 , 58 , 46 , 32 , 0
    ?


    Widziałem Twój program z linka podanego przez Ciebie ale nie rozumiem paru instrukcji.
    Jeśli chodzi o ten program:
  • #12 9008986
    Jaca
    Poziom 31  
    Tu masz opisane jak to działa:

    Link

    W moim przykładowym kodzie nie musisz wykorzystywać komunikacji po UART. Te kilka linijek kodu możesz usunąć.

    ps. Pytaj, jeśli czegoś nie rozumiesz... :)
REKLAMA