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

Sterwanie fazowe kilku odbiorników

17 Gru 2008 18:33 1412 6
  • Specjalista - oświetlenie sceniczne
    Jak z jednej 51ki sterować fazowo kiloma niezależnymi lampami?

    O ile z jedną sztuką nie ma problemu, o tyle nie wiem jak podejść np do trzech sztuk ;/
    Jak jednym timerem odliczyć czas załączenia triaka, nie porównując timera ze zmienną zbyt często?
  • Specjalista - oświetlenie sceniczne
    hmm jakiś slepy dziś jestem, dalej tego nie widze

    aktualnie robie to tak
    1. przerwanie od zera sieci, timer zaczyna odliczać

    2.Przerwanie od time, załączam triak, ładuje timer aby odliczył 0,1ms

    3. kolejne przerwanie od timera, wyłączam "zasilanie" bramki

    Bramki nie moge wylaczyć przerwaniu od zera, bo raz że synchronizuje sie za trafem, dwa steruje silnikiem. Suma, sumarum przesunięcie fazowe jest za duże

    Co widze, i chce uniknąć.
    Chcąc mieć 100 kroków regulacji, musiał bym tak ładować timer aby mieć przerwania co 100us. W każdym takim przerwaniu sprwdzić czy już przyszedł czas na odpalenie kórejś bramki triaka (np zwiększajać i porównująć zmienną z wartościami dla kąta zapłonu każdej bramki).
    Dobrze myśle?. Trochę mi to procka zagoni, jest na to jakiś inny sposób?
  • Pomocny post
    Poziom 42  
    przeanalizuj sobie dobrze ten kdzik poniżej bo on jest dobrze napisany - naprawdę ;)

    ja wprawdzie kiedyś przy okazju swojej wytrawiarki też zrobiłem sterowanie w Bascomie 2 odbiorników przy 75 krokach ale dałoby radę więcej kroków i jeszcze kilka odbiorników. Z tym, że już nie pamiętam dokładnie zagadnienia więc trudno mi się teraz znowu w to wgryzać. Ale pamiętam, że jakiś czas temu, gdy rozmawiałem na forum w tym linku który ci podałem to kolega autor wkleił kodzik, który sobie przeanalizowałem wtedy na szybko i ktoś to napisał dużo sprytniej jeszcze od mojego rozwiązania .... wykorzystując przy tym tylko zdaje się jeden Timer, więc radzę go przeanalizować tzn te fragmenty odpowiedzialne za sterowanie fazowe

    Code:
    $regfile = "2313DEF.dat" 
    
    $crystal = 10000000

    Dim Eaddress As Eram Byte At 2                              'adres pilota Rc5, zosatał umieszczony pod adresem 2 gdyż z doswiadczenia wiem, że komórki 0 i 1(szczególnie 0) pamięci EEPROM potrafią się skasować przy nagłych skokach napięcia zasilania
    Dim Epamiec(16) As Eram Byte At 3                           'tablica komend przycisków pilota


    Dim Lmram(4) As Byte                                        'cztery zmienne w których jest przechowywana informacja o aktualnym stanie jasnosci lamp
    Dim Address As Byte , Command As Byte                       'zmienne potrzebne do RC5
    Dim Licznik As Byte                                         ' ta zmienna jest potrzebna przy odliczaniu czasu nieświecenie każdej lampy
    Dim Ktora As Byte                                           'ta zmienna określa która lampa jest sterowana
    Dim Digit As Byte                                           'zmienna potrzebna przy zapisie odczycie pamięci eeprom
    Dim Nextlm As Byte                                          'zmienna pomocnicza
    Dim Upbit As Byte                                           '}
    Dim Downbit As Byte                                         ' }te zmienne przyjmuja tylko wartości 0 lub 255 - czyli w programie są traktowane jako bity
                                                                  ' (operacje na bajtach zajmują mniej pamięci FLASH, ale więcej RAMu) ustawiane są po nacisnieciu odp. przycisku na klawiaturze lub pilocie
    Dim Onoffall As Byte                                        'bit mówiący o włączeniu/wyłączeniu czterech lamp
    Dim Kod As Byte                                             'bit(patrz wyzej Upbit, Downbit) pomocniczy przy ustalaniu czy przycisk na pilocie jest trzymany

    Dim Pomocbit As Byte                                        '}
    Dim Pomocbit2 As Byte                                       ' }bity pomocnicze do zapamiętywania upbit i downbit

    Dim X As Byte                                               'zmienna potrzebna do odliczania czasu trzymania przycisku na pilocie potrzebnego do zapisania profilu
    Dim Pomocbit3 As Byte                                       'bit pomocniczy
    Dim Adr As Byte                                             'w tej zmiennej przechowywany jest obliczony adres dostepu do potrzebnego obszaru pamieci eeprom

    Dim Eonofflmgl As Eram Byte At 100                          'tu zapamietywana jest ostatnia wartość zmiennej Onofflmgl
    Dim Onofflmgl As Byte                                       'zmienna mówiaca o włączeniu/wyłączeniu lampy głównej

    Dim K As Integer                                            'zmienna pomocna przy sprawdzaniu czy przycisk został puszczony
    Dim Pomocbit4 As Byte


    Config Portb = &B01111000
    Config Portd = &B0111011                                    'wyjścia/wejscia Portu D zostaną odpowiednio ustawione(podciągnięte) już przy pierwszym skoku do podprogramu Inttim1
    Gosub Incrktora                                             '}
    Gosub Selectktora                                           ' }te dwa polecenia dają w sumie ustawienie (podciągnięcie) we./wy. portu B

    Dim Timefader As Byte                                       ')
    Dim Timefader2 As Byte                                      ' )zmienne do odliczania czasu automatycznego gaszenia lamp

    Config Int0 = Falling
    Config Rc5 = Pind.2

    Config Timer1 = Timer , Prescale = 1

    Enable Interrupts
    Enable Timer1

    On Timer1 Inttim1
    On Int0 Int_0

    Config Watchdog = 2048                                      'jeśli program się zawiessi to watcghdog zresetuje go po ok 2s

    Onofflmgl = Eonofflmgl                                      'wpisanie do onofflmgl takiej wartosci jaka była przed wyłaczeniem zasilania

    $asm
          sbis pinb, 0                                          'jeśli wciśnięty jest przycisk down to
    $end Asm
      Gosub Pilot                                               'skocz do podprogramu zapisujacego komendy pilota


    Do                                                          'tu zaczyna się program główny
      Start Watchdog
      If Address = Eaddress Then                                'jeśli adres pilota dobry
        For Nextlm = 1 To 16                                    'piętnastokrotnie
          If Command = Epamiec(nextlm) Then                     'sprawdzanie komend przycisków pilota
           Select Case Nextlm
             Case 1 : Gosub Incrktora                           'Incr Która
             Case 2 : Gosub Setupbit                            'przycisk Up
             Case 3 : Gosub Setdownbit                          'przycisk Down
             Case 4 : If Kod = 0 Then                           'po to by jednokrotnie zmienic stan onoffall przy jednokrotnym nacisnieciu przycisku pilota
                        Onoffall = Not Onoffall
                        Gosub Setkod
                      End If
             Case 5 : If Kod = 0 Then                           'po to by jednokrotnie zmienic stan onofflmgl przy jednokrotnym nacisnieciu przycisku pilota
                        Onofflmgl = Not Onofflmgl
                        Eonofflmgl = Onofflmgl
                        Gosub Setkod
                      End If
             Case 6 : If Kod = 0 Then                           'po to by jednokrotnie zmienic stan DDRB.7 przy jednokrotnym nacisnieciu przycisku pilota
                        Ddrb.7 = Not Ddrb.7                     'przełączanie PORTD.7 jako we. lub wy. co daje włączanie i wyłączanie Timer Fadera
                        Gosub Setkod
                      End If
             Case Is >= 7 :
                           Incr X                               'zwiekszanie zmiennej X
                           Adr = Nextlm                         '}obliczanie adresu dla pamieci eeprom]
                           Shift Adr , Left , 2
                           If X = 10 Then                       'po ok 1s przyciskania klawisza
                             For Digit = 1 To 4
                               Writeeeprom Lmram(digit) , Adr   'zapis do eeprom wartosci jasnosci lamp danego profilu
                               Gosub Waitms50                   'czas dla EEPROMa na zapis
                               Incr Adr
                             Next Digit
                             Gosub Mrugnij
                             Pomocbit3 = 0
                           Else
                             Pomocbit3 = 255                    'blokowanie odczytu z EEPROM jeśli przycisk jest trzymany
                           End If
           End Select
          End If
        Next Nextlm
        Gosub Address_255
        K = 0
      Else
        Incr K
        If K >= 5000 Then
          Kod = 0
          X = 0
          If Pomocbit3 = 255 Then                               'Zezwolenie Na Odczytanie Z Eeprom
            Pomocbit3 = 0
            For Digit = 1 To 4
              Readeeprom Lmram(digit) , Adr                     'odczyt z eproma wartości jasnosci lamp w danym profilu
              Incr Adr
            Next Digit
          End If
        End If
      End If
      Enable Int0

        $asm
          sbis pinb, 7
        $end Asm
          Gosub Timefadsub

        $asm
          sbis pinb, 1                                          'przycisk up
        $end Asm
           Gosub Wait_setupbit

        $asm
          sbis pinb, 0                                          'przycisk down
        $end Asm
            Gosub Wait_setdownbit

      $asm
        sbis pinb, 2                                            'przycisk next
      $end Asm
        Gosub Incrktora

      If Ktora >= 7 Then Ktora = 1                              'skracanie cyklu licznika która
      Gosub Selectktora
      Gosub Upbitsub
      Reset Watchdog
    Loop
    End



    Inttim1:                                                    'co ok 97us
      Portd.0 = Onofflmgl.0                                     'zapalanie/gaszenie lampy głównej
      Timer1 = 64566                                            'timer1 liczy 970 cylki zegara, czyli przerwanie co ok 97us
      If Licznik >= 50 Then
        $asm
          sbic pind, 6                                          'sprawdzaj stan końcówki PIND6, jeśli jest równa 1 to
        $end Asm
          Gosub Zero                                            'skocz do podprogramu Zero
      End If
      Incr Licznik
      If Onoffall = 255 Then                                    'jeśłi zezwolenie globalne na włączanie lamp = 1 to
        If Licznik > Lmram(1) Then Reset Portd.5                '}
        If Licznik > Lmram(2) Then Reset Portd.4                ' } zapalaj odpowiednio lampy do wartości tablicy Lmram
        If Licznik > Lmram(3) Then Reset Portd.3                '}
        If Licznik > Lmram(4) Then Reset Portd.1                '}
      End If
    Return

    Upbitsub:
      If Upbit = 255 Then
        Gosub Resetupbit
        Decr Lmram(ktora)
      End If
      If Lmram(ktora) = 101 Then Lmram(ktora) = 100             'po to by lmram(która) utrzymywana była w granicach 0 - 161

      If Downbit = 255 Then
        Gosub Resetdownbit
        Incr Lmram(ktora)
      End If
      If Lmram(ktora) = 255 Then Lmram(ktora) = 0               'jeżeli zmniejszymy lmram(która) ponizej 0 to przyjmie ona war. 255 i po tym poleceniu znowu 0
    Return

    Selectktora:
      Select Case Ktora
       Case 1 : Portb = &B00111000                              'świeci LED4
       Case 2 : Portb = &B01011000                              'świeci LED3
       Case 3 : Portb = &B01101000                              'świeci LED2
       Case 4 : Portb = &B01110000                              'świeci LED1
       Case 5 : Portb = &B00000000                              'świecą od LED1 do LED4   ,wszystkie lampy jaśniej/ciemniej

                For Ktora = 1 To 4
                  Pomocbit = Upbit
                  Pomocbit2 = Downbit
                  Gosub Upbitsub
                  Upbit = Pomocbit
                  Downbit = Pomocbit2
                Next Ktora
                Gosub Resetupbit
                Gosub Resetdownbit
                Ktora = 5
       Case 6 : Portb = &B01111000                              'tryb włączania/wyłączania lamp
                Stop Watchdog

                $asm
                  sbis pinb, 1                                  'przycisk up
                $end Asm
                  Gosub Tog_all
                Bitwait Pinb.1 , Set                            'po to by jednoktrotnie zmienic stan onoffall przy jednokrotnym nacisnięciu przycisku up na klawiaturze

                $asm
                  sbis pinb, 0                                  'przycisk down
                $end Asm
                  Gosub Tog_lmgl
                Bitwait Pinb.0 , Set                            'po to by jednoktrotnie zmienic stan onofflmgl przy jednokrotnym nacisnięciu przycisku down na klawiaturze

      End Select
      If Pomocbit4 = 255 Then                                   'opóźnienie dla zmieniania trybu (ktora)
        $asm
          sbis pinb, 2                                          'przycisk next
        $end Asm
          Gosub Waitms200
        $asm
          sbis pinb, 2                                          'przycisk next
        $end Asm
          Gosub Waitms200
        Gosub Address_255
      End If
      Pomocbit4 = 0

    Return

    Tog_all:
      Onoffall = Not Onoffall
    Return

    Tog_lmgl:
      Onofflmgl = Not Onofflmgl
      Eonofflmgl = Onofflmgl
    Return

    Pilot:                                                      'procedurka rejestracji pilota
    Do
        If Address <> 255 Then
          If Downbit = 0 Then
            Gosub Setdownbit                                    'by wykonać tylko raz przy jednym nacisnięciu przycisku
            If Upbit = 0 Then
              Eaddress = Address
              Gosub Setupbit                                    'adres jest zapisywany tylko raz(od jednego(pierwszego) przycisku))
            End If
            Epamiec(ktora) = Command
            Gosub Incrktora                                     'Incr Która
            Gosub Mrugnij
          End If
          K = 0
        Else
          Incr K
          If K >= 19000 Then Gosub Resetdownbit
        End If
        Gosub Address_255
        Enable Int0
    Loop
    Return

    Address_255:
      Address = 255
    Return

    Setkod:
      Kod = 255
    Return

    Setupbit:
      Upbit = 255
    Return

    Setdownbit:
      Downbit = 255
    Return

    Resetupbit:
      Upbit = 0
    Return

    Resetdownbit:
      Downbit = 0
    Return

    Waitms50:
      Waitms 60
    Return

    Zero:
      Licznik = 1                                               'przy kazdym przechodzeniu napiecia sieci przez zero zeuj licznik i
      Portd = Portd Or &B1111110                                'wygas wszystkie 4 lampy
      Incr Timefader
    Return

    Timefadsub:                                                 '
      If Timefader = 100 Then                                   'co 1s
        Timefader = 0
        Incr Timefader2
        If Timefader2 = 12 Then                                 'co 12s ta linijka decyduje co ile czasu ma nastąpić ściemnienie światła o jeden kroczek
          Timefader2 = 0
          Gosub Setdownbit
        End If
      End If
    Return

    Int_0:
      Disable Int0
      Enable Interrupts
      Getrc5(address , Command)                                 'odczytywanie danych z pilota
      Command = Command And &B01111111
    Return

    Mrugnij:
      Set Portb.6
      Gosub Waitms200
      Reset Portb.6
      Gosub Waitms200
    Return

    Waitms200:
      Waitms 200
    Return

    Wait_setupbit:
      Gosub Waitms50
      Gosub Setupbit
    Return

    Wait_setdownbit:
      Gosub Waitms50
      Gosub Setdownbit
    Return

    Incrktora:
      Pomocbit4 = 255
      Incr Ktora
    Return
  • Poziom 14  
    Przemyśl dobrze - sprawdź czy potrzebujesz aż 100 kroków.
    Jeśli świecisz żarówką to oko ludzkie zmiany o 1% na pewno nie wychwyci. Do płynnego przechodzenia z pełnego światła do zgaszenia powinno wystarczyć ok 20 kroków. Jak masz 1 żarówkę to łatwo sprawdzisz.
    pozdrawiam
    rs
  • Poziom 42  
    romsik -> sorry ale chyba nie robiłeś jeszcze takiego ściemniacza bo bez urazy ale troszkę ściemniasz z tą ilością kroków ;) Przy 20 krokach to ściemnianie czy rozjaśnianie nie byłoby płynne tylko wyglądałoby jakby ktoś radziecką wajchą to przełączał. I nie mówię tego tylko dlatego, że mi się tak wydaje ale dlatego, że dokładnie trenowałem ten temat. Problem w tym, że ten proces jest bardzo nieliniowy i nawet jak się zastosuje tablicę z wyliczonymi wartościami to zbyt mała ilość kroków szczególnie w okolicy słabego świecenia żarówki spowoduje, że będzie widać wyraźne przeskoki jasności. (a w okolicy pełnej jasności ta wrażliwość na kroki oczywiście spada) tak więc mamy do czynienia z nieliniowym postrzeganiem jasności źródła światła i z nieliniowym rozkładem mocy w połówce sinusoidy - ale po to właśnie oblicza się tabele lookup'owe dla takich celów)

    wg moich obserwacji taka minimalna ilość kroków to około 75 a najlepiej to wygląda gdy jest już ich ze 100 właśnie.
  • Poziom 41  
    Witam
    Jeżeli uP będzie miał jeszcze coś do roboty a w szczególności zależnego czasowo to wybrałeś za słaby procesor. Można dodatkowo dorzucić ATMega8 i po np. RS-ie wysyłać wypełnienie. W ten sposób można zrobić tyle kanałów ile jest wolnych wyprowadzeń w AVR.