PWM ile led efekti vermek yardım

Başlatan altugduranoglu, 27 Ağustos 2010, 09:58:28

altugduranoglu

Öncelikle merhabalar. Aranıza yeni katıldım. Deneyim ve tecrübelerinize ihtiyacım var.


Ben pic pwm kontrölü ile arabanın iç lambasını, sis farlarını ve arabanın kapı açma kolunun oraya bağlayacagım ledleri kontrol etmek pwm ile led efekti vermek istiyorum. Kafamdaki sistemi basitce açıklıyım.


Oto Alarm ve merkezi kilit sistemleri hakkında az çok elektronik bilgim var. Şimdi araçların merkezi kilidini kapı açma kapama yı tetik yada anahtar olarak düşünürsek, kapıyı kumandadan actıgımızda merkezi kilit anahtar görevi görererek pic'e sinyal vericek otonun iç lambaları pic ile normal bir şekilde yanıcak kapı kolunun iç kısmına bagladıgımız ledler patlama efekti vererek artarak yanıcak 10 saniye sonra azalarak sönücek.


Aynı sekilde arabayı anahtardan kitledigimizde sisler ve parklar 10 - 15 saniye yanıp sönücek bu sebeble eve giderken sisler bize eşlik edicek. yeni model arabalarda bu sistemin adı follow me home galiba. Böyle bir sistem düşünüyorum.


Fikir versin diye video koyuyorum.

http://video.yahoo.com/watch/7985118/21163167


Basit olarak düşünürsek anahtardan (açma) tetik geldiginde 5 led (örn. 4 kapı kolu + iç lamba) bu videodaki veya benzer efekti pwm ile vererek yanıcak 10-15 saniye sonra azalarak sönücek. Kapama tetik geldiginde 2 led efektsiz sürekli yanıcak 15 saniye yanıp azalarak söncek (örn.sisler ve parklar)
.
Şimdi elimizde olanlar 2 adet tetik anahtar. kapı acma kapama.




Mekatronik cıkışlıyım. Mekanik olsun Elektronik olsun bilgim yazılım azda olsa bilgim  var. Pic programlayıcı plaket perhidrol hersey hazırda :D sadece yazılım ve pwm konusunda eksiklerim var.

Pwm konusunda örneklere ihtiyacım var. En azından tek led'e pic kullanarak pwm ile bu efekti nasıl veririm. Yazılım konusunda eksiklerim var. Ufaktan uygulamalar ile bu işe başlamak istiyorum. forumdaki uygulamaları inceleyip uygulamaya geçirmek istedigimde önüme hep hatalar cıkıyor. 

Ete arkdasımızın yaptığı yazılımı inceledim benim projeme benziyor pwm var efekt için bir türlü hexe ceviremedim. derleyici hep hata verdi. Isıs te devre ufaktan bi devre kurup sizlerinde yardımı ile projemi gercekleştirmek istiyorum pic ve yazılıma hakim olmak geliştirmek istiyorum. Hazıra konmak değil kendim bişiler yapmaktır öenmli olan. Önerilerinizi bekliyorum.

Şimdiden Teşekkürler...

altugduranoglu


t2

Yapılacak işler şunlar

1-Önce 1 tane ledi yakıp söndürebilmen gerek.
2- Sonra pwm ile onu kısıp açma aşamasına geç.
Soft pwm ve hard pwm olmak üzere 2 tipi var. led işlerinde soft pwm fazlasıyla yeter.

Zor iş değil bunlar  hazır örnek de vardır.  yukarıdaki 2 maddeyi yaptıktan sonra istediğin senaryo dahilinde işletirsin.  Bu aşamaları mutlaka tamamlamalısın yoksa hazıra konmuş olursun.

İşte 8 kanallı soft pwm.  Bu kod sayesinde 8 ayrı ledi (veya grubunu) farklı parlaklıklarda sürebilirsin.
'implement PWM on 8 pins with individual duty cycles.

' Create eight PWM outputs, using interrupts
' Incremently increase brightness of eight LEDs attached to PORTD 

'------------------------------------------------------------

' Compiler Declares :-

    Device = 16F877

Reminders = Off

    Optimiser_Level = 1

    Dead_Code_Remove = On

    Xtal = 4

    Fsr_Context_Save = Off        ' Don't save the FSR register within the interrupt

'------------------------------------------------------------

' Variables :-

' Make sure these variables are located low in RAM. i.e. first in the Dim list

' This will minimise RAM bank switching

'

    Dim Temp As Byte

    Dim Accum0 As Byte           ' DutyCycle Accumumulators

    Dim Accum1 As Byte

    Dim Accum2 As Byte

    Dim Accum3 As Byte

    Dim Accum4 As Byte

    Dim Accum5 As Byte

    Dim Accum6 As Byte

    Dim Accum7 As Byte

 

    Dim DutyCycle0 As Byte        ' DutyCycle DUTY cycle registers

    Dim DutyCycle1 As Byte

    Dim DutyCycle2 As Byte

    Dim DutyCycle3 As Byte

    Dim DutyCycle4 As Byte

    Dim DutyCycle5 As Byte

    Dim DutyCycle6 As Byte

    Dim DutyCycle7 As Byte 

 

 

