PİC 16f628a'da PWM sıfırlama sorunu

Başlatan balhan146, 30 Mart 2012, 18:21:41

balhan146

Arkadaşlar hepinize iyi günler.Yapmış olduğum proje pic 16f628a'den aldığım PWM sinyali ile mosfet sürme ve mosfetle dc motor hız kontrolü yapma.Bu devreyi yaptım sorunsuz çalışıyor board üzerine kurdum ve denedim.Benim burdaki sorunum ise 16f628a'da ADC olmadığı için bende 2 tane butonla PWM değerini artırıp azalttım  hiç sorunsuz çalıştı.Bu devreye birtane daha buton ekleyip bu butonlada PWM değerini bi türlü sıfırlayamadım,bu konudan anlayan varsa lütfe yardım edermisiniz?

ibrsel

#1
Ortada devren ve programın olsaydı onun üzerinden tartışabilirdik..Ama sen zaten işin büyük kısmını halletmişsin.Söylediğine göre 1. butonla PWM değerini arttırabiliyor,2. butonla azaltabiliyorsun. O zaman aşağıdaki komut satırınıda programına uyarla ve PWM ini sıfırla.

Alıntı Yap
If buton1=1 Then
    pwm_degeri=pwm_degeri+1
EndIf

If buton2=1 Then
    pwm_degeri=pwm_degeri-1
EndIf

If buton3=1 Then
    pwm_degeri=0
EndIf

  HPWM 1,pwm_degeri,1000

elektroacemi

#2
PBP da:  HPWM 1,ORAN,FREKANS   komutunda ORAN=1 olunca en düşük darbe oranı oluyor.... Ama "0" olunca pwm de değişiklik olmuyor. Biraz önce denedim... Pwm mi kapatma tuşana bastığın zaman pwm çıkışını normal giriş çıkış pineni dönüştürüp çıkışı Lojik 0 yapsan olmaz mı ?

Not: CCS C de bilmiyorum ama PBP da denediğimi söyledim belki fikir verir ...

balhan146

Çok teşekkür ederim ben proğramı yazayım bide yazılımın üzerinde konuşalım;


#include <16f628a.h>
#fuses IntRC,NOLVP,NOMCLR,NOWDT
#use delay(clock=4M)
#define pwm_e pin_A2
#define pwm_a pin_A3
#byte PORTA=0X05
#byte PORTB=0X06

//#int_ext

//balhan(){ setup_timer_2(T2_DIV_BY_16, 255, 1);
//set_pwm1_duty(0);



//setup_timer_2(T2_DIV_BY_16, 124, 1);
//set_pwm1_duty(0);   
   
   

void main ()
{



int value;
value = 50;
set_tris_a(12);
set_tris_b(00000001);
output_high(pin_a1);
output_low(pin_a0);
delay_ms(100);
output_low(pin_a1);
output_high(pin_a0);
delay_ms(100);
output_b(0);
output_a(0);



setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_16,255, 1); //setup_timer_2(T2_DIV_BY_16, 124, 1);
set_pwm1_duty(value);

While (true)
{
//pwm artır bloğu
if(input(pwm_a)==0)
{
value=value+5;
delay_ms(200);
output_high(pin_a0);
output_low(pin_a1);
set_pwm1_duty(value);
}
// pwm eksilt bloğu
if(input(pwm_e)==0)
{
value=value-5;
delay_ms(200);
output_high(pin_a1);
output_low(pin_a0);
set_pwm1_duty(value);
}
//output_low(pin_a1);
//output_low(pin_a0);
}

if (input(pin_B0==0)){
value=0;
set_pwm1_duty(value);     }               

//enable_interrupts(GLOBAL);
//enable_interrupts(int_ext);
//ext_int_edge(H_TO_L);

}

balhan146

Benim burdaki bir diğer sorumda,proğramın sonunda gördüğünüz gibi ben bu "value" değerini RB0 interrupt'ı kullanarak yapayım diye uğraştım biraz ama olmadı.Bende if'li bi döngü içinde yaptım ama yine olmadı burda sorun nerde acaba?

GreeN

Terörü Lanetliyoruz.

balhan146

Evet eminim hemde çok eminim.İstersen datasheet'ini göndereyim bide sen bak.

GreeN

Haklısın yokmuş , analog comparator vardı sanırım sadece.
Terörü Lanetliyoruz.

GreeN

Peki sorun , görev  periyodunu sıfır yaptığında pwm'in durmamasımı  ?


Terörü Lanetliyoruz.

balhan146

Evet sorun aynen öyle.Pwm değerini sıfıra çekemedim bi türlü bu proğramda bi sorun varmı sizce?

GreeN

if (input(pin_B0==0)){          
value=0;
set_pwm1_duty(value);     }     
   

aşağıdaki gibi düzelt gözünden kaçmış olabilir.

if (input(pin_B0)==0){          
value=0;
set_pwm1_duty(value);     }     
   
Terörü Lanetliyoruz.

balhan146

Yokya olmadı,olmuyo bi türlü.Bilmiyorum ne yapacağım.

Klein

CCS'te işlernasıl yürür pek bilmiyorum. Hatta PIC denetleyicileri de pek tanımıyorum.  Geçtiğimiz günlerde Üzerinde PIC olan bir devreye program yazmam gerekti. PIC16F684

PWM'i kapatmak için Timer'i ve CCP modülünü kapatmam gerekti.

T2CON=0;
CCP1CON=0;
CCPR1L = 0;

şeklinde yaptım. belki işini görür.

balhan146


justice_for_all

proteusdami deniyosun bunu ?yazilanlarin hepsinde olmasi gerek.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay