Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

12F675 ve software pwm

Başlatan tayyar, 08 Haziran 2009, 06:18:12

tayyar

Selamlar;

Bütün gece bir pwm olayıyla ugrastım hafiften uykulu bir vaziyette yazıyorum mesajı kusurum olursa affola.
Olayım 12F675  ile yazılımsal pwm olusturmak. Olay cokta karısık değil, sabit bir periyodumuz var, biz bu periyot içerisinde on ve off sürelerini ayarlıyoruz. buraya kadar hersey güzel.
  #include "main.h"

#define kirmizi pin_a1

#use fast_io(a)
float i=0;
float pwmon=5;
float pwmoff=0;
void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_comparator(NC_NC);
   setup_vref(FALSE);
   set_tris_a(0x38);
   output_a(0x00);
   while(true)
   {

   for(i=0;i<1500;i=i+1)//duty cycle on süresi artıyor
      {
      output_high(kirmizi);
      delay_us(pwmon);
      pwmoff=1500-pwmon;
      output_low(kirmizi);
      delay_us(pwmoff);
      pwmon=pwmon+1;

      }
      pwmon=1500;
      for(i=0;i<1500;i=i+1)//duty cycle on süresi azalıyor
      {
      output_low(kirmizi);
      delay_us(pwmon);
      pwmoff=1500-pwmon;
      output_high(kirmizi);
      delay_us(pwmoff);
      pwmon=pwmon-1;
      }
   }
}


ayrıca h dosyası
#include <12F675.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOCPD                    //No EE protection
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BANDGAP_HIGH          
#use delay(clock=4000000)



kod bu sekilde a1 pininden pwm elde etmek istiyorum. daha düzgün bir çalışma için timer kullanılabilir ancak simdilik test aşamasında oldugum için gerek duymadım farkettiyseniz main içerisinde başka fonksiyon yok.

program da 1.5ms lik periyot belirledim, ilk for döngüsünde bu periyotta on süresi arttırılıyor, ikinci  for döngüsünde de tam tersi yapılıyor ancak proteustaki osiloskopta saçma bir görüntü aldım. aşağıdaki gibi



elimdede 12f675 olmadıgı için deneyemedim. sizce pwm olsturdummu yoksa olusturamadımmı ?
--EGEMENLİK KAYITSIZ ŞARTSIZ MİLLETİNDİR--

arslan74

Merhaba,

senin örneğine benzer bir çalışma bende yapmıştım. Hatta bu forumda upload etmiştim. İçinde Proteus simulasyonuda var. simulasyonda PWM olayını cok net bir şekilde görebiliyorsunuz. Onu indirib içine kendi hex kodunu eklediğinde PWM olayını görmen gerek.

Forum Link:
http://picproje.org/index.php/topic,24343&highlight=675+pwm

Proje link:
http://rapidshare.com/files/212863510/Led_Dimmer_Ver1.0.rar

Selamlar

kadirbas

Selamlar tayyar hocam.

Öncelikle gözüme takılan, tüm değişkenleri "float" olarak tanımlamış fakat; tam sayılar şeklinde kullanıyor olmanız. Bu hataya yol açar mı, şu anda kesitremiyorum fakat yine de düzeltmenizde yarar var bence.

Bu arada ilk döngüde, "pwmon" değişkenini 5'ten başlatıp 1500 kere arttırıyorsunuz. Döngünün sonlarında "pwmoff=1500-pwmon;" ifadesinden "pwmoff" değişkeni negatif değer alacaktır. Bunun istemediğiniz bir durum yaratacağı kesin.

Bunun dışında, örneğin "pwmoff" değişkeninin değeri 0 olduğunda, pwm çıkışını 0 konumuna çekip 0us bekleyip sonra işleminize devam ediyorsunuz. Mantık olarak doğru gibi görünse de, işlemcinin kaybedeceği zamanları göz önünde bulundurarak, istenmeyen yerlerde hatalı durumlar oluşması mümkün gibi duruyor. Bunun yerine bu gibi durumları kontrol ederek, "eğer değer 0 değil ise (ya da belirli bir değerin üstünde ise) bu işlemleri yap" demeniz de münkün.

Kolay gelsin..


tayyar

Bu gözümden kaçmış hakikaten çok yararlı oldu sağolun :)
--EGEMENLİK KAYITSIZ ŞARTSIZ MİLLETİNDİR--