'------------------------------------------------------------

' Symbol Alias's

    Symbol T0IE INTCON.5        ' Timer0 Overflow Interrupt Enable

    Symbol T0IF INTCON.2        ' Timer0 Overflow Interrupt Flag

    Symbol GIE  INTCON.7        ' Global Interrupt Enable

 

    Symbol PS0 OPTION_REG.0     ' Prescaler ratio bit-0

    Symbol PS1 OPTION_REG.1     ' Prescaler ratio bit-1

    Symbol PS2 OPTION_REG.2     ' Prescaler ratio bit-2

    Symbol PSA OPTION_REG.3     ' Prescaler Assignment (1=assigned to WDT, 0=assigned to oscillator)

    Symbol T0CS OPTION_REG.5    ' Timer0 Clock Source Select (0=Internal clock, 1=External PORTA.4)

 

'------------------------------------------------------------

 

    On_Hardware_Interrupt GoTo PWM_interrupt ' Point interrupt to handler

    All_Digital = True                  ' Set PORTA and PORTD to all digital

    GoTo Main                           ' Jump over the interrupt handler

 

'------------------------------------------------------------

' Interrupt Subroutine

' Update eight 8-bit PWM'S on PORTD

PWM_interrupt:

    Context Save                        ' Save WREG, STATUS, and PCLATH

    Accum0 = Accum0 + DutyCycle0        ' Update DutyCycle0

    rol Temp    

    Accum1 = Accum1 + DutyCycle1        ' Update DutyCycle1

    rol Temp    

    Accum2 = Accum2 + DutyCycle2        ' Update DutyCycle2

    rol Temp    

    Accum3 = Accum3 + DutyCycle3        ' Update DutyCycle3

    rol Temp    

    Accum4 = Accum4 + DutyCycle4        ' Update DutyCycle4

    rol Temp    

    Accum5 = Accum5 + DutyCycle5        ' Update DutyCycle5

    rol Temp    

    Accum6 = Accum6 + DutyCycle6        ' Update DutyCycle6

    rol Temp    

    Accum7 = Accum7 + DutyCycle7        ' Update DutyCycle7

    rlf Temp,W

    movwf PORTD                         ' Output DutyCycle States

    T0IF = 0                            ' Clear the TMR0 overflow flag

    Context Restore                     ' Restore WREG, STATUS, and PCLATH. Then exit the interrupt

'------------------------------------------------------------

' Subroutines can go here

 

'------------------------------------------------------------

' Main Demonstration Loop

Main:

    Temp = 0

    Accum0 = 0: Accum1 = 0: Accum2 = 0: Accum3 = 0

    Accum4 = 0: Accum5 = 0: Accum6 = 0: Accum7 = 0        

    DutyCycle0 = 0: DutyCycle1 = 0: DutyCycle2 = 0: DutyCycle3 = 0

    DutyCycle4 = 0: DutyCycle5 = 0: DutyCycle6 = 0: DutyCycle7 = 0

 

    Low PORTD                       ' Make PortD an output and extinguish the LEDs

    PSA = 0                         ' Assign the prescaler to external oscillator

    PS0 = 1                         ' Set the prescaler

    PS1 = 0                         '       to increment TMR0

    PS2 = 0                         '       every nth instruction cycle

    T0CS = 0                        ' Assign TMR0 clock to internal source

    TMR0 = 0                        ' Clear TMR0 initially

    T0IE = 1                        ' Enable TMR0 overflow interrupt

    GIE = 1                         ' Enable global interrupts    

    While 1 = 1

        For DutyCycle0 = 255 To 1 Step -1

            DutyCycle1 = ~DutyCycle0

            DelayMS 1

        Next

        For DutyCycle1 = 255 To 1 Step -1

            DutyCycle2 = ~DutyCycle1

            DelayMS 1

        Next

        For DutyCycle2 = 255 To 1 Step -1

            DutyCycle3 = ~DutyCycle2

            DelayMS 1

        Next

        For DutyCycle3 = 255 To 1 Step -1

            DutyCycle4 = ~DutyCycle3

            DelayMS 1

        Next

        For DutyCycle4 = 255 To 1 Step -1

            DutyCycle5 = ~DutyCycle4

            DelayMS 1

        Next

        For DutyCycle5 = 255 To 1 Step -1

            DutyCycle6 = ~DutyCycle5

            DelayMS 1

        Next

        For DutyCycle6 = 255 To 1 Step -1

            DutyCycle7 = ~DutyCycle6

            DelayMS 1

        Next

        For DutyCycle7 = 255 To 1 Step -1

            DutyCycle0 = ~DutyCycle7

            DelayMS 1

        Next

    Wend