pwm ile dc motor hız kontrol ve takometre ile hız gösterimi

Katılım
2 Şub 2012
Mesajlar
19
Puanları
1
Yaş
34
ii günler benim yapmam gereken bi konu var ama yardıma ihtiyacım var. pic16f877 pwm ile dc motor hızını kontrol ediyorum.Aynı pic üzerinde kesme kullanarak takometre yapmam gerekiyo ama yapamıyorum:(.Yardım eden olursa sevinirim elimde kodlar var ilgilenen olursa paylaşıyım
 

GüvTek

Üye
Katılım
7 Mar 2012
Mesajlar
190
Puanları
1
Yaş
33
Öncelikle pwm değil de capture birimini bahsettiğin.. Hatalı da olsa yazdığın komutları paylaşırsan bakalım hatasına..

En azından sorunlu olduğunu düşündüğün komutları paylaşırsan..
 
Konu Sah
sönmez1703
Katılım
2 Şub 2012
Mesajlar
19
Puanları
1
Yaş
34
bu yazdığım programla picde pwm oluşturuyırum.butonla arıtırıp azaltıyorum
#include <16f877.h>


#fuses XT,NOWDT,NOPROTECT, NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)

#use fast_io(c)
#use fast_io(e)

#define use_portb_lcd TRUE
#include <lcd.c>

int i=2;

int32 j=65;
int32 k;
float f,s;




void main()
{
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);


set_tris_a(0x0f);

set_tris_c(0x00);
set_tris_e(0x0f);

setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);

setup_timer_2(T2_DIV_BY_16,j,1);

set_pwm1_duty(i);
set_pwm2_duty(i);
lcd_init();
printf(lcd_putc,"\ffreq=");
printf(lcd_putc,"\nduty=");

while(1)
{
j=j+1;
k=4*j*16;

f=4000000/k;
lcd_gotoxy(6,1);
printf(lcd_putc,"%f",f);
j=j-1;
s=i*1.562;
lcd_gotoxy(6,2);
printf(lcd_putc,"%f",s);
if(input(pin_a0))
{
delay_ms(20);
while(input(pin_a0));
i+=2;

if(i>64)
i=64;

set_pwm1_duty(i);

}
if(input(pin_a1))
{
delay_ms(20);
while(input(pin_a1));
i-=2;

if(i<2)
i=2;

set_pwm1_duty(i);
set_pwm2_duty(i);
}


if(input(pin_a2))
{
i=10;
set_pwm1_duty(i);
delay_ms(20);
while(input(pin_a2));
j+=5;


if(j>250)
j=250;
setup_timer_2(T2_DIV_BY_16,j,1);
}

if(input(pin_a3))
{
i=10;
set_pwm1_duty(i);
delay_ms(20);
while(input(pin_a3));
j-=5;

if(j<65)
j=65;
setup_timer_2(T2_DIV_BY_16,j,1);
}


}

}
 
Konu Sah
sönmez1703
Katılım
2 Şub 2012
Mesajlar
19
Puanları
1
Yaş
34
bu yazacağım program ise takometre programı bunu yukarıdaki programın içinde yazmalıyım
#include <16f877.h>


#fuses XT,NOWDT,NOPROTECT, NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(e)

unsigned int32 i=0;
int s=0;
float y,j=0;

#define use_portb_lcd TRUE

#include <lcd.c>

#int_timer1
void timer1_kesme()
{
s++;
if (s>3)
{
s=4;
lcd_gotoxy(6,1);
printf(lcd_putc,"XXXXXX");
}
}


#int_CCP1
void yakala_kesmesi()
{


i=get_timer1();
set_timer1(0);
i=i+65535*s;
s=0;
j=i*0.000008/4;
j=60/j;
lcd_gotoxy(6,1);

printf(lcd_putc,"%f",j);



}





void main()
{
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_INTERNAL |T1_DIV_BY_8);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
enable_interrupts(INT_CCP1);
enable_interrupts(int_timer1);
enable_interrupts(GLOBAL);
lcd_init();


setup_ccp1(CCP_CAPTURE_DIV_4);

CCP_1_HIGH=0x00;
CCP_2_LOW=0x00;





set_tris_b(0x00);
set_tris_c(0x07);

output_b(0x00);

printf(lcd_putc,"\fSPIN RPM");

while(1);




}
 
Konu Sah
sönmez1703
Katılım
2 Şub 2012
Mesajlar
19
Puanları
1
Yaş
34
pwm ile yatığım devre isis resmi

pwm-devre-isis.png
 

GüvTek

Üye
Katılım
7 Mar 2012
Mesajlar
190
Puanları
1
Yaş
33
Takometre denince direk aklıma hız ölçümü geldi,, yani capture.. :)) Tamam anladım ne yapmak istediğini.. C dilinden anlamam ama anladığım kadarıyla bi bakayım.. :)
 

serkank

Üye
Katılım
1 Eki 2008
Mesajlar
151
Puanları
1
Yaş
38
PWM ile DC motor kontrolunun duzgun olması icin PWM de hic kesilme olmamalı.
aynı pic ile interupt kullandıgında interrupt kısmına gireceğin kodlar mumkun oldugunca kısa olmalı.
PWM veya Takometreni dışarıdan bir hardware yardımı ile yapsan daha iyi olur.
 
Konu Sah
sönmez1703
Katılım
2 Şub 2012
Mesajlar
19
Puanları
1
Yaş
34
pwm çıkışı rc2/ccp1 bacağı takometre çıkışı ise rc1/ccp2 bacağı olacak
 
Konu Sah
sönmez1703
Katılım
2 Şub 2012
Mesajlar
19
Puanları
1
Yaş
34
PWM ile DC motor kontrolunun duzgun olması icin PWM de hic kesilme olmamalı.
aynı pic ile interupt kullandıgında interrupt kısmına gireceğin kodlar mumkun oldugunca kısa olmalı.
PWM veya Takometreni dışarıdan bir hardware yardımı ile yapsan daha iyi olur.

ilgilendiğin için sağol abi.yazdığım kodlara bak bi abi . ikinci takometre için yazdığım kodlar pwm için yaılan programda beraber yazmam gerekiyor
 

GüvTek

Üye
Katılım
7 Mar 2012
Mesajlar
190
Puanları
1
Yaş
33
Valla benim C bilgim yeterli değil.. Asm biliyorum anca.. Öneri sunabilirim sadece... 2. deki kesmeleri 1.ye kopyala yapıştır.. Alttaki ayarları da main fonksiyonundaki ilk ayarlara ekle..

setup_timer_1(T1_INTERNAL |T1_DIV_BY_8);
setup_ccp1(CCP_CAPTURE_DIV_4);

Ayrıca serkank a katılıyorum.. Yüksek hızlarda ölçüm sorunun olabilir.. O yüzden CCP den ölçtüklerini kesmede global bir değişkene ata.. Bir bit de yeni veri okunduğuna dair ayır.. Kesmede yeni her ölçümde biti 1 yap,, main fonksiyonundaki döngüde de bit 1 ise lcd ye veriyi yaz.. Hemen öncesinde de bu biti 0 yap.. Lcd fazla taranmadan dolayı yanıp sönmez bu şekilde..
 

Forum istatistikleri

Konular
122,260
Mesajlar
862,485
Kullanıcılar
438,817
Son üye
Sadece Çırak

Yeni konular

Üst