Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Pwm hasas ayar

Başlatan Kahraman34, 12 Ocak 2016, 13:09:36

Kahraman34

Arkadaşlar yeniyim nasıl konu açılır nasıl anlatılır hatam var ise kusura bakmayın.
Forum da pwm konularını karıştırdım ama çözemedim mevzuyu.
işlemci f452
xtall=20 mhz
pr2=124
tmr2=4

frekansımı 10 khz hesap ettim..

duty değerini 1 verdim.
% olarak iş süresini %20 hesapladım.(1 ms dolu)

duty değerini 2 yapınca %40 3,4,5, yapınca sıryala %100 e ulaşıyorum..

Sanırım buraya kadar sorun yok..
Ancak yapmak istediğim olay bu değil iş süresinin %1 olarak artmasını istiyorum ..
hem pr2 hemde duty değerini değiştirerek bu hassasiyeti yakalıyorum ancak isteğim sadece duty değerini değiştirerek bu hassasiyeti yakalamak..

Anlatabildim mi bilemiyorum, bu konuda yardıma ihtiyacım var teşekkür ederim.

mehmet

http://eng-serve.com/pic/pic_pwm.html
#include <stdint.h>        /* For uint8_t definition */

// PIC18F452 Configuration Bit Settings

// 'C' source line config statements

#include <xc.h>

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG1H
#pragma config OSC = HS         // Oscillator Selection bits (HS oscillator)
#pragma config OSCS = OFF       // Oscillator System Clock Switch Enable bit (Oscillator system clock switch option is disabled (main oscillator is source))

// CONFIG2L
#pragma config PWRT = ON        // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOR = ON         // Brown-out Reset Enable bit (Brown-out Reset enabled)
#pragma config BORV = 42        // Brown-out Reset Voltage bits (VBOR set to 4.2V)

// CONFIG2H
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 128      // Watchdog Timer Postscale Select bits (1:128)

// CONFIG3H
#pragma config CCP2MUX = ON     // CCP2 Mux bit (CCP2 input/output is multiplexed with RC1)

// CONFIG4L
#pragma config STVR = ON        // Stack Full/Underflow Reset Enable bit (Stack Full/Underflow will cause RESET)
#pragma config LVP = OFF        // Low Voltage ICSP Enable bit (Low Voltage ICSP disabled)

// CONFIG5L
#pragma config CP0 = ON         // Code Protection bit (Block 0 (000200-001FFFh) code protected)
#pragma config CP1 = ON         // Code Protection bit (Block 1 (002000-003FFFh) code protected)
#pragma config CP2 = ON         // Code Protection bit (Block 2 (004000-005FFFh) code protected)
#pragma config CP3 = ON         // Code Protection bit (Block 3 (006000-007FFFh) code protected)

// CONFIG5H
#pragma config CPB = ON         // Boot Block Code Protection bit (Boot Block (000000-0001FFh) code protected)
#pragma config CPD = ON         // Data EEPROM Code Protection bit (Data EEPROM code protected)

// CONFIG6L
#pragma config WRT0 = ON        // Write Protection bit (Block 0 (000200-001FFFh) write protected)
#pragma config WRT1 = ON        // Write Protection bit (Block 1 (002000-003FFFh) write protected)
#pragma config WRT2 = ON        // Write Protection bit (Block 2 (004000-005FFFh) write protected)
#pragma config WRT3 = ON        // Write Protection bit (Block 3 (006000-007FFFh) write protected)

// CONFIG6H
#pragma config WRTC = ON        // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) write protected)
#pragma config WRTB = ON        // Boot Block Write Protection bit (Boot Block (000000-0001FFh) write protected)
#pragma config WRTD = ON        // Data EEPROM Write Protection bit (Data EEPROM write protected)

// CONFIG7L
#pragma config EBTR0 = ON       // Table Read Protection bit (Block 0 (000200-001FFFh) protected from Table Reads executed in other blocks)
#pragma config EBTR1 = ON       // Table Read Protection bit (Block 1 (002000-003FFFh) protected from Table Reads executed in other blocks)
#pragma config EBTR2 = ON       // Table Read Protection bit (Block 2 (004000-005FFFh) protected from Table Reads executed in other blocks)
#pragma config EBTR3 = ON       // Table Read Protection bit (Block 3 (006000-007FFFh) protected from Table Reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = ON       // Boot Block Table Read Protection bit (Boot Block (000000-0001FFh) protected from Table Reads executed in other blocks)


#define _XTAL_FREQ 20000000UL
#define MAX_DUTY    124

/*
 * Project name:
     BJD_PWM_Registers
 * Author:
     Barton J.  Dring 08/2007
     Dring Engineering services
     [url=http://www.eng-serve.com]www.eng-serve.com[/url]
 * Description:
     This code demonstrates how to set PWM registers manually
 * Test configuration:
     MCU:             PIC16F877A
     Dev.Board:       EasyPIC4
     Oscillator:      HS, 08.0000 MHz
     SW:              mikroC v6.0
 * NOTES:
     None.
*/

