Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Yazılımsal PWM üretmek?

Başlatan rogue_cn, 28 Mart 2013, 13:24:52

rogue_cn

Arkadaşlar B0 ve B1 portlarında PWM üretmek istiyorum ve aşağıdaki gibi yazdım. Bu işi mi görür mü? Yani purda 20ms aralıklarla PWM üretiliyormu? (dahili osilatör kullandım 4 MHZ)
   while(1){
      output_B(0b00000001);
      delay_ms(20);
      output_B(0b00000010);
      delay_ms(20);
   }

Tagli

PWM aslında darbe genişliğinin istenildiği gibi değiştirilebilmesi anlamına gelir. Burada %50 iş zamanına sahip 40 ms periyodu olan (25 Hz) bir kare dalga üretiliyor. Ayrıca, bu döngü sırasında PIC başka iş yapamaz (kesme blokları içindeki işler hariç tabi).

Yazılımsal PWM genelde kesme mekanizması ile üretilerek, PIC'in başka işler de yapabilmesine olanak tanınır. Ayrıca, darbe genişliği de yazılım tarafından değiştirilebilir olmalıdır.
Gökçe Tağlıoğlu

Erol YILMAZ

yazılımsal pwm için timer0 kesmesini kullanabilirsin.
Bana düşük frekanslı bir pwm lazım old. için kullanmıştım...

#define LOOPCNT 256
unsigned int16 width; 


#INT_RTCC
void tick_interrupt(void) 
{ 
static int16 loop = LOOPCNT; 
static int16 pulse; 

if(--loop == 0) 
  { 
   loop = LOOPCNT; 
   pulse = width; 
  } 

if(pulse) 
  { 
   output_high(PWM_PIN); 
   pulse--; 
  } 
else 
  { 
   output_low(PWM_PIN); 
  } 
}

rogue_cn

#3
include <16f628a.h>     
#fuses INTRC_IO,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOCPD 
#use delay (clock=4000000) 
#use fast_io(b) 
#
#int_RB             
void  b_kesmesi()   
{
if(input(pin_b4)) 
{
while(input(pin_b4));
}
i=(i-5);
}
if(input(pin_b5)) 
{
while(input(pin_b5));
i=(i+5);
}
}
void main ( )
{
   set_tris_b(0XF0);  
   ext_int_edge(H_TO_L);   
   enable_interrupts(INT_RB); 
   enable_interrupts(GLOBAL); 
   while(1){
      output_B(0b00000001);
      delay_ms(i);
      output_B(0b00000010);
      delay_ms(i);
   } 
 }


Hocam program bu. Dışardan kesme ile pwm aralığınıda değiştirebiliyorum. Bunu kullanabilirim değil mi?