Şimdi Ara

16f877 pwm

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
6
Cevap
0
Favori
2.531
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • slm arkadaşlar.16f877 ile yapılmış pwm kodlarını gönderiorum .
    bu konuda yeniyim cok orjinal bişebeklemeyin:)
    benim gibi yeni başlayanlara yardımcı olur umarım
     


    LIST P=16F877
    INCLUDE "P16F877.INC"

    ORG 0X00

    D_C EQU 0X20
    SAY1 EQU 0X21
    SAY2 EQU 0X22

    CALL PORTS

    MAIN
    CALL A_TO_D

    CALL PWM_D_C

    GOTO MAIN

    ;********************************************************************

    A_TO_D
    BANKSEL ADCON0
    BSF ADCON0,GO

    BANKSEL PIR1 ;PROGRAMIN BASINDA YAPILSAYDI SUREKLI DONUSTUREREK ILERLERDI KONTROLSUZ OLURDU
    BTFSS PIR1,ADIF ;A/D CONVERTER FLAG
    GOTO $-1

    BANKSEL ADRESH
    MOVF ADRESH,W
    BANKSEL D_C
    MOVWF D_C
    BANKSEL PORTB
    MOVWF PORTB

    CALL GECIKME

    RETURN

    ;*********************************************************************

    PWM_D_C
    BANKSEL D_C
    MOVF D_C,W ;DUTY CYCLE
    BANKSEL CCPR1L
    MOVWF CCPR1L

    BANKSEL TMR2
    CLRF TMR2

    BANKSEL T2CON
    BSF T2CON,TMR2ON

    RETURN

    ;********************************************************************

    GECIKME
    BANKSEL SAY1
    MOVLW d'225' ;BİRİNCİ SAYACA SAYI AT
    MOVWF SAY1
    DO1
    BANKSEL SAY2
    MOVLW d'225' ;İKİNCİ SAYACA SAYI AT
    MOVWF SAY2
    DO2
    DECFSZ SAY2,F
    GOTO DO2

    DECFSZ SAY1,F
    GOTO DO1
    RETURN

    ;**********************************************************************

    PORTS
    BANKSEL ADCON0
    MOVLW B'01000001' ;FOSC/8,CHANNEL0,
    MOVWF ADCON0

    BANKSEL ADCON1
    MOVLW B'00001110' ;ADRESH,PA0 ANALOG
    MOVWF ADCON1

    BANKSEL TRISA
    BSF TRISA,0 ;PA0 GIRIS
    CLRF TRISB ;PB CIKIS

    ;BANKSEL TRISC
    CLRF TRISC ;PORTC CIKIS

    BANKSEL PORTA
    CLRF PORTA ;PA,PB 0LANIR
    CLRF PORTB
    CLRF PORTC

    BANKSEL CCP1CON
    CLRF CCP1CON

    BANKSEL PR2
    MOVLW B'11111111' ;PWM PERIOD
    MOVWF PR2


    BANKSEL CCP1CON
    MOVLW B'00001111'
    MOVWF CCP1CON

    BANKSEL TMR2
    movlw D'4'
    MOVWF TMR2

    RETURN

    ;********************************************************************

    END


    porta'nın 0.pinine pot bağladım.pottan değiştirilen gerilim a/d ile dönüştürülüp sonuç portb'de gösterilir.
    ccp1'e bağlanan scop ile pwm darbeleri gözlenir.







  • Teşekkür ederim. Aslında böyle öğretici, parça programların bulunduğu, eğitim amaçlı sabit bir başlığımız olsa tam süper olurdu
  • microchip in pwm mantığını açıkladığı uygulama notu
    http://ww1.microchip.com/downloads/en/DeviceDoc/31014a.pdf
    pwm modülünü kullanmak isteyen arkadaşlara fikir verebilir...
  • bendePIc programlama ogrenmek istiyorum.
    ama bu pwm nedir.
    kısaltmalarin acilimini parantez icinde belirtirsenizz cok super olacak kaniimca
    bir de orneklerden ziyade neyin nasil isledigini anlatan yapida birseyler olursa yeni baslayanlara daha yardimci olur.
    progrmlama bilmeme ragmen bana bile uzak gorundu bu dil.
  • PWM in açılımı
    Darbe Genişlik Modulasyonu dur
  • Madem konu pwm den açılmış. Bende C (HI-TECH) için yaptığım pwm kütüphanesini ekliyeyim. Pakedin içinde kütüphane dosyası ve ufak bir programcık var. İstediğiniz değerlere göre üretilecek pwm dalgası için gerekli register değerlerini üretiyor.

    http://rapid-share.com/files/54100735/pwm_kutuphane.rar

    NOT: aradaki - işaretini kaldırın.

    Aşağıuda kütüphane dosyası verilmiştir.

    quote:


    /* PWM v0.05 (05.09.2007)
    *
    * Bu dosya PIC 16F877(A)'da PWM kullanmak için hazırlanmıştır.
    * Geciktirme için "delay.c" kütüphanesi kullanılmıştır.Önce o eklenmelidir.
    * Kullanabileceğiniz komutlar şunlardır.
    *
    * pwm_init(tmr2_prescaler_degeri,PR2_degeri)
    * pwm1_basla(kick_time,pwm1_degeri)
    * pwm1_degis(pwm1_degeri)
    * pwm1_kapat()
    *
    * pwm1 yerine pwm2 de kullanılabilir.
    *
    * Kullanacağnız değerleri hesaplamak için ekte ufak bir hesaplama aracı da sunulmuştur.
    * Programdan elde edeceğiniz değerleri burdaki komutlarda kullanabilirsiniz.
    * Kod fiziksel olarak denenmiştir ama bu hata olmayacağı anlamına gelmez.Hata ve
    * önerileriniz için mail ile ulaşabilirsiniz.
    *
    * Mehmet Muzaffer KÖSTEN muuzoo@hotmail.com
    *
    */

    void pwm_init(unsigned int tmr2,unsigned int PR2_d)
    {
    if(tmr2==1){
    T2CKPS1=T2CKPS0=0;
    }else if(tmr2==4){
    T2CKPS1=0;
    T2CKPS0=1;
    }else if(tmr2==16){
    T2CKPS1=T2CKPS0=1;
    }
    PR2=PR2_d;
    TMR2ON=1;
    }

    void pwm1_basla(unsigned int sure,unsigned int pwm1)
    {
    if(sure>0){
    RC2=1;
    DelayMs(sure);
    RC2=0;
    }
    di();
    PIE1=0x00;
    CCPR1L=(pwm1 & 1020) >> 2;
    CCP1CON=((pwm1 & 3) << 4);
    CCP1M3=CCP1M2=1;
    ei();
    }

    void pwm1_degis(unsigned int degis)
    {
    di();
    CCP1M3=CCP1M2=0;
    CCPR1L=(degis & 1020) >> 2;
    CCP1CON=((degis & 3) << 4);
    CCP1M3=CCP1M2=1;
    ei();
    }

    void pwm1_kapat(void)
    {
    CCP1M3=CCP1M2=0;
    }

    void pwm2_basla(unsigned int sure,unsigned int pwm1)
    {
    if(sure>0){
    RC1=1;
    DelayMs(sure);
    RC1=0;
    }
    di();
    PIE1=0x00;
    CCPR2L=(pwm1 & 1020) >> 2;
    CCP2CON=((pwm1 & 3) << 4);
    CCP2M3=CCP2M2=1;
    ei();
    }

    void pwm2_degis(unsigned int degis)
    {
    di();
    CCP2M3=CCP2M2=0;
    CCPR2L=(degis & 1020) >> 2;
    CCP2CON=((degis & 3) << 4);
    CCP2M3=CCP2M2=1;
    ei();
    }

    void pwm2_kapat(void)
    {
    CCP2M3=CCP2M2=0;
    }




    < Bu mesaj bu kişi tarafından değiştirildi muuzoo -- 6 Aralık 2007; 23:09:11 >




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.