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.

Proszę o sprawdzenie... Układ sterujący prędkością i zliczający impulsy.

1ceman 28 Mar 2006 16:23 1064 2
  • #1 28 Mar 2006 16:23
    1ceman
    Poziom 12  

    Cześć
    Układ do którego jest napisany program ma za zadanie:
    1. sterować prędkością obrotową silnika przy wykorzystaniu PWM i dwóch przycisków regulujących wypełnienie PWM.
    2. zliczać impulsy z transoptora i docelowo wyświetlać wartości na LCD, ale narazie (w kodzie który podaje) miga diodą tyle razy ile bylo impulsów.

    Proszę o sprawdzenie poprawności zapisu, jeśli to konieczne wprowadzenie poprawek i ich omówienie.

    Code:
    $regfile = "m8def.dat"
    

    $crystal = 1000000

    Config Timer2 = Pwm2 , Pwm2 = 8 , Compare 2 Pwm2 = Clear Down , Compare 2 Pwm2 = Disconnect , Prescale = 64

    '---transoptor---
    Config Timer1 = Timer , Prescale = 64
    Config Timer0 = Counter , Edge = Rising
    '----------------

    Config Pinb.2 = Input
    Config Pinb.4 = Input

    Config Pinb.3 = Output

    '---transoptor---
    Config Pinb.1 = Output
    '----------------


    Dim P As Byte

    S1 Alias Pinb.4
    S2 Alias Pinb.2

    Set Portb.4
    Set Portb.2

    Timer2 = 0


    '---transoptor---
    On Timer1 Odmierz_3s

    Dim Licz As Byte , I As Byte

    Enable Interrupts
    Enable Timer1
    Start Timer1

    Timer1 = 65535 - 15625
    Do

    '---pwm---
     If S1 = 0 Then
          Waitms 25
             If S1 = 0 Then
                Incr P
                Cls
                Lcd P
                   If P = 0 Then
                      P = 255
                   End If
                Timer2 = P
                Waitms 20
             End If
       End If

       If S2 = 0 Then
          Waitms 25
             If S2 = 0 Then
                Decr P
                Cls
                Lcd P
                   If P = 255 Then
                      P = 0
                   End If
                Timer2 = P
             End If
             Waitms 20
       End If
    '---------


    Loop
    End

    Odmierz_3s:
       Timer1 = 65535 - 15625
       Incr Licz
       If Licz = 3 Then
          Stop Timer1
          Licz = 0
          While I < Tcnt0
                Toggle Portb.1
                Waitms 100
                Toggle Portb.1
                Waitms 100
                Incr I
                Lcd P
          Wend
          I = 0
          Timer1 = 65535 - 15625
          Start Timer1
          Tcnt0 = 0
       End If
    Return


    Z góry bardzo dziękuję za pomoc.

    0 2
  • Pomocny post
    #2 28 Mar 2006 18:20
    M. S.
    Poziom 34  

    Coś mi się nie podoba część dotycząca PWM (bez dogłębnej analizy programu). Powodem jest zmiana wartości Timer2 w programie. Załączę poniżej program, którym próbowałem działanie PWM'ów na M8.
    (Komentarze dotyczą Timera1, a poniższy program utuchamia Timer2)
    Program działa w 2 pętlkach - jedna zwiększa wypełnienie i kiedu dojdzie do max druga petla zaczyna wypełnienie obniżać aż do min. Przy timerze 1 na jednym wejściu wypełnienie wzrasta i w tym samym czasie na drugim się zmniejsza. Z programu można wyczytać jakimi zmiennymi się steruje i jak konfiguruje się timery). Powodzenia.

    Code:
    $regfile = "m8def.dat"
    
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0
    'Config Pinb.1 = Output
    'Config Pinb.2 = Output
    Config Pinb.3 = Output
    Cursor Off
    'Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 8
    Config Timer2 = Pwm , Async = Off , Prescale = 8 , Pwm = On , Compare Pwm = Clear Down
    Dim I As Byte
    Do
    For I = 0 To 255
    'Pwm1a = I  Zmienna sterująca Timera 1 kanał a
    'Pwm1b = I  Zmienna sterująca Timera 1 kanał b
    Ocr2 = I      'Zmiwnna sterująca Timera 2
    Cls
    Lcd "I= ";I
    Waitms 10
    Next I
    For I = 255 To 0 Step -1
    'Pwm1a = I
    'Pwm1b = I
    Ocr2 = I
    Cls
    Lcd "I= " ; I
    Waitms 10
    Next I
    Loop
    End


    Z odczytaniem kodu nie powinno być problemów.

    0
  • #3 30 Mar 2006 08:14
    1ceman
    Poziom 12  

    Dzięki, widze teraz, że jednak troszke namieszałem ustawiając Timer2 ;) Nie wiem tylko dlaczego Bascom przepuścił moją konfiguracje Timer2.

    W pierwszej wersji programu, która była bez wykorzystania PWM (poprzez Timer2), program odliczał czas (Timer1), zliczał impulsy na Timer0 i migał diodą. W związku z tym pętla w programie głównym była pusta (Do-Loop). Teraz wstawiłem do niej część odpowiadającą za sygnał PWM, w której sprawdzany jest stan przycisków i na tej podstawie zmieniane wypełnienie PWM.
    Czy umieszczenie tego wewnątrz głównej pętli może w jakikolwiek sposób ''zaszkodzić'' reszcie programu, tzn. zliczaniu czasu (Timer1) i impulsów (Timer0)? Czyli inaczej mówiąc czy może na przykład spowodować, że czas będzie źle liczony przez timer, a co za tym idzie liczba zliczonych impulsów będzie nieodpowiednia bo w złym czasie zmierzona.

    0
  Szukaj w 5mln produktów