PWM ile 1Khz sinus dalga oluşturmak

Başlatan ahmet2004, 09 Nisan 2010, 12:04:14

ahmet2004

Pwm kullanarak 1khz sinüs dalgası oluşturmak için gerekenler bir işlemci bir kristal birkaç direnç kondansatör ve güç kaynağı.



#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=20000000) //Kristal 20Mhz
#use rs232(baud=115200,parity=N,xmit=PIN_C7,rcv=PIN_A0,bits=5)

const long int sinuss[]  ={36,24,14,7,5,7,14,24,36,50,64,76,86,93,95,93,86,76,64,50}; 
int1 xxx;
char sinuss_idx=0;

#int_timer2
timer2Ahmet() 
{
   if(sinuss_idx > 19)
   {
      sinuss_idx = 0;
   }
   set_pwm1_duty(sinuss[sinuss_idx++]);
   xxx = 1;
}

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_2(T2_DIV_BY_1,24,10);
   setup_ccp1(CCP_PWM);
   setup_comparator(NC_NC_NC_NC);

   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RTCC);
   enable_interrupts(INT_TIMER2);

   while(1)
   {

   }
}

hasangurlek

Alıntı yapılan: FxDev - 09 Nisan 2010, 12:08:49
Çıkıştaki low pass filtre hangi değere göre seçiliyor acaba?
Bu tür uygulamalarda kafamı karıştıran hep o olmuştur.

Fout=1/2.PI.RC

0Hz-1 kHz için 1.59 kohm 0.1 uf kullanılabilir. 3k3 ve .22 ile 2.2 kHz e kadar olan sinyaller filtreden geçer. Uygulama yerine göre low pass yerine band pass kullanmak daha uygun olabilir.
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!

ahmet2004


emrahmrcn

Bir not düşeyim, bu tip çeviriciler yüksek güçlü online ups lerde pure sinus elde etmek içinde kullanılıyor. 310VDC yi 220VAC bu şekilde çeviriyorlar
Benim yaradılışımda bir ayrıcalık varsa o da TÜRK olmamdır. M.K ATATÜRK

teknikelektronikci

Alıntı yapılan: FxDev - 09 Nisan 2010, 13:19:35
Şimdi anladım, ben hep köşe frekansını bu uygulama için sınır kabul edilen 1kHz'de sabit tutulması gerektiğini düşünmüştüm...
Bu arada sabit dizideki değerleri burada çizdirdim. Ortalaması da 50 çıkıyor. Merak eden oradan bakabilir.

Bir ara CCS C'deki gibi PWM fonksiyonu yazmak lazım sanki..

selam matlab ile mi yaptin yoksa excell ile yapabiliyormuyuz ?
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

ahmet2004

50 Hz ve 100Hz üretimi için uygulama örneği:

#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=20000000)
#use rs232(baud=115200,parity=N,xmit=PIN_C7,rcv=PIN_C6)

const long int sinus50[]={0x20, 0x22, 0x25, 0x27, 0x2A, 0x2C, 0x2F,0x31, 0x33, 0x35, 0x37, 0x39,
                    0x3A, 0x3C, 0x3D, 0x3E, 0x3E, 0x3F, 0x3F,0x3F, 0x3F, 0x3F, 0x3F, 0x3E,
                    0x3D, 0x3C, 0x3A, 0x39, 0x37, 0x35, 0x33,0x31, 0x2F, 0x2D, 0x2A, 0x28,
                    0x25, 0x23, 0x20, 0x1D, 0x1B, 0x18, 0x16,0x13, 0x11, 0x0E, 0x0C, 0x0A,
                    0x08, 0x07, 0x05, 0x04, 0x02, 0x01, 0x01,0x01, 0x01, 0x01, 0x01, 0x01,
                    0x01, 0x01, 0x02, 0x03, 0x04, 0x06, 0x07,0x09, 0x0B, 0x0D, 0x10, 0x12,
                    0x14, 0x17, 0x19, 0x1C, 0x1F};

int1 xxx;
char sinuss_idx=0;

#int_timer2
timer2Ahmet() 
{
   //set_timer2(24);
   if(sinuss_idx > 77)
   {
      sinuss_idx = 0;
   }
   set_pwm1_duty(sinus50[sinuss_idx++]);
   xxx = 1;
   output_bit( PIN_B7, 1);
}

#org 0x1F00, 0x1FFF void loader16F877A(void) {} //Bu satır bootloader kullanımı için

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_2(T2_DIV_BY_4,160,2); //T2_DIV_BY_4,80,2=>100Hz   T2_DIV_BY_4,160,2=>50Hz
   setup_ccp1(CCP_PWM);
   setup_comparator(NC_NC_NC_NC);

   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RTCC);
   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);
   
   for(;;)
   {
      output_bit( PIN_B7, 0); 
   }
}

teknikelektronikci

