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ş
36
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
 
Ö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..
 
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);
}


}

}
 
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);




}
 
pwm ile yatığım devre isis resmi

pwm-devre-isis.png
 
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.. :)
 
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.
 
pwm çıkışı rc2/ccp1 bacağı takometre çıkışı ise rc1/ccp2 bacağı olacak
 
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
 
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
129,689
Mesajlar
929,033
Kullanıcılar
452,392
Son üye
irem60

Yeni konular

Geri
Üst