Pic ile 90kHZ Kare Dalga Oluşturma

ercanatnr

Üye
Katılım
19 Ara 2010
Mesajlar
290
Puanları
1
Merhabalar,
Bir proje için pic çıkışından 90kHZ kare dalga almam gerekiyor. Bunun yazılımsal veya donanımsal olarak yapıldığı araştırmalarım sonucunda öğrendim. Ancak nasıl bir kod yazmam gerektiğini bilmiyorum. Yardımlarınızı bekliyorum. Kullandığım pic 16F628A CCS C programında yazıyorum. TEŞEKKÜRLER.
 
burada kullanılan 16f628'in 9 nolu bacağından, b3 bacağından 90KHz alabilirsin. (PWM olarak...)
Kod:
#include <16F628A.h>
#fuses hs,nowdt,put,noprotect
#use delay(crystal=20000000)

void main()
{
   setup_timer_2(T2_DIV_BY_1,55,1);     

   setup_ccp1(CCP_PWM);
   set_pwm1_duty((int16)110);

   while(TRUE)
   {
     
   }

}
 
burada kullanılan 16f628'in 9 nolu bacağından, b3 bacağından 90KHz alabilirsin. (PWM olarak...)
Kod:
#include <16F628A.h>
#fuses hs,nowdt,put,noprotect
#use delay(crystal=20000000)

void main()
{
   setup_timer_2(T2_DIV_BY_1,55,1);   

   setup_ccp1(CCP_PWM);
   set_pwm1_duty((int16)110);

   while(TRUE)
   {
   
   }

}

Çok teşekkürler 90Khz alıyorum. Aklıma biryer takıldı
set(pwm1_duty(int16)110);
set_pwm1_duty(110);
sizin yazdığınız gibi değilde alttaki gibi (int16) eklemeden yazınca frekans 45Khz e düşüyor. (int16) ifadesi ne sağlıyor bu kodda. Birde sanırım dahili osilatör 20Mhz olmuyor doğru mudur.
 
Son düzenleme:
int16 lı olunca 10 bit üzerinden duty ayarlayabiliyorsun. int 16 olmayarak yazdığında duty % olarak oluyordu diye biliyorum... 16f628in içinde 20MHZ dahili yok ben harici olarak düşündüm...
aşağıdaki de dahili 4MHz kullanımında %50 duty olacak şekilde...
Kod:
#include <16F628A.h>
#FUSES PUT                     
#FUSES NOBROWNOUT              
#FUSES NOLVP                   
#fuses INTRC_IO
#use delay(clock=4000000)

void main()
{
   setup_timer_2(T2_DIV_BY_1,10,1);     

   setup_ccp1(CCP_PWM);
   set_pwm1_duty((int16)20);

   while(TRUE)
   {
     
   }

}
 
Son düzenleme:
int16 lı olunca 10 bit üzerinden duty ayarlayabiliyorsun. int 16 olmayarak yazdığında duty % olarak oluyordu diye biliyorum... 16f628in içinde 20MHZ dahili yok ben harici olarak düşündüm...
aşağıdaki de dahili 4MHz kullanımında %50 duty olacak şekilde...
Kod:
#include <16F628A.h>
#FUSES PUT                     
#FUSES NOBROWNOUT              
#FUSES NOLVP                   
#fuses INTRC_IO
#use delay(clock=4000000)

void main()
{
   setup_timer_2(T2_DIV_BY_1,10,1);     

   setup_ccp1(CCP_PWM);
   set_pwm1_duty((int16)20);

   while(TRUE)
   {
     
   }

}

Teşekkürler bunun hesabını nasıl yapıyoruz o değerler neye göre belirleniyor.
 
ben teşekkür ederim kolay gelsin...
 
Kod:
#include <16f628A.h>
#FUSES NOWDT
#FUSES NOMCLR
#FUSES NOBROWNOUT
#FUSES NOLVP
#use delay(internal=4000000)
#define arttir pin_a0
#define azalt pin_a1

