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

ATmega8 regulacja PWM w zakresie 1 - 1kHz

danloop 30 Sty 2012 19:33 2910 12
  • #1 10470993
    danloop
    Poziom 15  
    Witam,

    robię prosty generator ale utknąłem w dość błahym punkcie jakim jest regulacja częstotliwości. Chce uzyskać sygnał od 1 - 1kHz, i najlepiej żeby można było uzyskać częstotliwość z całego zakresu. Korzystam z 16 bitowego PWM w atmega8, wypełnienie reguluję wartościami rejestrów OCR1A i OCR1B. Wzór z jakiego wyliczam częstotliwość wyjściową to:

    f = fclk/2*N*ICR1

    Atmega taktowana 4MHz, preskaler ustawiony na wartość 1024, tak więc:

    fmax = 4Mhz/(2048*2) =976Hz

    fmin = 4Mhz/(2048*2048) = 0,95Hz

    Wartość ICR1 regulowana na przez przetwornik. Sęk w tym, że nie da się płynnie poruszać w tym zakresie częstotliwości, bo po 976Hz można uzyskać 488Hz i potem znów połowę mniej.
    Nie bardzo wiem jak to to ruszyć dalej, zastanawiałem się nad zmienianiem wartości preskalera w zależności od tego w którym przedziale częstotliwości jestem ale nie wiem czy to nie zbyt karkołomne rozwiązanie. Ma ktoś jakiś pomysł? Pomóżcie Panowie. Program powstaje w C.
  • #2 10471155
    sulfur
    Poziom 24  
    ICR1 jest 16 bitowy. Zmniejsz preskaler. Przy preskalerze 8 otrzymasz dokładność w górnym zakresie częstotliwości w okolicach 4 Hz. W dolnej dużo za dobrze. Przy preskalerze 1 będziesz miał dużo lepszą dokładność w górnym zakresie, ale do 1Hz możesz nie dojść. Jaka dokładność właściwie Cię interesuje ?
  • #3 10471166
    tmf
    VIP Zasłużony dla elektroda
    Użyj 16-bitowego timera i odpowiednio większej częstotliwości taktowania. To też ci nie zapewni bardzo precyzyjnej regulacji, ale będzie ciut lepiej. Poza tym zmianę częstotliwości uzyskasz nie tylko preskalerem, ale także timerem pracującym np. w trybie CTC, gdzie możesz ustawiać maksymalną wartość licznika po której następuje jego zerowanie.
  • #4 10471210
    sulfur
    Poziom 24  
    tmf: mikrokontroler ATmega8 i regulacja wypełnienia rejestrami OCR1A OCR1B jak w poście pierwszym sugeruje, że używany jest timer 16-bitowy.
  • #5 10471253
    danloop
    Poziom 15  
    w dolnym zakrsie duża dokładność rzędu najlepiej 1Hz, to tak do 70Hz potem myśle ze w granicach 5-10Hz wystarczająco będzie. Wartość częstotliwości reguluje tez przez ICR1 ale nie moge usykać jakiejś sensownej dokładnośći.
  • #6 10471431
    sulfur
    Poziom 24  
    Nie możesz uzyskać, bo masz za duży preskaler. Przy 4MHz rdzeń i preskalerze 8 w zasiesie 1Hz do 1kHz uzyskasz najgorszy skok rzędu 4Hz w górnej części. Od 70 Hz w dół teoretycznie skok wynosi 2/100 Hz.
  • #7 10471499
    danloop
    Poziom 15  
    czyli musiałbym zminejszyć preskaler i zmniejszyć częstotliwość żeby uzyskać dokładność 1 Hz tylko licze i licze i nie moge się doliczyć
  • Pomocny post
    #8 10471549
    sulfur
    Poziom 24  
    Wystarcz zmniejszyć preskaler. Przy preskalerze 8 mi wychodzi:
    Cytat:
    250 1000
    251 996,0159363
    252 992,0634921
    253 988,1422925
    254 984,2519685
    255 980,3921569
    256 976,5625
    257 972,7626459
    258 968,9922481
    259 965,2509653
    260 961,5384615
    Cytat:
    500 500
    501 499,001996
    502 498,0079681
    503 497,0178926
    504 496,031746
    505 495,049505
    506 494,0711462
    507 493,0966469
    508 492,1259843
    509 491,1591356
    510 490,1960784
    Cytat:
    3522 70,98239637
    3523 70,96224808
    3524 70,94211124
    3525 70,92198582
    3526 70,90187181
    3527 70,88176921
    3528 70,861678
    3529 70,84159819
    3530 70,82152975
    3531 70,80147267


    Lewa kolumna to wartość ICR1, prawa to uzyskana częstotliwość w Hz.
  • #9 10471733
    danloop
    Poziom 15  
    hmm no to teraz jeszcze jakoś matematycznie musze to uzależnić od przetwornika i powinno jakoś działać dzięki za pomoc
  • #10 10471863
    sulfur
    Poziom 24  
    Nie wiem o jakim przetworniku mówisz, ale mam nadzieję, że nie o A/C.
    Co do zależności matematycznych to ja bym spróbował z LUT.
  • #11 10471873
    danloop
    Poziom 15  
    A/C niestety, chodzi o to by z potencjometru kontrolować częstotliwość. LUT ? o co chodzi ? Po wrzuceniu danych do excela wychodzi z tego funkcja logarytmiczna.
  • #12 10471997
    sulfur
    Poziom 24  
    Przykro mi, ale nawet to prostego generatora rozwiązanie z A/C się nie sprawdzi.
    LUT czyli LookUp Table. Użyj wyszukiwarki, żeby zapoznać się z metodą.
  • #13 10480027
    danloop
    Poziom 15  
    jeśli chodzi o wypełnienie to działa ok ale z częstotliwością mam problem, spróbuje to jakos wyskalować żeby działało w miare dobrze ale najlepiej będzie chyba zmieniać wartość przeciskami inkrementując wartość licznika. Dzięki za pomoc

    Hmm, faktycznie jakby stablicować te dane i w taki sposób wrzucać do ICR1 to wówczas nie było by to super dokładne ale dość płynnie można by regulować częstotliwość w całym zakresie przy jednym ustawieniu preskalera. Przetwornik 10 bitów i regulacja od 1-1000Hz. Coś sie z tego wykluje ale nie popieram tego co robie.


    Dadatkowo wyniknął mały problem, otóż jak steruje częstotliwością wartości rejestrwó OCR1A/B nie zmianiają się, natomiast sterowanie wartościami wpisywanymi do OCR1A/B wpływa na wartość częstotliwości - zwiększa lub zmiejsza o kilkadziesiąt Hz.

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