877 için PWM Kütüphanesi Buyrun (HI-TECH PIC C)

Başlatan muuzoo, 08 Eylül 2007, 01:11:31

muuzoo

Bu akşam ekleme olarak bitirme ödevimde kullanmak üzere yazdığım PWM kütüphanesini ekliyorum.PWM kütüphanesinde gerekli değerleri kullanmak üzere yazdığım ufak bir bilgisayar programınıda ekte sunuyorum. Program Dev Cpp ile yazılmıştır.Hepsini en sondaki linkten indirebilirsiniz.

NOT: Kodlar denenmiş olmakla beraber hata olmayacağı anlamına gelmez. PWM deger hesaplama programı küsüratlı pwm degerleri için 0.5 ve üstü küsüratları yukarı 0.5 altını ise aşağı yuvarlayarak deger üretmektedir.Programda hatalar olabilir.Hatalar için lütfen benle iletişime geçin.

NOT: PIE1 satırları iptal edilmiştir.

PWM.C

/*			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;
}



PWM Hesaplayıcı

//PWM Deger Hesaplayıcı v0.05. Yapım Tarihi 05.09.2007
//Mehmet Muzaffer KOSTEN       muuzoo@hotmail.com
     

#include <cstdlib>
#include <iostream>
#include <math.h>

using namespace std;
void binary(int);

int main ()
{
   int secim,i=0;
       for(i=1;i>0;i--)
               secim=1;        
   while(secim!=0){
    cout << "PIC 16F877(A) PWM DEGER HESAPLAYICI" <<endl<<
    "------------2007  v0.05------------"<<endl;
    
    double tmr2=0,pic_frekans=0,pwm_frekans=0,PR2=0,pwm_deger=0,
    pic_periyot=0,pwm_periyot=0,duty_cycle=0,pwm_duty_cycle=0,pwm_cozunurluk=0;
    char tmr2_secim,hexstring[20];
    
    cout << "1-)Pic Calisma Frekansini Girin (MHZ) = ";
    cin >> pic_frekans;
           pic_frekans=1000000*pic_frekans;           
           pic_periyot=(1/pic_frekans);
           
    cout << "2-)Istenen PWM Frekansini Girin  (HZ) = ";
    cin >> pwm_frekans;
           pwm_periyot=(1/pwm_frekans);
           
    cout << "3-)TMR2 Prescaler Degerini seciniz: "<< endl
         <<"         a) 1"<<endl
         <<"         b) 4"<<endl
         <<"         c) 16"<<endl
         <<"Secim (a,b,c) = ";
    cin >> tmr2_secim;
    switch (tmr2_secim)
    {    
           case 'a' : tmr2=1;
                      break;
           case 'b' : tmr2=4;
                      break;
           case 'c' : tmr2=16;
                      break;
           }
    cout << "4-)Dalga Doluluk Orani'ni (Duty Cycle) Giriniz(%) = ";
    cin >> duty_cycle;
    cout <<endl;
    
    pwm_duty_cycle=((duty_cycle*pwm_periyot)/100);    
    
    PR2=(pwm_periyot/(pic_periyot*4*tmr2))-1;
    
    if(duty_cycle!=100)
                       pwm_deger=(pwm_duty_cycle/(pic_periyot*tmr2));
    
    pwm_cozunurluk=(log(pic_frekans/pwm_frekans)/log(2));
    
    if(pwm_cozunurluk>(int)pwm_cozunurluk)
                     pwm_cozunurluk=(int)pwm_cozunurluk+1;
                     
    if(pwm_deger>=((int)pwm_deger+0.5))                 
                     pwm_deger=(int)pwm_deger+1;
    else
                     pwm_deger=(int)pwm_deger;                 
                     
    if(duty_cycle==100)
                      pwm_deger=pow(2,pwm_cozunurluk)-1;
                      
    itoa((int)pwm_deger,hexstring,16);
    
    if(PR2<256 && PR2>=0){
               cout<<"Verdiginiz bilgilere gore olusan sonuclar: "<<endl
               <<"               a)TMR2 Prescaler= "<<tmr2<<endl
               <<"               b)PR2  Degeri   = "<<PR2<<endl
               <<"               c)PWM Degeri(Dec)= "<<pwm_deger<<endl
               <<"               c)PWM Degeri(Hex)= "<<hexstring<<endl
               <<"               c)PWM Degeri(Bin)= ";binary((int)pwm_deger);
               cout<<endl
               <<"               d)Azami PWM Cozunurluk (Bit)= "<<pwm_cozunurluk
               <<endl<<endl<<"Programdan Cikmak icin sifir (0)"<<endl
               <<"Yeni bir hesaplama icin bir (1) giriniz."<<endl
               <<"Seciminiz  = ";
               cin >> secim;
               } 
    else {
         cout<<"Verilen degerlere gore PWM uretilemez!"
          <<endl<<endl<<"Programdan Cikmak icin sifir (0)"<<endl
               <<"Yeni bir hesaplama icin bir (1) giriniz."<<endl
               <<"Seciminiz  = ";
               cin >> secim;
               }              
    
}       
        return 0;

}

void binary(int number) {
	int remainder=0;

	if(number <= 1) {
		cout << number;
		return;
	}

	remainder = number%2;
	binary(number >> 1);    
	cout << remainder;
}


pwm.c ve pwm hesaplayıcı programını indirmek için

http://rapidshare.com/files/54100735/pwm_kutuphane.rar
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

hacimusatr

Muuzoo hocam 2007 de paylaşmış olduğunda pi ile uğraşan kimse yoktu şimdi lise öğrencileri bile pic yazıyor. Sana zahmet bu paylaşımı tekrar yapar mısın? pwmin mantığını çözmeye çalışıyorum. Anlayamadım bir türlü. Kütüphane dosyasını inceleyince büyük ihtimalle çok büyük bir kısmını çözmüş olacağım. Bide pwm hesaplayıcı çok işime yarayabilir. Şimdiden ellerin dert görmesin.

muuzoo

Merhaba,

Kodlar zaten mesajda açık olarak verilmiş durumda. Kopyalayıp çalıştırabilirsiniz fakat HI-TECH C artık desteklenmeyen bir program.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

Mr.Java

Konuyla alakası olmayacak ama güzel duygu olması gerek,2007'den 2013'e...