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

Attiny13 [bascom] - Wstawienie sterowania PWM do programu

wojtek9104 27 Gru 2012 16:58 2175 14
  • #1 27 Gru 2012 16:58
    wojtek9104
    Poziom 16  

    Napisałem sobie taki programik sterujący oświetleniem w samochodzie.
    Napewno jest za bardzo skomplikowany i da się to napisać prościej, ale z moją wiedzą napisałem taki i chce go wykorzystać bo działa tak jak chciałem.

    Natomiast brakło mi już wiedzy aby żarówka nie gasła od razu a stopniowo przygasała.

    Znalazłem taką formułkę która gasi stopniowo żarówkę ale działa ona tylko gdy pętla jest cały czas wykonywana.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod



    Czy podpowie mi ktoś jak wstawić taką formułkę do mojego programu w miejsca gaszenia żarówki? Czyli wszędzie tam gdzie jest portb.0=0
    Problem polega na tym że potrzebuję taką formułkę która zadziała w jednej pętli bo gdy spełniony jest warunek do gaszenia żarówki, zgaśnie ona i w następnej pętli ten warunek już jest nie spełniony.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
    [/code]

    0 14
  • SterControl
  • #2 27 Gru 2012 17:20
    marci4
    Poziom 29  

    To jest pętla For...Next gdzie po dojsciu do wartości 255 zmiennej A, program idze dalej a nie tkwi w pętli Do...Loop. Zastosuj to zamiast kodu z Twojego pierwszego postu tak gdzie potrzebujesz ściemnienia żarówki.

    Code:

    For A = 0 To 255 Step 1
    Pwm0a = A
    Waitms 20
    Next A

    0
  • #3 27 Gru 2012 17:23
    wojtek9104
    Poziom 16  

    Ok :) będę próbował, a jeśli potrzebuje tak samo stopniowo zapalać żarówkę to muszę coś zmienić w konfiguracji timera, zastosować drugi czy jedynie w zapisie formuły coś zmienić?

    0
  • SterControl
  • #4 27 Gru 2012 17:27
    wojtek8-7
    Poziom 12  

    Jeżeli jest to instalacja samochodowa czyli prąd stały, to czy nie łatwiej będzie podłączyć równolegle do żarówki kondensator? Kondensator możesz sobie dobrać tak, żeby czas wygaszania był dla Ciebie odpowiedni.

    0
  • #5 27 Gru 2012 17:46
    BlueDraco
    Specjalista - Mikrokontrolery

    wojtek8-7: To zdecydowanie zły pomysł. Na czym będzie następował spadek napięcia podczas zaświecania? Jak duży ma być ten kondensator? Jaki będzie prąd zwarcioy przy włączaniu? PWM to znacznie lepsze rozwiązanie. (Tylko dlaczego ten koszmarny BASCOM...)

    0
  • #6 27 Gru 2012 18:12
    piotrva
    Moderator Mikrokontrolery

    W Bascom też da się to świetnie zrobić, ja raczej bym zapytał: Dlaczego wszędzie te koszmarne Wait (i _delay_XX w C)?
    W przypadku przedstawionym przez Autora wystarczy użyć 2 timerów do osiągnięcia tego efektu.
    Jeden timer, jeśli mu to zadamy, co jakiś czas zmniejsza wartość PWM, a drugi jest sprzętowym generatorem pwm. program główny tylko wystawia flagę polecającą przerwaniu wykonać wygaszanie.

    0
  • #7 27 Gru 2012 19:35
    BlueDraco
    Specjalista - Mikrokontrolery

    Tę zmianę wartości PWM najlepiej zrobić w przerwaniu timera generującego PWM, a program główny powinien mieć pustą pętlę główną z uśpieniem procesora.

    0
  • #8 27 Gru 2012 20:03
    piotrva
    Moderator Mikrokontrolery

    BlueDraco napisał:
    Tę zmianę wartości PWM najlepiej zrobić w przerwaniu timera generującego PWM, a program główny powinien mieć pustą pętlę główną z uśpieniem procesora.

    Można i tak, a można rozdzielić tu te timery i mieć pełną niezależność czasową. I tak w tym projekcie wszystkie timery leżą odłogiem :D

    0
  • #9 27 Gru 2012 20:29
    BlueDraco
    Specjalista - Mikrokontrolery

    Jeżeli już mamy timer o stałej częstotliwości generowania przerwań, to z użycia dwóch timerów zamiast jednego zysku żadnego nie ma, a straty są:
    - trzeba zaprogramować 2 timery i napisać dwie procedury obsługi przerwań.
    - przy zgłoszeniu przerwań z obu będzie opóźnienie obsługi jednego z przerwań (niekiedy bardzo niepożądane),
    - obsługa drugiego przerwania przez procesor i powrót z niego zajmuje więcej czasu niż dodatkowy warunek i rozejście w obsłudze jednego przerwania (to również zwiększony pobór mocy),
    - łatwo o nieregularną modyfikację PWM, która w pewnych warunkach może być widoczna w postaci "zafalowanych" zmian jasności. Modyfikacja wartości wypełnienia powinna być zsynchronizowana z okresem przebiegu PWM.

    0
  • #10 27 Gru 2012 21:38
    piotrva
    Moderator Mikrokontrolery

    Hmm, obalę Twoje mity dot. przerwań:
    1.(częściowo), 2., 3. w tym przypadku PWM jest sprzętowy. Oznacza to nie mniej nie więcej niż to, że timer odpowiedzialny za generowanie PWM nie wygeneruje ŻADNEGO dodatkowego przerwania.
    4. Dlatego stosuje się tryb phase correct pwm, ale zapewniam Cię, że w przypadku sterowania jasnością żarówki to w którym momencie nastąpi przeskok wypełnienia o 1 czy 10 jednostek i tak nie będzie widoczne dla oka.
    Jedyne z czym się zgodzę, to że obiektywnie wtedy trzeba napisać 2 procedury konfiguracji timera.

    0
  • #11 27 Gru 2012 23:05
    BlueDraco
    Specjalista - Mikrokontrolery

    Przy sprzętowym PWM warto pędzić zmiany współczynnika właśnie przerwaniem od timera PWM, i jest ku temu kilka dobrych powodów (np. rówoczesność zmian wypełnienia przy kilku kanałach). Nie widzę sensu nastawiania drugiego timera asynchronicznego względem timera PWM do generowania przerwania, bo płyną z tego same szkody, a zysku nie widać żadnego. Nie ma to nic wspólnego z "phase-correct". Tzw. jitter - to nie żaden mit, więc raczej nie obalaj faktów.
    Prawda, na żarówkach nie będzie to widoczne, na LED już tak, zwłaszcza przy małych jasnościach (ten skok o 1 widać bardzo wyraźnie). Po co mając rozwiązanie zawsze dobre i proste robić coś, co czasem zadziała, a czasem nie i w dodatku wymaga więcej zasobów?

    0
  • #12 28 Gru 2012 01:10
    piotrva
    Moderator Mikrokontrolery

    Mnie zawsze to działa, a moim zdaniem jak można tak zrobić to nie niesie to szkód.
    Zresztą zgodność w fazie ma znaczenie, ale nie zawsze. Jeśli steruję jedną diodą to nie ma to znaczenia. Zresztą czy mógłbyś mi pokazać na diagramach w datasheecie dowód na to, że dioda przy zmianie OCR w złym momencie błyśnie lub zgaśnie całkowicie? Bo moim zdaniem inne usterki przy diodzie, że jej PWM będzie przesunięty względem PWM drugiej i zmieniony o 0,0001s później nie będzie widoczne :D
    Poza tym chyba nie regulujesz wypełnienia liniowo - wiadomo jak reaguje ludzkie oko i ze trzeba stosować tablice korekcji dla każdego koloru osobno ;-)

    0
  • #13 28 Gru 2012 09:16
    BlueDraco
    Specjalista - Mikrokontrolery

    1. Jeśli można to zrobić dobrze i łatwo, po co robić źle i trudniej?

    2. Przy niebuforowanym PWM możesz spodziewać się wszelkich możliwych efektów - ciemny okres, ew. okres cały jasny. Przy buforowanym grozi "zaledwie" pomylenie jasności jednego okresu o jeden stopień, a przy równoczesnej generacji kilku przebiegów - rozjechanie w czasie ich zmian, które powinny być równoczesne.
    Jeśli mogę nie mieć pomylonej jasności - wybieram właśnie takie rozwiązanie bez błędów.
    Pół biedy, gdy chodzi o regulację światła. Gorzej, gdy mowa o mostku H, bo to przesunięcie może powodować zwarcie na mostku.

    Ty namawiasz ludzi na rozwiązania błędne "bo na ogół tych błędów nie widać, a są niewiele droższe od bezbłędnych". Tego jakoś nie rozumiem.

    0
  • #14 28 Gru 2012 09:25
    piotrva
    Moderator Mikrokontrolery

    Cóż, argument o ewentualnych problemach z mostkami H jest słuszny, i w sumie poddając sprawę głębszym przemyśleniom - masz rację - poza tym uczmy się pracować optymalnie, czyli używać jaknajmniej zasobów jak to możliwe. Także sumarycznie przyznaję Ci rację w tej kwestii ;)

    0
  • #15 28 Gru 2012 09:34
    BlueDraco
    Specjalista - Mikrokontrolery

    No to pozostaje mi pogratulować osiągnięcia 3k postów. :)

    0