logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.
  • #1 5324902
    hak
    Poziom 2  
    Witam serdecznie.

    Próbuje stworzyć generator PWM o zmiennym wypełnieniu i zmiennej częstotliwości. Generator ten chce stworzyć na ATmega32 12MHz w języku BASCOM. Zmian dokonywać będzie można przez dwa potencjometry.
    Mam już napisany program ale niestety sygnał na oscyloskopie wariuje. Co jakiś czas jest przebicie innych wartości. Walczyłem z tym dość długo ale nie mogę zlokalizować błędu.
    Zamieszczam Mój kod:



    
    $crystal = 12000000
    
    'timer
    Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1
    On Compare1a Change
    Enable Compare1a
    Enable Interrupts
    
    
    'Przetwornik analogowo cyfrowy
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    
    Start Adc
    
    'zmienne
    Dim F As Word
    Dim D As Word
    Dim D2 As Word
    Dim F3 As Word
    Dim Xxx As Single
    
     
    
    Config Portb = 255
    Portb = 255
    
    Config Portc = 255
    Portc = 255
    
    Config Portd = 255
    Portd = 255
    
    
    F = Getadc(2)
    F = Getadc(2)
    
    Pwm1a = F
    Do
    
    ' odczyt z adc:
    'kanał 0 - częstotliwość  -> F
    'kanał 1 - wypełnienie    -> D
    
    D = Getadc(3)
    D = Getadc(3)
    F = Getadc(2)
    F3 = Getadc(2)
    
    Shift D , Right , 2
    
    Xxx = D / 256                                               'procentowa wartość wypełnienia
    Shift F3 , Right , 2
    Xxx = Xxx * F3                                              'wypełnienie
    Xxx = Round(xxx)
    D2 = Xxx
    
     
    
    Loop
    
    
    End
    
    
    Change:
    
     ' zmiana długości wypełnienia/przerwy
    If Pind.5 = 1 Then
       Pwm1a = D2
       Else
       Pwm1a = F3 - D2
       End If
    
    
    Return
    
  • #2 5325367
    paluszasty
    Poziom 25  
    Nie analizowałem kodu, ale wydaje mi sie ze problem możne tkwić w niestabilności potencjometrów, względnie jakiegoś źródła napięcia (rozumiem ze zbudowałeś dzielnik napięcia na potencjometrze i jakimś źródle napięciowym i podajesz to na wejście ADC) .Jak duże są te zmiany??
  • #4 5325634
    hak
    Poziom 2  
    Witam i dzięki za zainteresowanie problemem, ale niestety nie może (99%) to być wina potencjometrów i przetwornika. Wykasowałem odpowiednią cześć kodu ale zrobiony był jeszcze podgląd wyników na wyświetlaczu. Dodatkowo aby wyeliminować małe wahania wyników dziele je przez 4. Co do tego rozjeżdżania to to wygląda tak że ustawiam jakąś wartość wypełnienia i częstotliwości na oscyloskopie widzę że jest poprawna ale co jakiś czas ( trzeci czwarty przebieg ) wskakuje jakąś inna wartość częstotliwości. Mam wrażenie że licznik przepełnia się szybciej niż zebranie danych, obrobienie ich i przekazanie nowej wartości do rejestry pwm1a.
  • #5 5327775
    ZbeeGin
    Poziom 39  
    Wiesz o tym, że licznik sprzętowy z preskalerem 1 jest szybszy od programu jaki masz napisany. Zanim instrukcje się wykonają to licznik zliczy jeszcze parę impulsów. Stąd te wachania.
  • #6 5327857
    hak
    Poziom 2  
    Właśnie siedzę nad moim generatorem. Udało się! ha ufff jeee
    Masz rację jest to wina prescalera i innych podprocedur. jak wyeliminowałem wszystkie inne polecenia, udało mi się uzyskać na preskalerze 1 wyniki:

    D = 50%
    F = 40 - 12 KHz

    D = 75%
    F = 25- 12 KHz

    D = 90% - Max
    F = 12 KHz

    preskaler 8:
    D = 50%
    F = 40 - 1.5 KHz -> gdzie do 25 KHz jest jeszcze płynna regulacja

    D = 75%
    F = 30 - 1.5 KHz

    Długość impulsu nie może być krótsza niż 11 us.
REKLAMA