16f877a pwm matlab arayüzlü,çift yönlü dc motor kontrolü yardım

Katılım
8 Tem 2010
Mesajlar
1
Puanları
1
Yaş
34
herkese merhabalar. ben şu an başlıkta da yazdığım gibi 16f877a ile matlab bağlantılı bir dc motor kontrol projesiyle uğraşıyorum. pwm çözünürlüğünü adc ile senkronize olsun diye 10 bit yaptım. rs232 ile bilgisayardan 2 adet 8er biti,matlabden girilmiş 0-65536 ya kadar bir constant decimal veriyi packet outputtan pic e göndererek aşağıda kodda da belirteceğim üzere logic işlem vasıtasıyla 2 adet gelmiş 8 biti pic içinde 16 bit haline getiriyorum. pwm çözünürlüğüm 10 bit olduğu için -1023<variable<+1023 arası constant girmemiz gerekiyor. bu kodu yazdım fakat motor bazen ters dönüyor, bazen normal, bazen alakasız bir değerde duruyor. çözüm önerisi olanlara şimdiden teşekkürler. saygılar

#include <16F877A.H>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=20000000)
#use rs232(baud=115200, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
char high_bit,low_bit;
long int a,real_number,x;
#int_rda
void pwm()
{high_bit=getc();
low_bit=getc();
a=high_bit<<8;
real_number=a|low_bit;
x=65535-real_number;
if(x>=32767)
{set_pwm1_duty(real_number);
set_pwm2_duty(0);
}
else
{set_pwm2_duty(x);
set_pwm1_duty(0);
}
}

void main()
{ setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
setup_timer_2(T2_DIV_BY_1,255,1);

enable_interrupts(int_rda);
enable_interrupts(GLOBAL);

while(TRUE)
{
output_high(pin_b0);
}
}
 

Forum istatistikleri

Konular
128,126
Mesajlar
915,243
Kullanıcılar
449,839
Son üye
Qkay

Yeni konular

Geri
Üst