Pwm i tam olarak nasıl sıfırlarım ?

Başlatan samedkutuk, 23 Ocak 2020, 23:05:01

samedkutuk

Merhabalar
Frekansı sabit Pwm i tuşlar yoluyla menüden ayarlanabilir bir devre yapmaktayım.
Pwm ayarlandıktan sonra eğer kapat tuşuna basılır ise
set_pwm2_duty(0);
yaparak pwm i sıfırlıyorum fakat tam sıfırlanmıyor parazit gibi duty si çok düşük bir pwm kalıyor.
Bunu hem proteusda hemde gerçek devrede led ile denedim aldığım sonuç aynı düşük duty li bir pwm malesef kapanmıyor
Not: Bu olay sadece %30,%50,%70,%90 dutylerde oluyor.Diğer duty ler de sağlıklı şekilde pwm sıfırlanıyor.
Kod Şu şekilde;
#include <main.h>
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

#define OK      PIN_A0
#define ARTTIR  PIN_A1
#define AZALT   PIN_A2
#define STOP    PIN_A3
#define deger    PIN_B0

#include <lcd.c>
int Kontrol=0;
int Mod=0;
int cikar_2=0,cikar_3=0,cikar_4=0,cikar_5=0,cikar_6=0,cikar_7=0,cikar_8=0,cikar_9=0,cikar_10=0;
void ayar(){
lcd_putc("\f");
Mod=read_eeprom(0);
while(True){
lcd_gotoxy(2,1);
printf(lcd_putc,"***Mod Seciniz***\nMod=%d",Mod);

 if(input(ARTTIR)==1){while(input(ARTTIR)==1);delay_ms(50);
Mod=Mod+1;
if(mod>=10){mod=10;}
lcd_gotoxy(2,1);
printf(lcd_putc,"\f***Mod Seciniz***\nMod=%d",Mod);}

 if(input(AZALT)==1){while(input(AZALT)==1);delay_ms(50);
 Mod=Mod-1;
 if(mod<=0){mod=10;}
 lcd_gotoxy(1,2);
 printf(lcd_putc,"\f***Mod Seciniz***\nMod=%d",Mod);}
 
 if(input(OK)==1){while(input(OK)==1);delay_ms(50);
 printf(lcd_putc,"\f Secilen Mod= %d",Mod);
 delay_ms(1000);
 lcd_putc("\f");
 write_eeprom(0,mod);
 break;}
}
}

void main()
{
   lcd_init();  
setup_spi (FALSE);
enable_interrupts (global);

      setup_timer_2(T2_DIV_BY_4, 124, 1);
      setup_ccp1(CCP_PWM);
      set_pwm1_duty(0);
      setup_ccp2(CCP_PWM);
      set_pwm2_duty(0);
      Kontrol=1;
      output_a(0xff);
      output_b(0x00);

   while(TRUE)
   {    
        lcd_gotoxy(3,1);
        lcd_putc("HOSGELDINIZ");
      if(input(OK)==1){delay_ms(500);while(input(OK)==1);ayar();Mod=read_eeprom(0);}
      
     
     if(input(STOP)==1){delay_ms(200);while(input(STOP)==1);delay_ms(50);
     Mod=read_eeprom(0);
     Kontrol=kontrol+1;if(Kontrol>1){Kontrol=0;}
     cikar_10=0;cikar_9=0;cikar_8=0;cikar_7=0;;cikar_6=0;cikar_5=0;cikar_4=0;cikar_3=0;cikar_2=0;}
     
    switch (Kontrol) {

    case 0: 
      if(mod==1){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
      set_pwm1_duty((long)50);set_pwm2_duty((long)50);
      lcd_gotoxy(3,2);lcd_putc("SMOD 10 AKTIF");}
      
      if(mod==2){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
         if(cikar_2==0){
         set_pwm1_duty((long)25);set_pwm2_duty((long)25);
         delay_ms(2200);
         set_pwm1_duty((long)50);set_pwm2_duty((long)50);
         delay_ms(200);
         set_pwm1_duty((long)75);set_pwm2_duty((long)75);
         delay_ms(200);
         cikar_2=1;
         }
      set_pwm1_duty((long)100);set_pwm2_duty((long)100);
      lcd_gotoxy(3,2);lcd_putc("SMOD 20 AKTIF");}
      
      
      if(mod==3){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
      
         if(cikar_3==0){
         set_pwm1_duty((long)25);set_pwm2_duty((long)25);
         delay_ms(200);
         set_pwm1_duty((long)50);set_pwm2_duty((long)50);
         delay_ms(200);
         set_pwm1_duty((long)100);set_pwm2_duty((long)100);
         delay_ms(200);
         cikar_3=1;
         }         
      set_pwm1_duty((long)150);set_pwm2_duty((long)150);
      lcd_gotoxy(2,2);lcd_putc("SMOD 30 AKTIF");}
      
      if(mod==4){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
      if(cikar_4==0){//bu döngüye bir defa gir
      set_pwm1_duty((long)50);set_pwm2_duty((long)50);
      delay_ms(200);
      set_pwm1_duty((long)100);set_pwm2_duty((long)100);
      delay_ms(200);
      set_pwm1_duty((long)150);set_pwm2_duty((long)150);
      delay_ms(200);
      cikar_4=1;}
      set_pwm1_duty((long)200);set_pwm2_duty((long)200);
      lcd_gotoxy(2,2);lcd_putc("MOD 40 AKTIF");}

      
      if(mod==5){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);          
      if(cikar_5==0){//bu döngüye bir defa gir
      set_pwm1_duty((long)50);set_pwm2_duty((long)50);
      delay_ms(200);
      set_pwm1_duty((long)100);set_pwm2_duty((long)100);
      delay_ms(200);
      set_pwm1_duty((long)150);set_pwm2_duty((long)150);
      delay_ms(200);
      set_pwm1_duty((long)200);set_pwm2_duty((long)200);
      delay_ms(200);
      cikar_5=1;}
      set_pwm1_duty((long)250);set_pwm2_duty((long)250);
      lcd_gotoxy(2,2);lcd_putc("SMOD 50 AKTIF");}
      
      if(mod==6){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM); 
        if(cikar_6==0){//bu döngüye bir defa gir
      set_pwm1_duty((long)50);set_pwm2_duty((long)50);
      delay_ms(200);
      set_pwm1_duty((long)100);set_pwm2_duty((long)100);
      delay_ms(200);
      set_pwm1_duty((long)150);set_pwm2_duty((long)150);
      delay_ms(200);
      set_pwm1_duty((long)200);set_pwm2_duty((long)200);
      delay_ms(200);
      set_pwm1_duty((long)250);set_pwm2_duty((long)250);
      delay_ms(200);
      cikar_6=1;}  
      set_pwm1_duty((long)300);set_pwm2_duty((long)300);
      lcd_gotoxy(2,2);lcd_putc("SMOD 60 AKTIF");}
      
      
      if(mod==7){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
      if(cikar_7==0){//bu döngüye bir defa gir
      set_pwm1_duty((long)50);set_pwm2_duty((long)50);
      delay_ms(200);
      set_pwm1_duty((long)100);set_pwm2_duty((long)100);
      delay_ms(200);
      set_pwm1_duty((long)150);set_pwm2_duty((long)150);
      delay_ms(200);
      set_pwm1_duty((long)200);set_pwm2_duty((long)200);
      delay_ms(200);
      set_pwm1_duty((long)250);set_pwm2_duty((long)250);
      delay_ms(200);
      set_pwm1_duty((long)300);set_pwm2_duty((long)300);
      delay_ms(200);
      cikar_7=1;} 
      set_pwm1_duty((long)350);set_pwm2_duty((long)350);
      lcd_gotoxy(2,2);lcd_putc("SMOD 70 AKTIF");}
      
      if(mod==8){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
      if(cikar_8==0){//bu döngüye bir defa gir
      set_pwm1_duty((long)50);set_pwm2_duty((long)50);
      delay_ms(200);
      set_pwm1_duty((long)100);set_pwm2_duty((long)100);
      delay_ms(200);
      set_pwm1_duty((long)150);set_pwm2_duty((long)150);
      delay_ms(200);
      set_pwm1_duty((long)200);set_pwm2_duty((long)200);
      delay_ms(200);
      set_pwm1_duty((long)250);set_pwm2_duty((long)250);
      delay_ms(200);
      set_pwm1_duty((long)300);set_pwm2_duty((long)300);
      delay_ms(200);
      set_pwm1_duty((long)350);set_pwm2_duty((long)350);
      delay_ms(200);
      cikar_8=1;} 
      set_pwm1_duty((long)400);set_pwm2_duty((long)400)
      ;lcd_gotoxy(2,2);lcd_putc("SMOD 80 AKTIF");}
      
      if(mod==9){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
      if(cikar_9==0){//bu döngüye bir defa gir
      set_pwm1_duty((long)50);set_pwm2_duty((long)50);
      delay_ms(200);
      set_pwm1_duty((long)100);set_pwm2_duty((long)100);
      delay_ms(200);
      set_pwm1_duty((long)150);set_pwm2_duty((long)150);
      delay_ms(200);
      set_pwm1_duty((long)200);set_pwm2_duty((long)200);
      delay_ms(200);
      set_pwm1_duty((long)250);set_pwm2_duty((long)250);
      delay_ms(200);
      set_pwm1_duty((long)300);set_pwm2_duty((long)300);
      delay_ms(200);
      set_pwm1_duty((long)350);set_pwm2_duty((long)350);
      delay_ms(200);
      set_pwm1_duty((long)400);set_pwm2_duty((long)400);
      delay_ms(200);
      cikar_9=1;} 
      set_pwm1_duty((long)450);set_pwm2_duty((long)450);
      lcd_gotoxy(2,2);lcd_putc("SMOD 90 AKTIF");}
      
      if(mod==10){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
      if(cikar_10==0){//bu döngüye bir defa gir
      set_pwm1_duty((long)50);set_pwm2_duty((long)50);
      delay_ms(200);
      set_pwm1_duty((long)100);set_pwm2_duty((long)100);
      delay_ms(200);
      set_pwm1_duty((long)150);set_pwm2_duty((long)150);
      delay_ms(200);
      set_pwm1_duty((long)200);set_pwm2_duty((long)200);
      delay_ms(200);
      set_pwm1_duty((long)250);set_pwm2_duty((long)250);
      delay_ms(200);
      set_pwm1_duty((long)300);set_pwm2_duty((long)300);
      delay_ms(200);
      set_pwm1_duty((long)350);set_pwm2_duty((long)350);
      delay_ms(200);
      set_pwm1_duty((long)400);set_pwm2_duty((long)400);
      delay_ms(200);
      set_pwm1_duty((long)450);set_pwm2_duty((long)450);
      delay_ms(200);
      cikar_10=1;} 
      
      set_pwm1_duty((long)500);set_pwm2_duty((long)500);
      lcd_gotoxy(2,2);lcd_putc("SMOD 100 AKTIF");}

           break;

    case 1:
       set_pwm2_duty(0);
      set_pwm1_duty(0);
      
      //setup_ccp1(CCP_OFF);setup_ccp2(CCP_OFF);
      lcd_gotoxy(2,2);lcd_putc("SISTEM KAPALI ");

           break;
           

    default:
     // set_pwm1_duty(0);set_pwm2_duty(0); 
    // setup_ccp1(CCP_OFF);setup_ccp2(CCP_OFF);
      lcd_gotoxy(2,2);lcd_putc("DEFAULT");

            break; }


      //TODO: User Code
   }

}


