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

Atmega Bascom- Nietypowy Pwm

nouki 08 Wrz 2009 21:01 4613 13
REKLAMA
  • #1 6996322
    nouki
    Poziom 25  
    Witam.

    Walczę z tym problemem już od jakiegoś czasu szukałem ale nie znalazłem wiec zakładam ten temat.

    Problem mam z pewnym zagadnieniem a mianowicie:
    Atmega Bascom- Nietypowy Pwm
    https://obrazki.elektroda.pl/39_1252473817.jpg

    Chce uzyskać dwa przebiegi pwm tak jak na obrazku (czerwony 1pwm ,żółty 2 pwm).
    Częstotliwość to 50hz z możliwością regulacji do powiedzmy 200Hz.
    Na dodatek jeden z Pwm powinien być przesuwalny względem drugiego tzn:

    Na wykresie czas miedzy 1 a 2 jest taki sam, chce by można było czas ten przesunąć by jeden po drugim następował szybciej bądź oddalał się od niego odsunąć czyli - do krawędzi narastania bądź opadania drugiego .

    Czy to jest wykonalne?
  • REKLAMA
  • #2 6996415
    _Robak_
    Poziom 33  
    Wykonalne i niespacjalnie wymagajce ;) Ja bym do tego wykorzsytal timer1, poczytaj w datasheecie tam o timerach i sprzetowych pwmach. Wykorzystujac dwa kanaly jednego timera mozesz ustawic przesuniecie w fazie, tylko jak przesuniecie bedziesz mial polowe okresu to wypelnienie bedzie moglo byc maks 50%. Ale to tak na szybko co mi do glowy przychodzi. Natomiast wykorzystujac tryb CTC i przerwania mozna zrobic wszystko co bedziesz potrzebowac, dowolne przesuniecie w fazie wypelnienie 0-100% itp.
  • REKLAMA
  • #3 6996520
    nouki
    Poziom 25  
    A w jaki sposób zmieniać częstotliwość 50-200Hz

    Dokładnie chce by działało w następujący sposób:

    na jakieś Adc podpięty jest potencjometr, potencjometr zmienia częstotliwość od 50 do 200hz. Inne Adc ma potencjometr który przesuwa wypełnienie 2 względem 1.
  • #4 6996541
    _Robak_
    Poziom 33  
    Wszystko jest w datasheecie na prawde :) Jesli wybierzesz odpowiedni tryb (o zmiennym czasie impulsu) to albo przez zmiane OCR1A albo ICR1A (pisze z pamieci).
  • #5 6996587
    nouki
    Poziom 25  
    Pewnie jak bym wiedział i rozumiał do końca datasheet-a to bym może wiedział ale ... proszę jaśniej.
  • #6 6996621
    _Robak_
    Poziom 33  
    Jesli nie znasz angielskiego to w sieci jest gdzies przetlumaczony datasheet atmegi 128 :) W necie jest mnostwo materialow o tym jak konfigurowac pwm. Musisz poczytac sobie, jak bedziesz mial jakis konkretny problem to pisz na pewno ktos pomoze ;)
  • REKLAMA
  • #7 6997075
    nouki
    Poziom 25  
    na początek mam takie coś :

    
    $crystal = 8000000
    $regfile = "m8def.dat"
    Dim Wartosc As Word
    Dim Wartosca As Word
    
    Config Timer1 = Pwm , Pwm = 10 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down       'Konfiguracja Timera
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    
    do
       Wartosc = Getadc(0)
       If Wartosc > Pwm1b Then
       Incr Pwm1b
       Elseif Wartosc < Pwm1b Then
       Decr Pwm1b
       End If
    
    
       Wartosca = Getadc(0)
       If Wartosca > Pwm1a Then
       Incr Pwm1a
       Elseif Wartosca < Pwm1a Then
       Decr Pwm1a
       End If
    
    loop
    
    


    Wypełnienia sa sterowane z potencjomeru czyli napięcie 0-5v daje 0-100% wypełnienia
    teraz próbuje je przesunąć względem siebie.

    poglądowy schemat wygląda tak:
    Atmega Bascom- Nietypowy Pwm
    https://obrazki.elektroda.pl/4_1252473941.jpg
    R1 ma zmieniać wypełnienie 0-100% i częstotliwość 50-200Hz
    R2 ma ustawiać przesunięcie względem siebie.

    Jeśli ktoś jest w stanie jaśniej to opisać to proszę o to. Narazie zapoznaje się z polskim datasheet-em od AM128.
  • #8 6997293
    robin_pl
    Poziom 12  
    nouki napisał:
    poglądowy schemat wygląda tak:
    Atmega Bascom- Nietypowy Pwm

    Czy tylko u mnie nie widać części obrazków z Twoich postów a reszta jest nieklikalna czy inni mają tak samo ?
  • #9 6997811
    nouki
    Poziom 25  
    Więc na razie zdecydowałem się tylko na stałą impulsów o wypełnieniu 50% jak na rysunku z pierwszego postu a zmienna częstotliwość 50-200Hz i teraz kombinuje nad tym zagadnieniem.

    By było to widoczne chce zacząć od 0,1 do 5 Hz
  • #10 6997840
    _Robak_
    Poziom 33  
    Jesli chcesz aby bylo jak z pierwszego obrazka z wypelnieniem 50% (czyli zawsze jeden z nich bedzie w stanie wysokim) to ustaw timer1 na tryb 8. Rejestrem ICR1 regulujesz czestotliwosc (wraz z preskalerem), bity COM1A i COM1B ustawiasz tak zeby kanal a wlaczal sie przy przechodzeniu licznika w gore a kanal B wtedy wylaczal.
  • #11 6998136
    nouki
    Poziom 25  
    Wymyśliłem coś na próbę nim zacznę kombinować bo nie wiem czy do końca to ma tak wyglądać jak przedstawiam bo to teoria książkowa na której opieram swoje założenia.

    
    
    $crystal = 8000000
    $regfile = "m8def.dat"
    ...
    ..
    Config Timer0 = Timer , Prescale = 64
    ..
    
    On Timer0 Timer0_int
    Enable Interrupts
    Enable Timer0
    Timer0 = 6
    Licznik = 0
    
    
    Timer0_int:
    
    W = Getadc(3)
    X = 1024 - W
    K = X / 4
    Counter0 = Counter0 + 6
    Incr Licznik
    If Licznik = X Then
    Licznik = 0
    Call T
    End If
    Return
    
    
    Sub T
    toggle Portb.1
    Waitms K
    Toggle Portb.1
    Waitms K
    Toggle Portb.2
    Waitms K
    Toggle Portb.2
    Waitms K
    End Sub
    
    


    teoretycznie przy adc 500 powinno być przerwanie co 1s czyli :
    b.1 =1
    250ms
    b1=0
    250ms
    b.2=1
    250ms
    b2=0
    250ms
    tylko tyle że nie bardzo działa - nie robi nic

    testowałem na tym:

    
    $crystal = 8000000
    $regfile = "m8def.dat"
    
    Config Portd.7 = Output   
    
    Config Timer0 = Timer , Prescale = 64
    
    On Timer0 Timer0_int
    Enable Interrupts
    Enable Timer0
    Timer0 = 6
    Licznik = 0
    
    
    Timer0_int:
    
    Counter0 = Counter0 + 6
    Incr Licznik
    If Licznik = 500 Then
    Licznik = 0
    Toggle Portd.7
    End If
    Return
    

    i też nie działa (nic się nie dzieje).
    Chyba zakupić musze inna sztukę bo ta jest jakaś trefna.
  • #12 6998451
    arnoldziq
    VIP Zasłużony dla elektroda
    Witam.
    Nie mam tego na czym obecnie przetestować, ale może spróbuj w ten sposób :
    $crystal = 8000000
    $regfile = "m8def.dat"
    
    Config Portd.7 = Output
    
    Config Timer0 = Timer , Prescale = 64
    
    Dim Licznik As Integer
    
    On Timer0 Timer0_int
    Enable Interrupts
    Enable Timer0
    Timer0 = 6
    Licznik = 0
    
    Do
    
    Loop
    
    Timer0_int:
    Counter0 = Counter0 + 6
    Incr Licznik
    If Licznik = 500 Then
    Licznik = 0
    Toggle Portd.7
    End If
    Return
    
  • REKLAMA
  • #13 7001221
    Konto nie istnieje
    Poziom 1  
  • #14 13776467
    tknefel - GORKY
    Poziom 14  
    Pracuję nad nietypowym PWM jeśli można użyć takiego zwrotu na Atmedze 16. Problem polega tym że mam do dyspozycji 2 potencjometry. Jednym chcę regulować czas trwania logicznej 1 a drugim potencjometrem czas trwania logicznego 0. Czasy obu sygnałów regulowane w przedziale 0,05ms - 5ms. Poniżej próbny program. Ponieważ są to początki nauki Bascoma to program jest na miarę możliwości [code]
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dodatkowo na wyjściu PD5 chce wygenerować sygnał zanegowany ale pojawiający się po sygnale na którymś z wejść.
    Program bez linijek
    Timer1 = A11
    Toggle Led
    generuje prostokąt na razie w dosyć małym zakresie 120-480Hz, dodatkowo odczyt z wejścia ADC(0) skacze (np miedzy 34112 a 34240) co powoduje dość duże wahania częstotliwości.

    Ponieważ to są początki proszę o wyrozumiałość, jakieś przykłady i pomoc z problemami.
    1. Regulacja potencjometrami czasu trwania logicznej 1 i 0 w zakresie 0,05ms - 5ms.
    2. Po pojawieniu się sygnału na wejściu np PB.0 pojawia się na wyjściu PD.5 zanegowany sygnał z PD.4
    3. Problem ze skakaniem częstotliwości na wyjściu (skakanie odczyty wejścia ADC).
REKLAMA