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

Pytania o Fast PWM na Atmedze8A: funkcje rejestrów ICR1, OCR1A, OCR1B, współczynnik wypełnienia

antoniv10 09 Sty 2021 01:32 816 18
REKLAMA
  • #1 19169333
    antoniv10
    Poziom 3  
    Posty: 87
    Ocena: 28
    Cześć, mam tutaj taki kod z obsługą Fast PWM na Atmedze8A i nasuwa mi się kilka pytań.

    1. Czy dobrze rozumiem, że rejestr ICR1 służy do ustawienia maksymalnie wartości jaką możemy wpisać do rejestrów OCR1A i OCR1B?

    2. Rejestry OCR1A i OCR1B służą w tym przypadku do kontrolowania jasności diody?

    3. Czy dobrze rozumiem, że współczynnik wypełnienia zależy tutaj od wartości jaką wpiszemy do ICR1, czyli np. ICR1 = 1000, OCR1A = 500 współczynnik wypełnienia równy 50%?

    4. Dlaczego jak do OCR1A wpiszę 10, a do OCR1B = 500 do obydwie diody świecą tak jakby do obydwóch rejestrów wpisał wartość 10 i jak mogę zrobić, żeby jedna świeciła mocniejszym, a druga słabszym światłem?

    5. Jeżeli to co napisałem w punkcie 3 to prawda to skąd nagle taka metoda wyznaczania współczynnika wypełnienia skoro jest on dany wzorem Czas impulsu / Okres * 100%?

    6. Czy jeżeli wartość OCR1A == TCNT1 to mogę temu zdarzeniu odpowiada przerwanie TIMER1 COMPA, a dla OCR1B TIMER1 COMPB?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 19169453
    DawidYebadlo
    Poziom 14  
    Posty: 176
    Pomógł: 18
    Ocena: 16
    1. ICR1 służy do ustawiania maksymalnej wartości licznika.

    3. Tak dobrze rozumiesz. To znaczy w przypadku gdy do obu tych rejestrów wpisywana jest ta sama wartość.

    Tak w ogóle to zapoznałeś się z rejestrami w tym mikrokontrolerze, za co one odpowiadają itp?
  • #3 19169616
    jony
    Specjalista elektronik
    Posty: 7550
    Pomógł: 1823
    Ocena: 885
    antoniv10 napisał:
    Czy dobrze rozumiem, że rejestr ICR1 służy do ustawienia maksymalnie wartości jaką możemy wpisać do rejestrów OCR1A i OCR1B?

    Tak dobrze kolega rozumie.

    antoniv10 napisał:
    2. Rejestry OCR1A i OCR1B służą w tym przypadku do kontrolowania jasności diody?

    Do zmiany współczynnika wypełniania.

    antoniv10 napisał:
    3. Czy dobrze rozumiem, że współczynnik wypełnienia zależy tutaj od wartości jaką wpiszemy do ICR1, czyli np. ICR1 = 1000, OCR1A = 500 współczynnik wypełnienia równy 50%?

    Tak dobrze. Pomocny może być ten rysunek:

    Pytania o Fast PWM na Atmedze8A: funkcje rejestrów ICR1, OCR1A, OCR1B, współczynnik wypełnienia

    D = 501/1001 * 100% = 50.0499% Bo układy cyfrowe zaczynają liczyć od zera.


    antoniv10 napisał:
    4. Dlaczego jak do OCR1A wpiszę 10, a do OCR1B = 500 do obydwie diody świecą tak jakby do obydwóch rejestrów wpisał wartość 10 i jak mogę zrobić, żeby jedna świeciła mocniejszym, a druga słabszym światłem?

    A diody jak masz włączone? I pamiętaj, że regulacja jasności diody LED nie jest liniowa.

    antoniv10 napisał:
    Jeżeli to co napisałem w punkcie 3 to prawda to skąd nagle taka metoda wyznaczania współczynnika wypełnienia skoro jest on dany wzorem Czas impulsu / Okres * 100%?

    Nie rozumiem o jaką metodę pytasz?
  • REKLAMA
  • #4 19169636
    Konto nie istnieje
    Poziom 1  
  • #5 19169704
    antoniv10
    Poziom 3  
    Posty: 87
    Ocena: 28
    DawidYebadlo napisał:

    3. Tak dobrze rozumiesz. To znaczy w przypadku gdy do obu tych rejestrów wpisywana jest ta sama wartość.


    A co jeżeli nie jest wpisywana ta sama wartość? Jak, bo np. kiedy od OCR1A wpisze 10 a do OCR1b 1000 to jedna obydwie diody święcą się bardzo słabo. Co mam zrobić aby jedna świeciła się mocniej a druga słabiej?
  • #6 19169797
    jony
    Specjalista elektronik
    Posty: 7550
    Pomógł: 1823
    Ocena: 885
    antoniv10 napisał:
    ak, bo np. kiedy od OCR1A wpisze 10 a do OCR1b 1000 to jedna obydwie diody święcą się bardzo słabo.

    Jak wstawisz 10 do OCR1A to na PB1 masz wypełnianie równe 10/100 = 0.1 = 10%
    A 1000 do OCR1B to na PB2 masz praktycznie na stale stan wysoki.
  • #7 19170057
    antoniv10
    Poziom 3  
    Posty: 87
    Ocena: 28
    jony napisał:
    antoniv10 napisał:
    ak, bo np. kiedy od OCR1A wpisze 10 a do OCR1b 1000 to jedna obydwie diody święcą się bardzo słabo.

    Jak wstawisz 10 do OCR1A to na PB1 masz wypełnianie równe 10/100 = 0.1 = 10%
    A 1000 do OCR1B to na PB2 masz praktycznie na stale stan wysoki.

    OK, już działa problem polegał na tym, że przez przypadek jeden rezystor podłączony do diody stykał się z rezystorem podłączonym do drugiej przez co obydwie diody świeciły tym samym światłem.

    Dodano po 7 [godziny] 24 [minuty]:

    Jarzabek666 napisał:
    A może dlatego że timer działa na 8kHz??

    A skąd wiadomo, że działa akurat na 8kHz?
  • #8 19171184
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #9 19171460
    jony
    Specjalista elektronik
    Posty: 7550
    Pomógł: 1823
    Ocena: 885
    antoniv10 napisał:
    A skąd wiadomo, że działa akurat na 8kHz?

    Tego nie wiadomo. To już zależy czy używasz wewnętrzny oscylator czy też podłączyłeś zewnętrzny oscylator?
    I tak na wewnętrznym możesz mieć max 8MHz. Pod warunkiem, że wyłączyłeś w fuse bitach dzielnik przez 8.
    Bo jeśli nie wyłączyłeś to masz 1MHz.
  • #10 19173114
    antoniv10
    Poziom 3  
    Posty: 87
    Ocena: 28
    A jeszcze jedno pytanko mam. Jak mogę zrobić, żeby dioda zupełnie się nie świeciła, bo jak, np. ustawię OCR1A na 0 do dioda dalej świeci jednak bardzo słabym światłem, ale ja chciałbym ją zupełnie wyłączyć?
  • #11 19173141
    landy13
    Poziom 31  
    Posty: 1418
    Pomógł: 195
    Ocena: 260
    Poczytaj ten temat. Zwłaszcza post #19.
  • #12 19173345
    jony
    Specjalista elektronik
    Posty: 7550
    Pomógł: 1823
    Ocena: 885
    Podłącz diodę anodą do plusa. A katoda diody + rezystor do Atmegi.
    I wtedy 1000 wyłączy diodę a 0 "rozświetli" na maksa.
  • #13 19173440
    antoniv10
    Poziom 3  
    Posty: 87
    Ocena: 28
    A jest taka opcja, żebym sygnał PWM puścił tylko na jednym pinie albo, żeby na 2 pinach puścić 2 różne rodzaje sygnałów PWM?
  • REKLAMA
  • #14 19173651
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2205
    antoniv10 napisał:
    A jest taka opcja, żebym sygnał PWM puścił tylko na jednym pinie albo, żeby na 2 pinach puścić 2 różne rodzaje sygnałów PWM?

    Oczywiście, tylko zamień tą prehistoryczną ATMegę8 na coś nowszego - chociażby z serii 0 lub 1. Poczytaj noty tych nowych AVRów, w szczególności sekcję o timerach. Zwykle każdy timer w tych nowych ma 2-4 kanałów PWM, a do tego nie ma problemów ze szpilkami (brak pełnej regulacji PWM w zakresie 0-100%), jak to właśnie ma miejsce w przypadku M8.
  • #15 19173806
    landy13
    Poziom 31  
    Posty: 1418
    Pomógł: 195
    Ocena: 260
    antoniv10 napisał:
    A jest taka opcja, żebym sygnał PWM puścił tylko na jednym pinie albo, żeby na 2 pinach puścić 2 różne rodzaje sygnałów PWM?
    A zajrzałeś do tematu który linkowałem trzy posty wyżej? Temat jest o trzech PWMach. Co prawda na dwóch timerach, ale nie piszesz czy wszystkie masz zajęte. Problem żarzenia też jest rozwiązany.
    Więc - jak widać - da się. I to na takim zabytku jak M8.
  • #16 19174043
    antoniv10
    Poziom 3  
    Posty: 87
    Ocena: 28
    A da się jakoś zwiększyć liczbę kanałów z PWM czy muszę być skazany na tyle ile jest wbudowane w mikrokontroler?
  • #17 19174073
    landy13
    Poziom 31  
    Posty: 1418
    Pomógł: 195
    Ocena: 260
    Można zrobić PWMy programowe.
  • #18 19174219
    antoniv10
    Poziom 3  
    Posty: 87
    Ocena: 28
    Mógłbyś to bardziej rozwinąć?
  • #19 19174276
    landy13
    Poziom 31  
    Posty: 1418
    Pomógł: 195
    Ocena: 260
    A co tu rozwijać, zjawisko rozkminione na forach szeroko.
    1 W przerwaniu któregoś timera inkrementujesz zmienną (powiedzmy 8-bitową)
    2 Gdy zmienna=0 ustawiasz wyjścia wszystkich PWMów
    3 Za każdym obiegiem sprawdzasz, czy zmienna równa jest wypełnieniu każdego z PWMów
    4 Jeśli tak, to zerujesz wyjście tegoż PWMa.

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji Fast PWM na mikrokontrolerze Atmega8A, w szczególności funkcji rejestrów ICR1, OCR1A i OCR1B oraz współczynnika wypełnienia. Użytkownicy potwierdzają, że ICR1 ustala maksymalną wartość dla OCR1A i OCR1B, które kontrolują jasność diod LED. Współczynnik wypełnienia jest obliczany na podstawie wartości ICR1 i OCR1A/B. Problemy z regulacją jasności diod wynikają z nieprawidłowego podłączenia rezystorów. Użytkownicy omawiają również częstotliwość działania timera oraz możliwość programowego generowania sygnałów PWM, co pozwala na zwiększenie liczby kanałów PWM.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA