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

[Mega8][Bascom] Kodu do PWM.

mlassota 02 Lip 2008 13:20 3669 4
  • #1 5305292
    mlassota
    Poziom 18  
    Szanowni Koledzy

    Zaczynam "przygodę z mikrokontrolerami"
    Jako, że będę wykorzystywał "wiedzę" do celów "osobistych" stąd Bascom

    Napisałem już termostat na DS13b20 i działa
    Przy pomocy tego samego układu (a jest w nim jeszcze ok 4 kb wolego miejsca) chciałbym móc regulować napięciem na jednym z portów (PodrtD.5) Jak dotąd nauczyłem sie obsługi dołączonych przycisków, potrafię włączyć i wyłączyć +5V na wskazanym porcie

    Nie potrafię wygenerować napięcia o innej wartości.

    Chce regulować obroty silniczka 12V (domyślam sie ze przez PWM) ale nie znalazłem żadnych tematów w których wyjaśnione było by jak napisać (najlepiej na przykładach) regulacje napięcia.

    Rozumie, ze silnik 12V należy podłączyć przez tranzystor np NPN

    Bardzo proszę o pomoc (przykłady kodu) w realizacji :)

    Założenia - wartość "mocy" na silniku ustawiana na stałe w menu (to potrafię zrobić" w zakresie np 1-20 (zmienna o nazwie MOC)

    To chyba wszystkie założenia

    Pozdrawiam
    M

    [Przenoszę z "Układy elektroniczne DIY, ...". Mariusz Ch.]
  • Pomocny post
    #2 5305697
    JmL(TM)
    Poziom 24  
    Prosze bardzo:

    'Program regulujący prędkość obrotową silnika DC 12 V
    'Do sterowania wykorzystano sygnał PWM
    'Częstotliwość przebiegu PWM ok. 254 Hz - 8 MHz/510/64
    'Przycisk S1 zwiększa prędkość obrotową silnika
    'Przycisk S2 zmniejsza prędkość obrotową silnika
    
    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
           'dyrektyw mikrokontrolera
    $crystal = 8000000                                          'informuje kompilator
           'o częstotliwości oscylatora
           'taktującego mikrokontroler
    Config Pinb.4 = Input                                       'linia PB4 jako wejściowa
    Config Pinb.2 = Input                                       'linia PB2 jako wejściowa
    Config Pinb.1 = Output                                      'linia PB1 (PC1A) jako wyjściowa
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 64       'konfiguracja Timer1 jako
           'generatora sygnału PWM na
           'wyjściu OC1A
    Dim I As Byte                                               'zmienna, której wartość określa
           'wypełnienie sygnału PWM
    
    S1 Alias Pinb.4                                             'przypisanie nazwie Pinb.4
           'nazwy S1
    S2 Alias Pinb.2                                             'przypisanie nazwie Pinb.2
           'nazwy S2
    
    Set Portb.4                                                 'dołączenie do linii PB4
           'rezystora podciągającego
    Set Portb.2                                                 'dołączenie do linii PB2
           'rezystora podciągającego
    Pwm1a = 0                                                   'wpisanie wartości początkowej 0
           'wypełnienia sygnału PWM
    
    Do                                                          'początek nieskończonej pętli
     If S1 = 0 Then                                             'jeśli przyciśnięty S1, to
      Waitms 25                                                 'opóźnienie dla eliminacji drgań
           'styków
       If S1 = 0 Then                                           'sprawdzenie ponownie, czy
           'przycisk S1 dalej naciśnięty,
           'jeśli tak, to
       Incr I                                                   'zwiększenie o jeden wartości I
       If I = 0 Then                                            'jeśli wartość I = 0, to
        I = 255                                                 'wpisanie do I wartości 255
       End If
       Pwm1a = I                                                'wpisanie wartości I do zmiennej
           'Pwm1a określającej wypełnienie
           'PWM
       Waitms 20                                                'opóźnienie 20 ms
      End If                                                    'koniec warunków
     End If
     If S2 = 0 Then                                             'jeśli przyciśnięty S2, to
      Waitms 25                                                 'opóźnienie dla eliminacji drgań
           'styków
      If S2 = 0 Then                                            'sprawdzenie ponownie, czy
           'przycisk S2 dalej naciśnięty,
           'jeśli tak, to
       Decr I                                                   'zmniejszenie wartości I o jeden
       If I = 255 Then                                          'jeśli wartość I = 255, to
        I = 0                                                   'zerowanie wartości zmiennej I
       End If
       Pwm1a = I                                                'wpisanie wartości I do zmiennej
           'Pwm1a określającej wypełnienie
           'PWM
       Waitms 20                                                'opóźnienie 20 ms
      End If                                                    'koniec warunków
     End If
    Loop                                                        'koniec pętli nieskończonej
    End                                                         'koniec programu


    Po szczegoly odsylam do ksiazki "Programowanie mikrokontrolerow AVR w BASCOM" skad ow kod pochodzi :D
  • #3 5306544
    dawid512
    Poziom 32  
    Kolega dostał gotowca a chyba nie taka jest idea forum prawda JmL(TM)?
    Na przyszłość zajrzyj do helpa bascoma i spróbuj sam sklecić choć kawałek kodu. To nic nie kosztuje a sam dojdziesz co i jak ma być.

    Dla autora tematu: przy pomocy PWM możesz sobie generować i regulować napięcie na określonym wyprowadzeniu procka tzn. OCR1A, OCR1B itd.
    Pamiętaj o rezystorze na bazie tranzystora.

    Pozdrawiam i na przyszłość trochę więcej inicjatywy własnej.
  • #4 5307666
    JmL(TM)
    Poziom 24  
    Dawid512: To racja, dostal gotowca [tlusta rybe a nie bambusowa wedke] ale wg mnie w tym przypadku zaoszczedzi to sporo jego czasu a na bazie gotowca mozna rowniez sie wiele nauczyc [przynajmniej ja tak sadze]. Sam czesto uczylem sie analizujac "cudzy" kod zrodlowy i w ten sposob poszerzalem swoja wiedze. A czasem na forum, szczegolnie jesli ktos jest poczatkujacy w pewnej "dziedzinie" i dostaje tylko wskazowki to moze okazac sie to nie wystarczajace a tak moze poswiecic czas na rozwoj projektu... ;) Takie jest moje zdanie i nie musisz sie z tym zgadzac, zreszta podalem rowniez nazwe ksiazki, gdzie temat jest opisany wiec moze po nia siegnie i nauczy sie wiecej... ? Ale masz calkowita racje piszac: "...i na przyszłość trochę więcej inicjatywy własnej." bo czesto ludzie licza na gotowca podanego na tacu a ja niestety w tym przypadku z zimna krwia go zaserwowalem :D Nastepnym razem faktycznie jednak troche sie wstrzymam z gotowcami.

    Pozdrawiam!
  • #5 5315289
    mlassota
    Poziom 18  
    Witam

    Z tym gotowcem... fakt - ale tak jak zauważył JmLl(TM) - ja należę do ludzi, którzy uczą sie na przykładach - jestem bardzo wdzięczny - bo nie mam książki a przykład PWM bardzo mi sie przyda

    Raz jeszcze dziękuję


    M

    Dodano

    A to kod nad którym pracowałem i do którego potrzebowałem PWM

    Sterownik do wytrawiarki:

    Termometr na DS18b20 a pompka - to pompka z zepsutego ciśnieniomierza automatycznego :)
    i powstało coś takiego
    :

    
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
    Config Lcd = 20 * 4
    Config 1wire = Portd.5
    Config Portc.5 = Output
    Config Portc.2 = Input
    Config Portc.3 = Input
    Config Portc.4 = Output
    Config Portb.1 = Output
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 64
    
    Dim Temp As Integer , T_wys As String * 6
    Dim Dsid(8) As Byte
    Dim Z1 As Integer
    Dim Z2 As Integer
    Dim Zap1 As Eram Integer
    Dim Zap2 As Eram Integer
    Dim B As Byte
    Dim Grzanie As Bit
    Dim Z11 As Integer
    Dim Wyp As Byte
    Dim Z22 As Integer
    Dim W As Byte
    Dim Moc As Integer
    Dim Moc_w As String * 8
    W = 1
    deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32
    Cursor Off
    Cls
    
    Portc.4 = 0
    Portc.3 = 1
    Portc.2 = 1
    Portc.5 = 0
    Pwm1a = 0
    
    If Pinc.2 = 1 Then Goto Termostat
    If Pinc.2 = 0 Then Goto Tmin
    
    Tmin:
    Lcd "      MENU"
    Wait 3
    
    Z1 = 15
    Cls
    Do
    Locate 1 , 1
    Lcd "Temp zal"
    Locate 2 , 3
    Lcd Z1
    Portc.3 = 1
    If Pinc.3 = 0 Then Z1 = Z1 + 1
    Waitms 300
    Zap1 = Z1
    If Pinc.2 = 0 Then Goto Tmax
    Loop
    Tmax:
    Cls
    Locate 1 , 1
    Lcd "Temp wyl"
    Z2 = Z1 + 1
    Do
    Locate 2 , 3
    Portc.3 = 1
    Lcd Z2
    If Pinc.3 = 0 Then Z2 = Z2 + 1
    Waitms 300
    Zap2 = Z2
    If Pinc.2 = 0 Then Goto Termostat
    Loop
    
    Termostat:
    Locate 1 , 1
    Lcd "     Termostat"
    Locate 2 , 1
    Lcd "    by mlassota"
    Dsid(1) = 1wsearchfirst()
    If Dsid(8) = Crc8(dsid(1) , 7) Then
     Wait 1
     For B = 1 To 8
     Next
    End If
    Wait 1
    Cls
    Do
    Z1 = Zap1
    Z2 = Zap2
    1wreset
    1wwrite &H55
    1wverify Dsid(1)
    1wwrite &HBE
    Temp = 1wread(2)
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Wait 1
    Temp = Temp * 10
    Temp = Temp / 16
    If Temp > 0 Then
    T_wys = Str(temp)
    T_wys = Format(t_wys , "  0.0")
    Locate 3 , 1
    Lcd "Temp. " ; T_wys ; Chr(0) ;
    Else
    T_wys = Str(temp)
    T_wys = Format(t_wys , " 0.0")
    Locate 3 , 1
    Lcd "Temp. " ; T_wys ; Chr(0) ;
    End If
    Locate 1 , 1
    Lcd "Nastawy"
    Locate 2 , 1
    Lcd "min " ; Z1 ; Chr(0)
    Locate 2 , 10
    Lcd "max " ; Z2 ; Chr(0)
    Z11 = Z1 * 10
    Z22 = Z2 * 10
    If Temp <= Z11 And Grzanie = 0 Then
    Grzanie = 1
    Set Portc.4
    Locate 3 , 16
    Lcd "ON "
    End If
    If Temp >= Z22 And Grzanie = 1 Then
    Grzanie = 0
    Reset Portc.4
    Locate 3 , 16
    Lcd "OFF"
    End If
    If Pinc.2 = 0 Then
    Waitms 25
    If Pinc.2 = 0 Then
    Wyp = Wyp + 25
    If Wyp =< 10 Then
        Wyp = 250
    End If
    End If
    Pwm1a = Wyp
    
    
    Waitms 10
    End If
    If Pinc.3 = 0 Then
    Waitms 25
    If Pinc.3 = 0 Then
    Wyp = Wyp - 25
    If Wyp >= 250 Then
    Wyp = 0
    End If
    Pwm1a = Wyp
    Waitms 20
    End If
    End If
    Locate 4 , 1
    
    Moc = Wyp * 100
    Moc = Moc / 250
    
    If Moc <= 90 Then
    Moc_w = Str(moc)
    Moc_w = Format(moc_w , " 00")
    Locate 4 , 1
    Lcd "Moc " ; Moc_w ; " %"
    Else
    Moc_w = Str(moc)
    Moc_w = Format(moc_w , "000")
    Locate 4 , 1
    Lcd "Moc " ; Moc_w ; " %"
    End If
    
    Loop
    End
    


    Może komuś sie przyda :)
    Pozdrawiam
REKLAMA