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

[Atmega8][Bascom] - Generator zmiennej częstotliwości

Snikers 18 Sie 2009 07:41 6834 13
  • #1 6904600
    Snikers
    Poziom 24  
    Próbuje uruchomić prosty generator prostokąta o stałym wypełnieniu około 20% (50% też może być) i zmiennej częstotliwości 20-270Hz. Wolny mam TIMER2 i powinien się on do tego zadania nadać.

    $regfile = "m8def.dat"
    $crystal = 8000000
    $lib "LCD-pcf8833.LBX"
    
    ...
    
    Config Timer2 = Timer , Prescale = 128 , Compare = Toggle , Clear Timer = 1
    Enable Interrupts
    Enable Timer2
    
    ...
    
    Tcnt2 = 90
    Ocr2 = 150
    


    Z takimi ustawieniami generuje 150Hz (co do wypełnienia to może przekłamywać „oscyloskop”).
    [Atmega8][Bascom] - Generator zmiennej częstotliwości
    [Atmega8][Bascom] - Generator zmiennej częstotliwości

    Zmieniałem Tcnt2 i Ocr2. Problem polega na tym, że nie potrafię dostrzec zależności miedzy Tcnt2 i Ocr2 a częstotliwością i wypełnieniem.
  • Pomocny post
    #2 6904801
    DJ.TRoX
    Poziom 18  
    Hej,
    Jeśli chcesz płynnie regulować współczynnik wypełnienia to musisz wybrać jeden z modów PWM i wtedy będziesz skazany na jedną z kilku częstotliwości wynikających z zegara systemowego i tego jak ustawisz prescaler,
    Jeśli chcesz płynnie regulować częstotliwość to wybierasz mod CTC(clear timer on compare) ale będziesz miał wtedy stałe wypełnienie,
    Częstotliwości, które chcesz generować są na tyle małe, że nic nie stoi na przeszkodzie, żeby jeden timer zgłaszał przerwanie co regulowany czas T a od tego przerwania startował drugi timer którym będziesz określał czas trwania impulsu,
    W ten sposób będziesz miał regulowaną częstotliwość i współczynnik wypełnienia,
    Pozdrawiam
  • Pomocny post
    #3 6904969
    Konto nie istnieje
    Poziom 1  
  • #4 6905070
    Snikers
    Poziom 24  
    no własnie, zapisując inne wartości do OCR2 zmieniają się parametry generatora, ale nie jakiś zrozumiały dla mnie sposób.

    rozumiem ze musiałbym wpisać wartości do TCCR2 binarnie 10011101? w manualu atmegi zaczyna sie od bit7
  • #5 6905231
    Konto nie istnieje
    Poziom 1  
  • #6 6905255
    Snikers
    Poziom 24  
    Odczytalem TCCR2 i jest ustawiony na CTC z toggle, jak przestawie na CLEAR lub SET to nic nie generuje.

    O binarnie chodziło mi, że w nocie atmegi jest opis rejestru TCCR2 i wartosci poszczegolnych bitów dobierane wg tabel. i wpisuje sie od 7ego bitu.
  • #7 6905289
    Konto nie istnieje
    Poziom 1  
  • #8 6905542
    Snikers
    Poziom 24  
    tak, o to chodziło.
    Zależność miedzy częstotliwością a OCR2 powinna być liniowa? Bo układ steruje obrotomierzem i niestety wskazania jego nie są liniowo zależne od „f” a powinny. W samochodzie są liniowo zależne od częstotliwości impulsów z cewki.

    Podejrzewam, że wypełnienie 50% wprowadza nieliniowość w obrotomierzu. Jak mogę zmniejszyć wypełnienie zachowując możliwość regulacji częstotliwości. Może jakby doliczenie do wartości OCR2 włączało OC2 wyzwalało TIMER0, który po jakimś czasie resetował by TIMER2 i wyjście OC2. Tylko nie mogę nic znaleźć o resetowaniu tych wartości dla COMPARE=SET
  • #9 6905556
    Konto nie istnieje
    Poziom 1  
  • #10 10182277
    Juni[]r
    Poziom 16  
    Wiem że zapytuje z innej beczki ale ten temat wydał mi się najbardziej pokrewny mojemu problemowi. Potrzebował bym by uC generował częstotliwość 250Hz z wypełnieniem 50%. Prosił bym o jaką kol wiek podpowiedź, nie proszę o podanie na talerzu. Ale jak by wyżej podany kod ktoś podał w całości było by super. Wiecie jak to z nami laikami :D
  • #11 10182460
    zumek
    Poziom 39  
    Juni[]r napisał:
    W... Potrzebował bym by uC generował częstotliwość 250Hz z wypełnieniem 50%...

    Załóżmy, że uC taktowany jest zegarem 1MHz, a "prostokąt" będzie generowany na wyjściu OC2.
    1)PB3 ustawiamy jako wyjście
    2)Timer ustawiamy w tryb CTC.
    3)Wyjście OC2 ustawiamy w tryb TOGGLE.
    4)Do OCR2 wpisujemy wartość 249.
    5)Uruchamiamy Timer2 z preskalerem równym 8.
    Wszystko.
  • #12 10183455
    Juni[]r
    Poziom 16  
    Nie wiem tylko o co chodzi z tym CTC

    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config PortB = Output
    
    Config Timer2 = Timer , Prescale = 8 , Compare = Toggle , Clear Timer = 1
    Enable Interrupts
    Enable Timer2
    
    Do 
    
    Loop
  • #13 10211477
    Juni[]r
    Poziom 16  
    Zrobiłem tak:

    $regfile = "m8def.dat"
    $cristal = 1000000
    
    Config Portd = Output
    
    Dim A As Byte
     For A = 1 to 250
      Set Portd.0
      Waitms 2
      Reset Portd.0
      Waitms 2
     Next A
    
     Do
     Loop
    End
    


    Tylko chciałem to wykonac w jakis inteligętny sposób

    Generuje częstotliwość 250Hz przez 1s
  • #14 10214001
    SylwekK
    Poziom 32  
    Teoretycznie masz te 250Hz, chociaż co do stabilności tej częstotliwości z użyciem WAITMS i zewnętrznego kwarcu bym polemizował...
    Można to było też zrobić na Toggle Portd.0 i wykorzystać jeden raz Waitms 2 tylko wtedy czas pętli dwukrotnie trzeba wydłużyć żeby 1s była. Najlepiej to skonfiguruj sobie wewnętrzny timer jako czasomierz (na elektrodzie jest bardzo dużo informacji jak to zrobić) i będziesz miał to zrobione w najbardziej "inteligętny" sposób.
REKLAMA