Alıntı yapılan: FxDev - 09 Nisan 2010, 22:19:46
Aşağıdaki linke tıklaman yeterli. Artık internet kullanabilen için güzel bir yer haline gelmeye başladı.

http://www.wolframalpha.com/input/?i=36,24,14,7,5,7,14,24,36,50,64,76,86,93,95,93,86,76,64,50

linke tikladimda linki resim sandim editlenebiliormus güzel olay
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

ahmet2004

iki kanal pwm ile faz kaydırma 100Hz örnek:

İkinci kanal devresi birinci kanal ile aynı

Pic16f877A pin17 den pwm1.
Pic16f877A pin16 dan pwm2.



#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=20000000)
#use rs232(baud=115200,parity=N,xmit=PIN_C7,rcv=PIN_C6)

const long int sinus50f1[]={
                    0x20, 0x22, 0x25, 0x27, 0x2A, 0x2C, 0x2F,0x31, 0x33, 0x35, 0x37, 0x39,
                    0x3A, 0x3C, 0x3D, 0x3E, 0x3E, 0x3F, 0x3F,0x3F, 0x3F, 0x3F, 0x3F, 0x3E,
                    0x3D, 0x3C, 0x3A, 0x39, 0x37, 0x35, 0x33,0x31, 0x2F, 0x2D, 0x2A, 0x28,
                    0x25, 0x23, 0x20, 0x1D, 0x1B, 0x18, 0x16,0x13, 0x11, 0x0E, 0x0C, 0x0A,
                    0x08, 0x07, 0x05, 0x04, 0x02, 0x01, 0x01,0x01, 0x01, 0x01, 0x01, 0x01,
                    0x01, 0x01, 0x02, 0x03, 0x04, 0x06, 0x07,0x09, 0x0B, 0x0D, 0x10, 0x12,
                    0x14, 0x17, 0x19, 0x1C, 0x1F};

const long int sinus50f2[]={
                    0x01, 0x01, 0x01,
                    0x01, 0x01, 0x02, 0x03, 0x04, 0x06, 0x07,0x09, 0x0B, 0x0D, 0x10, 0x12,
                    0x14, 0x17, 0x19, 0x1C, 0x1F,
                    0x20, 0x22, 0x25, 0x27, 0x2A, 0x2C, 0x2F,0x31, 0x33, 0x35, 0x37, 0x39,
                    0x3A, 0x3C, 0x3D, 0x3E, 0x3E, 0x3F, 0x3F,0x3F, 0x3F, 0x3F, 0x3F, 0x3E,
                    0x3D, 0x3C, 0x3A, 0x39, 0x37, 0x35, 0x33,0x31, 0x2F, 0x2D, 0x2A, 0x28,
                    0x25, 0x23, 0x20, 0x1D, 0x1B, 0x18, 0x16,0x13, 0x11, 0x0E, 0x0C, 0x0A,
                    0x08, 0x07, 0x05, 0x04, 0x02, 0x01, 0x01,0x01, 0x01};
                    

                    
int1 xxx;
char sinuss_idx=0;

#int_timer2
timer2Ahmet() 
{
   //set_timer2(24);
   if(sinuss_idx > 77)
   {
      sinuss_idx = 0;
   }
   set_pwm1_duty(sinus50f1[sinuss_idx++]);
   set_pwm2_duty(sinus50f2[sinuss_idx++]);
   xxx = 1;
   output_bit( PIN_B7, 1);
}

#org 0x1F00, 0x1FFF void loader16F877A(void) {} //Bu satır bootloader kullanımı için

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_2(T2_DIV_BY_4,160,2); //T2_DIV_BY_4,80,2=>100Hz   T2_DIV_BY_4,160,2=>50Hz
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_PWM);
   setup_comparator(NC_NC_NC_NC);

   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RTCC);
   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);
   
   for(;;)
   {
      output_bit( PIN_B7, 0); 
   }
}


bymrz

Bu olayın kısaca şu şekilde hesabı var...

Frekansınız diyelim ki 10Khz(100us). Buradaki 100usaniyenin 100 katı kadar büyüklükte bir RC sabitesi bulmak. Db seviyesine göre istenen K sabiti kullanılabilir. K=100 kullanmak en sağlıklısı...Ama tabi bu sabiti ne kadar artırırsanız analog çıkışın tepki verme süresi de o oranda gecikiyor...

memet569

Filtre konusu kafasına takılan arkadaşlara süper bir önerim var

texas ins filter pro

EFESU

arkadaşlar  dizideki verileri portb ye verin ve  portb nin çıkışına r-2r prensibi  ile test edin bakalım nasılbi rsinüs çıkacak.. anacak  mükemmel olup olmadığı o şekil anlaşılabilir.

Extreme

Faydalı Paylaşım teşekkür etmeden geçemedim.

ElrondTar

Hocam, #FUSES RESERVED komutunda hata veriyor, yardımcı olabilir misiniz?