#use fast_io(a)

int i=0;

void main()
{

if(input(arttir))
{
delay_ms(10);
while(input(arttir));
i++;
}

if(input(azalt))
{
delay_ms(10);
while(input(azalt));
i--;
}

if(i>5)  {i=5;}
if(i<=0) {i=0;}

set_tris_a(0x03);

switch(i)
{
case 1://10 kHZ
setup_timer_2(T2_DIV_BY_1,99,1);
set_pwm1_duty((int16)200);
setup_ccp1(CCP_PWM);
break;

case 2://15 kHZ
setup_timer_2(T2_DIV_BY_1,65,1);
set_pwm1_duty((int16)133);
setup_ccp1(CCP_PWM);
break;

case 3://30 kHZ
setup_timer_2(T2_DIV_BY_1,32,1);
set_pwm1_duty((int16)66);
setup_ccp1(CCP_PWM);
break;

case 4://45 kHZ
setup_timer_2(T2_DIV_BY_1,21,1);
set_pwm1_duty((int16)44);
setup_ccp1(CCP_PWM);
break;

case 5://90 kHZ
setup_timer_2(T2_DIV_BY_1,10,1);
set_pwm1_duty((int16)22);
setup_ccp1(CCP_PWM);
break;
}
}

CCS C de kendim yukarıda ki gibi bir kod yazdım amacım 10kHZ, 15kHZ, 30kHZ, 45kHZ, 90kHZ frekansları arasında butonlarla geçiş yapmaktı. Bunun için switch ve case komutlarını kullandım. Kodu yazdım derledim hata çıkmadı ancak ISIS e attığımda çalışmadı. PIC olarak 16F628A kullandım. Sanırım kodlarda sorun var yardımcı olursanız sevinirim.
 
Aşağıdaki kodlar çok güzel çalıştı...İyi çalışmalar.
Eksik olan kod parçasını while(true){......} döngüsüne koymamandı.
Birde asla i değişkeni işaretsiz tam sayı olduğu için 0 dan küçük olmaz... 0 dan 1 çıkardığımızda 8 bitlik olduğu için i değişkeni 255 olur...
Kod:
#include <16f628A.h>
#FUSES NOWDT
#FUSES NOMCLR
#FUSES NOBROWNOUT
#FUSES NOLVP
#use delay(internal=4000000)
#define arttir pin_a0
#define azalt pin_a1

#use fast_io(a)
int i=0;
void main()
{
set_tris_a(0x03);

while(true)
{
   if(input(arttir))
   {
   delay_ms(10);
   while(input(arttir));
   i++;
   if(i>5)  i=5;
   }

else if(input(azalt))
   {
   delay_ms(10);
   while(input(azalt));
   i--;
   if(i==0) i=1;
   }
 
switch(i)
      {
      case 1://10 kHZ
      setup_timer_2(T2_DIV_BY_1,99,1);
      set_pwm1_duty((int16)200);
      setup_ccp1(CCP_PWM);
      break;
     
      case 2://15 kHZ
      setup_timer_2(T2_DIV_BY_1,65,1);
      set_pwm1_duty((int16)133);
      setup_ccp1(CCP_PWM);
      break;
     
      case 3://30 kHZ
      setup_timer_2(T2_DIV_BY_1,32,1);
      set_pwm1_duty((int16)66);
      setup_ccp1(CCP_PWM);
      break;
     
      case 4://45 kHZ
      setup_timer_2(T2_DIV_BY_1,21,1);
      set_pwm1_duty((int16)44);
      setup_ccp1(CCP_PWM);
      break;
     
      case 5://90 kHZ
      setup_timer_2(T2_DIV_BY_1,10,1);
      set_pwm1_duty((int16)22);
      setup_ccp1(CCP_PWM);
      break;
      }
}
}
 

Forum istatistikleri

Konular
129,877
Mesajlar
930,960
Kullanıcılar
452,744
Son üye
ProCan

Yeni konular

Geri
Üst