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

[ATmega32] Jak uzyskać zmienną częstotliwość PWM 50-1000 Hz na ATmega32 w Bascom?

morswin89 14 Paź 2012 15:51 7728 21
  • #1 11410637
    morswin89
    Poziom 23  
    Witam

    Potrzebuję zbudować generator sygnału PWM o zmiennej częstotliwości i zmiennym współczynniku wypełnienia. Wykorzystując sprzętowy PWM zmiana wypełnienia to nie problem ale czy można uzyskać na sprzętowym PWM zmienne częstotliwość od 50 do 1000 Hz płynną lub skokową. Jeżeli jest to możliwe do zrealizowania to prosiłbym o jakieś wskazówki jak się za to zabrać.
  • #2 11413993
    Konto nie istnieje
    Poziom 1  
  • #3 11436334
    morswin89
    Poziom 23  
    Dziękuje za opis ale chyba mnie to przerosło :) Zrobiłem programowy PWM, oto kod:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Wszystko nawet działa tylko jest mały problem z pogodzeniem PWM przy wysokich częstotliwościach a obsługa klawiszy. Przy wysokiej f klawisze "mulą" i nie mam już pomysłu jak można to pogodzić aby klawisze działały płynnie.


    Nikt nie ma pomysłu jak pozbyć się tych opóźnień obsługi przycisków przy ustawionej wysokiej wartości częstotliwości sygnału PWM?
  • #4 11450404
    aaadamw
    Poziom 16  
    A może lepiej zastosować Timer1 w trybie 14.
    Częstotliwość regulowana wartością rejestru ICR1, a wypełnienie OCR1A.
  • #5 11450488
    morswin89
    Poziom 23  
    Prosiłbym o podpowiedź jak skonfigurować tak timer bo coś nie mogę znaleźć tego w dokumentacji. Proszę o wytłumaczenie jak krowie na rowie bo nie mogę tego pojąć co i jak mam poustawiać i gdzie co będzie.
  • #6 11450785
    aaadamw
    Poziom 16  
    w datasheet do M32 jest wszystko opisane. Szukaj w części poświęconej Timer1 --> opis rejestrów.

    Nie pamiętam jak to będzie w BASCOMIE,ale w c to będzie coś takiego[fcpu=16MHz]:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodano po 10 [minuty]:

    obawiam się, że w BASCOMIE może być to trudne do wykonania...
    W takich momentach cieszę się, że odstawiłem BASCOMA na rzecz C.
  • #8 11451002
    aaadamw
    Poziom 16  
    Zmienia się wypełnienie, bo OCR1A się nie zmienia.
    Zmieniając ICR1 musisz na nowo wyliczyć wartość OCR1A żeby mieć odpowiednie wypełnienie.
  • #9 11451068
    morswin89
    Poziom 23  
    Albo coś źle robię ale nie rozumiem jak to ma działać. Niezależnie czy do ICR1 wpisz 100 czy 20 000 częstotliwość przebiegu się nie zmienia. A wpisując do OCR1A rożne wartości wypełnienie się zmienia.
  • #10 11451096
    aaadamw
    Poziom 16  
    ale jak ty to stwierdzasz, zę się nie zmienia?

    Na poniższym filmie zmieniam ICR1. Jak widać szerokość impulsu(wartość OCR1A) się nie zmienia. Zmienia się częstotliwość. Co za tym idzie przypadkiem zmienia się wypełnienie.



  • #12 11451156
    aaadamw
    Poziom 16  
    tutaj masz zmianę OCR1A przy ICR1 stałym:
    <embed src="http://www.youtube.com/v/K_Idqd76c1g?version=3&hl=pl_PL" type="application/x-shockwave-flash" width="420" height="315" allowscriptaccess="always" allowfullscreen="true">
  • #17 11500956
    morswin89
    Poziom 23  
    Witam

    Powracam znowu z moim problemem.

    Schemat wygląda tak:

    [ATmega32] Jak uzyskać zmienną częstotliwość PWM 50-1000 Hz na ATmega32 w Bascom?

    Kod tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    A problem w tym że na wyjściu napięcie reguluje się do około 4,5V zamiast około 12V

    Dodano po 30 [minuty]:

    Błąd znaleziony - złe podłączenie tranzystora.
  • #18 13198359
    rafik100
    Poziom 11  
    morswin89 Witam
    Jeśli chodzi o ustawienie fusebit-ów, może ktoś dorzucić?
  • #19 13781208
    FastProject
    Poziom 28  
    emarcus napisał:

    Mozesz to zrobic wykorzystując timer z dwoma kanałami np. Timer1
    Na jednym kanale kontrolujesz częstotliwośc, a na drugim wypełnienie.

    Załóżmy że taktujesz processor 8 MHz

    Timer1

    Waveform Generation Mode:
    Phase and Frequency Correct PWM mode(9) / TOP = OCR1A
    Timer clock source: I/O Clock / 8 (prescaler=8)

    OC1B: Clear OC1B on Compare Match when up-counting. Set OC1B on Compare Match when down-counting.
    Dla tego trybu nie możesz użyc konfiguracji Timera w stylu: "Config Timer1......"
    lecz dokonasz tego 'ręcznie', bezpośrednio edytując jego rejestry; np w takiej formie:

    TCCR1A = &B00100001 'See datasheet for details.
    TCCR1B = &B00010010 'See datasheet for details
    abo rownoważna forma:
    Tccr1a = Bits(wgm10 , Com1a1)
    Tccr1b = Bits(wgm13 , Cs11)

    Sygnał PWM otrzymasz na wyściu OC1B

    Config PinB.2 = Output
    Żądane zmiany Freq. otrzymasz manipulując wartością Compare1a w zakresie od 500 do 10000, analogicznie wypelnienie byłoby 'manipulowane' przez Compare1b (odpowiednia rutyna umieszczona w Do..Loop).


    Także próbuje wykonać liniową regulację częstotliwości od kilku Hz do kilku kHz, ale nie rozumiem dlaczego w powyzszym opisie dla częstotliwości 50Hz do 1000Hz do COMPARE1A trzeba wpisywać wartość od 500 do 10000? Skąd te wartości jak zostały obliczone?

    Zapewne na podstawie czasu w jakim timer 1 jest zwiększany, ale nijak nie zgadza mi się to z okresem dla 50Hz i 1kHz z przykładu który podał autor tematu.

    Proszę o jakieś wytłumaczenie lub wzory opisujące zależność częstotliwości od zawartości rejestru COMPARE1A. (ja chce regulować tylko częstotliwością silnika krokowego, a więc konieczność zmiany wypełnienie nie jest mi potrzebna)
  • #20 13781327
    Konto nie istnieje
    Poziom 1  
  • #21 13781916
    FastProject
    Poziom 28  
    No teraz to mi się zgadza, z taktowaniem timera, który w tym przypadku zwiększa swoją wartość co 1us.

    Dzięki za podpowiedź.
  • #22 13781982
    Konto nie istnieje
    Poziom 1  
REKLAMA