Sıfırlanmayan sinyal;


samedkutuk

pwr_24

pwm çıkış portlarını sıfırla sorunun kökten çözülür o zaman.

SpeedyX

Duty sıfır değerine özel bir macro ile pini output yapıp sıfıra çek, CCP yi kapat

samedkutuk

Alıntı yapılan: pwr_24 - 23 Ocak 2020, 23:51:27pwm çıkış portlarını sıfırla sorunun kökten çözülür o zaman.
onu denedim fakat çözülmedi hocam
samedkutuk

samedkutuk

Alıntı yapılan: SpeedyX - 23 Ocak 2020, 23:53:31Duty sıfır değerine özel bir macro ile pini output yapıp sıfıra çek, CCP yi kapat
önce öyle yapıyordum
başlat dediğimde ccp modülünü pwm modunda açıp
setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
kapat dediğimde kapatıyordum
setup_ccp1(CCP_OFF);setup_ccp2(CCP_OFF);
Bu durumda da aynı sorun şu şekilde oluyor ccp1 bir bazen kapanıyor bazen de kapanmıyor
samedkutuk

samedkutuk

Dikkatimi çeken şu oldu 50,150,250,350 şekkinde duty verdiğim fonksiyonlar tam kapanmamış
bu değerleri 60,160,260... a çevirdim sorun çözldü
birde 256 dan büyük olmayan duty değerlerinin de önüne (long) yazmıştım onlarısildim sorun şuan tamamen çözüldü ama ne gariptir ki bir mantık bulamadım soruna :-)
samedkutuk

OG

10bit pwm'in 2 bit'lik LSB değeri 0 olmamış olabilir,
işlemcinin ne olduğunu göremedim ama bilindik seriiler için genelde bu bitler CCPxCON bit 4 ve 5.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

samedkutuk

Alıntı yapılan: OG - 24 Ocak 2020, 07:51:2310bit pwm'in 2 bit'lik LSB değeri 0 olmamış olabilir,
işlemcinin ne olduğunu göremedim ama bilindik seriiler için genelde bu bitler CCPxCON bit 4 ve 5.
16f877a kullaıyorum hocam
biraz açar mısınız?
samedkutuk

sinus

timer stop/run biti yok mu?

samedkutuk

Alıntı yapılan: sinus - 24 Ocak 2020, 12:51:05timer stop/run biti yok mu?
Timer 2 yi enable disable yapan fonksiyonşlar var direk timer i mi kapatmamı öneriyorsunuz
samedkutuk

OG

Alıntı yapılan: samedkutuk - 24 Ocak 2020, 12:13:4416f877a kullaıyorum hocam
biraz açar mısınız?
hangi pwm modulunu kullanıyorsanız (CCP1CON / CCP2CON) o modulun 4. ve 5. bitleri 0 olmalı,
bunlar 10 bit pwm'in en küçük 2 bit'i dir. Bu bitler 1 olmama

bu modulun pwm olarak çalışabilmesi için de
bit 3-0 : 11xx = PWM mode
olmalı
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

samedkutuk

Alıntı yapılan: OG - 24 Ocak 2020, 20:02:14hangi pwm modulunu kullanıyorsanız (CCP1CON / CCP2CON) o modulun 4. ve 5. bitleri 0 olmalı,
bunlar 10 bit pwm'in en küçük 2 bit'i dir. Bu bitler 1 olmama

bu modulun pwm olarak çalışabilmesi için de
bit 3-0 : 11xx = PWM mode
olmalı
HEM ccp1 hem de ccp2 modülünü kullanıyorum fakat anlamadım
ccp1 modülünün bitlerini nerden inceleyeceğim bu konuyu açar mısınız biraz
ben ccs c kullanıyorum dediğiniz kontrol için ccs  nin içine asm mi gömmem gerekiyor?
samedkutuk

HAKKITANIR

#12
"ccp1 modülünün bitlerini nerden inceleyeceğim bu konuyu açar mısınız biraz"

kullanım klavuzunda ccpX modül kontrol registerinde bitler vardır.
bu registerler işlemciniz 8 bit olduğundan, tek bir 8 bitlik düzende veya yeterli gelmediyse birden fazla 8 bitlik düzende verilebilir.
orada her bir bitin ne iş yaptığı gibi şeyler yazılıdır.
genelde ilk en büyük bit ccpX modülü açıp kapatan bitdir.
diğer bitlerden pwm çalışma yöntemi ve timer seçimi gibi vesaire ayarlar yapılır.
yanlış değilsem bunlara bir bakın denmek istendi galiba.

