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

Başlatan sametyildiz1989, 12 Temmuz 2011, 16:48:21

sametyildiz1989

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