Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega Bascom- Nietypowy Pwm

nouki 08 Wrz 2009 21:01 4235 13
  • #1 08 Wrz 2009 21:01
    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?

    0 13
  • #2 08 Wrz 2009 21:17
    _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.

    0
  • #3 08 Wrz 2009 21:32
    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.

    0
  • #4 08 Wrz 2009 21:36
    _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).

    0
  • #5 08 Wrz 2009 21:41
    nouki
    Poziom 25  

    Pewnie jak bym wiedział i rozumiał do końca datasheet-a to bym może wiedział ale ... proszę jaśniej.

    0
  • #6 08 Wrz 2009 21:47
    _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 ;)

    0
  • #7 08 Wrz 2009 23:06
    nouki
    Poziom 25  

    na początek mam takie coś :

    Code:

    $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.

    0
  • #8 09 Wrz 2009 00:13
    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 ?

    0
  • #9 09 Wrz 2009 10:23
    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

    0
  • #10 09 Wrz 2009 10:33
    _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.

    0
  • #11 09 Wrz 2009 12:22
    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.

    Code:


    $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:

    Code:

    $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.

    0
  • #12 09 Wrz 2009 14:04
    arnoldziq
    Moderator Programowanie

    Witam.
    Nie mam tego na czym obecnie przetestować, ale może spróbuj w ten sposób :

    Code:
    $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

    0
  • #13 10 Wrz 2009 04:37
    emarcus
    Poziom 35  

    nouki napisał:
    Witam.

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

    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:

    Czy to jest wykonalne?


    Dla takich wymagan: Dwie fale z mozliwoscia zmiany czestotliwosci, wypelnienia oraz przsuniecia fazowego (adjustable phase shift) bedziesz musial uzyc dwoch timerow w trybie PWM. Nie bedzie latwo napisac funkcje dla jednego timera nawet wykorzystujac oba kanaly. Niezaleznie jaki uC zastosujesz (M8, M88 czy tez M168), w kazdym z nich co najmniej dwa timery supportuja pwm.

    e marcus

    0
  • #14 07 Lip 2014 22:28
    tknefel - GORKY
    Poziom 13  

    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: Bascom
    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).

    0