şimdi siz 2 adet birbirinden bağımsız ccp1 ve ccp2 modülü kullanıyor ve bunları tek bir timer ilemi konfigüre ederek kullanıyorsunuz?
böyle ise pwm sinyal tetikleme topolojiniz ne oluyor sorabilir miyim?
mesela pussh-pull tarzı bir topoloji uyguluyor iseniz,
ccpX lerle bu işlemcide bu çalışma destekleniyor mu?
yada desteklenmiyorsa yazılımla yapmak için uygun bir yazılım yazılı olarak var mı?
timerin kesmeli bir yapısı kullanılması gerekiyor olabilir belki.

bu derleyici ve işlemciyi bilmemekle birlikte üst serilerinde farklı C derleyicisini kullanmışlığım var.
bunlarda ccp sizdeki gibi birleşik değilde, IC ve OC modül olarak ayrı ayrı veriliyor.

ne yapılmak istendiğini ben tam anlayamadım.

samedkutuk

Dediğiniz bitleri inceleyeceğim hocam teşekkür ederim.
Yazdığım kod u en başta atmıştım.
Benim sorunum şuydu ccsc de Pwm modüülü kapatmak için belli bir fonksiyon var fakat Pwm değerim 8 bitin üzerine çıktığında pwm i tekrar kapatınca ccp modülünde düşük duty li bir pwm kalmaya devam ediyor
Alıntı yapılan: HAKKITANIR - 25 Ocak 2020, 13:44:03"ccp1 modülünün bitlerini nerden inceleyeceğim bu konuyu açar mısınız biraz"

kullanım klavuzunda ccpX modül kontrol registerinde bitler vardır.
bu registerler işlemciniz 8 bit olduğundan, tek bir 8 bitlik düzende veya yeterli gelmediyse birden fazla 8 bitlik düzende verilebilir.
orada her bir bitin ne iş yaptığı gibi şeyler yazılıdır.
genelde ilk en büyük bit ccpX modülü açıp kapatan bitdir.
diğer bitlerden pwm çalışma yöntemi ve timer seçimi gibi vesaire ayarlar yapılır.
yanlış değilsem bunlara bir bakın denmek istendi galiba.

şimdi siz 2 adet birbirinden bağımsız ccp1 ve ccp2 modülü kullanıyor ve bunları tek bir timer ilemi konfigüre ederek kullanıyorsunuz?
böyle ise pwm sinyal tetikleme topolojiniz ne oluyor sorabilir miyim?
mesela pussh-pull tarzı bir topoloji uyguluyor iseniz,
ccpX lerle bu işlemcide bu çalışma destekleniyor mu?
yada desteklenmiyorsa yazılımla yapmak için uygun bir yazılım yazılı olarak var mı?
timerin kesmeli bir yapısı kullanılması gerekiyor olabilir belki.

bu derleyici ve işlemciyi bilmemekle birlikte üst serilerinde farklı C derleyicisini kullanmışlığım var.
bunlarda ccp sizdeki gibi birleşik değilde, IC ve OC modül olarak ayrı ayrı veriliyor.

ne yapılmak istendiğini ben tam anlayamadım.
samedkutuk

HAKKITANIR

"Benim sorunum şuydu ccsc de Pwm modüülü kapatmak için belli bir fonksiyon var fakat Pwm değerim 8 bitin üzerine çıktığında pwm i tekrar kapatınca ccp modülünde düşük duty li bir pwm kalmaya devam ediyor"

bu fonksiyon içinde sanıyorum, ccp modülün kontrol registerindeki ilgili biti 0 yaparak kapatıyor olmalı.
siz ccp modülü açıp kapatan kontrol registerindeki ilgili bitin, kapatma pozisyonuna alındığından eminseniz ve bu durumdada ccp modül çıkışı sürekli 0V. ye çekilmiyorsa yani pwm kesilmediyse, donanımsal sorun olması muhtemel gibi geldi bana. tabi burada ccp kontrol çıkış donanımsal pinini, farklı bir amaç için, normal port işlemleri vesaire diğer işler için kullanmadığımızı düşünüyoruz. sadece ccp işlevi için ilgili pin kullanılırsa durum böyle olmalı diyebilirim.
bahsettiğiniz fonksiyon içerisindeki kodları açıkça gösteriyor mu? derleyiciniz.