void main(void)
{
    uint8_t oran;
    
    ADCON1 = 0x07;
    TRISA = 0x00;
    TRISB = 0x00;
    TRISC = 0x00;
    TRISD = 0x00;
    TRISE = 0x00;
    

    /*
    * PWM Register Values
    * Oscillator Frequency Fosc = 20000000
    * Clock Frequency Fclk = 5000000
    * PWM Freq = 10000 desired...actual: 10000
    * Prescaler Value = 4
    * PR2 = 124
    * Maximum duty value = 500 
    * Requested Duty Value = 5
    * 
    * Code Provided AS IS....Use at your own risk!
    */

    // be sure to set PWM port as output
    T2CON = 0b00000101; // prescaler + turn on TMR2;
    PR2 = 0b01111100;
    CCPR1L = 0b00000001;  // set duty MSB
    CCP1CON = 0b00011100; // duty lowest bits + PWM mode
    
    oran = 10;    // %10 duty
    CCPR1L = (MAX_DUTY * oran) / 100;
    while(1)
    {
        
    }
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Kahraman34

Cevabınız için teşekkür ederim . Anladığım kadar ile 500 değerinde %100 iş süresine geliyor.. Buraya kadar tamam olayı anladım. Anladığım başka bir olay da benim derdimin başka olduğu..

Şöyle ki ben %30 iş süresine geldiğimde çıkışım zaten max değerini alıyor.
Pwm çıkışı beyzi sürüyor, duty değerine 1 verdiğimde 5 volt 2 verdiğimde 10 volt 3 verdiğimde 20 volt..

Yani voltajım katlanarak büyüyüp gidiveriyor.duty değeri 5 olunca zaten çıkış full oluyor. Ben bu voltajı 0.1 volt hassasiyetle yükseltmek istiyorum.bunu yapamıyorum.

Not(Frekansı değiştirmeden yapmak istiyorum.)
Acaba sorunum çözünürlük müdür yoksa pwm in sırrına hala eremedim mi.. Teşekkür ederim.

mehmet

Şema paylaşırsanız daha iyi olacak...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Kahraman34




Hocam bir şemam yok ama sistem bu şekilde. Siz şema diyince aklıma birde yükün emiterde olduğu geldi... Acaba bumu sorun dur ?

ete

Bu işin data sheete göre nasıl yapıldığını bilmenizde yarar var.
20 Mhz kristal frekansında 10 Khz lik HPWM sinyali elde etmek için;
- PR2=124 değerini vereceksiniz.
- T2CON=%00000101 (Yani 5 değerini vereceksiniz). Bölme oranı 1/4 olması gerekiyor.
Bu ayarlar ile Max Duty değeriniz 500 olacak ve %100 Duty değerine karşılık gelecektir.
Şimdi bu ön ayarlara bağlı olarak %10 Duty oranına sahip bir sinyalin çıkartılması için ne yapmanız gerekiyor onuda belirtelim.
%10 duty oranı demek Duty=500*10/100=50 değerini kullanacağınız anlamına gelir.
Bu duumda Duty değerini her seferinde %10 artırmak için Duty=DUTY+50 formüünü kullanmanız yeterli olacaktır.
10 bitlik olan Duty değerinin HIGHBYTE kısmı (2 bit) CCP1CON registerinin 4 ve 5 nolu bitlerine veriliyor.
LOWBYTE kısmı ise CCPR1L registerine verilmektedir.
ELimizdeki değer 10 bitlik Duty değeri olduğuna göre Soldan 2 adet biti alıp       

        CCP1CON.4=DUTY.0
        CCP1CON.5=DUTY.1
şeklinde ilgli yere vermiş oluruz. Sonra DUTY değerini 2 bit sola kaydırırsak elimizde 8 bitlik Lowbyte değeri kalacaktır dolayısıyla,
        CCPR1L=DUTY>>2  şeklinde eşitlersek ilk sinyalimiz çıkmış olacaktır.
Tabiiki bu sinyalin çıkabilmesi için CCP1CON=%00001100 şeklinde CCP1CON registerinin 2 ve 3 nolu bitlerini HIGH yapmak gerekiyor. Bunu programın başında yapabilirsiniz.
Yukarıdaki örnekde Duty değerini 2 bit sola kaydırarak gerçek Duty değerini değiştirmiş oluruz. Bu nedenle Duty değerini sisteme verirken başka bir değişkene eşitleyip onunla bu işleri yapmakta yarar vardır.
       
        X=DUTY
        CCP1CON.4=X.0
        CCP1CON.5=X.1
        CCPR1L=X>>2             
şeklinde.
Verdiğim açıklama genel anlamda bu işin nasılyapılacağını gösteriyor.Kullandığınız programlama diline göre gereken düzenlemeleri kendiniz yapmalısınız.

Kolay Gelsin.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

mehmet

Alıntı yapılan: Kahraman34 - 13 Ocak 2016, 11:29:10
Pwm çıkışı beyzi sürüyor, duty değerine 1 verdiğimde 5 volt 2 verdiğimde 10 volt 3 verdiğimde 20 volt..

Yani voltajım katlanarak büyüyüp gidiveriyor.duty değeri 5 olunca zaten çıkış full oluyor. Ben bu voltajı 0.1 volt hassasiyetle yükseltmek istiyorum.bunu yapamıyorum.

Gerilimi nereden okuyorsunuz? Lamba uçları mı?
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Kahraman34

evet lamba ucundaki gerilim lazım. Ordan okuyorum.

Kabil ATICI

hadi bir de dijital voltmetreyle okuduğunu söyle de olsun. (Öyle ise okudun değerin hatalı olduğunu belirtebiliriz. Dijital voltmetrelerin çalışma yapısından dolayı...)

Yükün kollektörde olması iyi olur. Bu şekilde düşük gerilimlerde sürme sorun olabilir. Ama dikkatli olman gerekir, hata yaparsan lamba doğrudan çöp... (tabii lambanın dayanma sınırına dikkete olmak gerekir)

Yukarıda verilen şemada transistörün iletime geçebilmesi için Vbe + yük üzerindeki gerilim düşümü kadar bir gerilim gerekir
ambar7

mehmet

#9
Alıntı yapılan: Kahraman34 - 13 Ocak 2016, 16:50:39
evet lamba ucundaki gerilim lazım. Ordan okuyorum.
Orada DC bir gerilim yok maalesef, kare dalga bulunmakta.
Bu nedenle istediğiniz gerilimi göremiyorsunuz. Basit bir
Low Pass filtre ile istediğinizi elde etmeniz mümkün...

http://hyperphysics.phy-astr.gsu.edu/hbase/electric/filcap2.html
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Kahraman34

#10
Şema olmadığı için yukarıdaki şemayı durumu ifade amaçlı çizmiştim.
Çıkış filtreli ve digital ölçü aleti ve kendi adc ölçümümle ölçüyorum.

Sorunumun ne olduğunu bende anlamadım galiba, şimdi Ete hocanın yazdıklarına da baktım. Ben ccp1l değerini direkt olarak

ccpr1l=1....2...3...
şeklinde yazıyorum. diğer üst bitlerim sabit "0".. zaten bu değeri 17 nin üstüne çıkaramıyorum 17 de tam çıkış veriyor..
bu bir hata mı acaba böyle yazılmazmı bu register ?

Not: CCP1CON.4=DUTY.0
       CCP1CON.5=DUTY.1
      CCPR1L=DUTY>>2
şeklinde yaptım sonuç aynı..


2. Not İsis de simüle ettim çok güzel çalışıyor .. Reelde sorun devam ediyor devreyi inceliyorum..

Kahraman34

Yardımlarınız için teşekkür ediyorum..
Devreden filtreleri çıkardığımda aslında voltajın çok güzel hassas değiştiğini görebiliyorum.
Sorunun filtrelerden kaynaklandığını düşünüyorum.
Filtreleri devreye aldığımda duty değeri 1 den 2 ye geçtiğinde bile baya farkılı voltaj fırlaması oluyor. Voltaj 10 ar 10 ar yukseliyor.

Örnek bir şema daha koydum yapmaya çalıştığım olayın aynısı gibi. Trafonun primer ucundaki voltajın katlayarak yükselmesi ana sorunum..

Burda sanırım düzgün bir filtre yapmam lazım. Bu işi bana öğretecek kaynak nereden bulurum, nette baya aradım ama ingilizcemi ve matematiğimi zorlayacak moddalar.

Mehmet Üstadım verdiğiniz linkteki filtreleri de inceledim ama oradan sonuca ulaşamadım bir türlü..




tunayk

#12
Anlaşılan sizin filtre transistörün beyzi ile picin pwm çıkışı arasında.  Bu durumda sıkıntının kaynağı frekansın bu filtre için çok yüksek olmasıdır. Frekansı veya kondansatörün kapasitesini düşürün

mehmet

Inverter mi yapıyorsunuz?
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Kahraman34

#14

Sayın Mehmet, 0 300 dc giriş, 0 -150 ac çıkış. Yapıcam, evet inverter.

Sayın Tunayk, frekansı değiştirdiğimde istediğim voltajı alıyorum. hem duty hem frekans oyunu netice veriyor amacım sadece duty ile bu işi yapabilmek.