kesme ve diğer problemler..

Başlatan bulut_01, 25 Ekim 2012, 15:40:09

bulut_01

iyi günler arkadaslar bldc motor kod optımıze devam ederken bagzı sorunlar yasıyorum motor hall sensor aldıgım (101,100,010...) bilgiler mcu ilk anda kesmeye sokuyor ve diğer satıra dallanmıyor bu problemı nasıl aşarım kesme sonunda disable yaptıysamda işe yaramadı bide bu hall sensorden aldıgım bılgılerı nasıl bir algorıtma yazmalıyımkı motor ılerı gerı döndurmem için fwd tablestate tablosu olusturdum ama hall sensorden aldıgım bılgı tam işleyemedıgım ıcın istediğim gibi çalısmıyor örnek kod asagıda bu kod mcu çok mu yorar kısacası cok mu karmasık olmus ? hall sensor aldıgım bılgıyı işleyecek algorıtma yardımı beklıyorum bide pic ilk anda kesmeye girip ordan diğer satırlara dallanmadıgı ıcın ilk anda pwm cıkısı olmuyor.motor dönmüyor.

#include <18f1330.h> 
#fuses INTRC_IO,NOWDT,NOMCLR,H4
#use delay(clock=40M)
#use fast_io(a)
#use fast_io(b) 

int16 duty1;
int16 duty2;
int16 duty3;
int8 hall;
int16 p=150;
int8 x;


#int_RB
void RB_kesme ()
{
hall=0;
if(input(pin_a0))
hall=4;

if(input(pin_a1))
hall=3;

if(input(pin_b2))
hall=2;

switch (x)
{
case 1:
     
      output_low(pin_b4);
      duty3=p*64;
    set_power_pwm4_duty(duty3);
     output_high(pin_b0); 
     break;
  
     
case 2:
     
     output_low(pin_b0);
     duty2=p*64;
    set_power_pwm2_duty(duty2);
    output_high(pin_b6); 
    break;
       
case 3:
     set_power_pwm4_duty(duty3=0x00);
     duty2=p*64;
   set_power_pwm2_duty(duty2);
   output_high(pin_b0);
   break;
      
case 4:
     
     output_low(pin_b6);
     duty1=p*64;
    set_power_pwm0_duty(duty1);
    output_high(pin_b4);
    break;
      
case 5:
     set_power_pwm0_duty(duty1=0x00);
     duty3=p*64;
    set_power_pwm4_duty(duty3);
    output_high(pin_b4);
    break; 
case 6:
    set_power_pwm2_duty(duty2=0x00);
    output_low(pin_b6);
    
    duty1=p*64;
   set_power_pwm0_duty(duty1);
   output_high(pin_b6);
   break;
   
}

}

 unsigned long StateTableFwd[] =

 {
  0x00
  0x01
  0x02
  0x03
  0x04
  0x05
  0x06
  
 };

      void main()
{
   setup_power_pwm_pins(PWM_odd_on,PWM_odd_on,PWM_odd_on,PWM_odd_on);
   setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,4095,0,1,0); 
   setup_adc_ports(NO_ANALOGS); 
   setup_adc( ADC_OFF );
   setup_comparator(NC_NC_NC); 
   set_tris_a(0b000000011);
   set_tris_b(0b000001100);
   OUTPUT_B(0x00);
   
  
  clear_interrupt(INT_EXT); 
  ext_int_edge(L_TO_H);
  enable_interrupts(GLOBAL);
  enable_interrupts(int_RB);
  
  
while(TRUE)
{
x = StateTableFwd[hall];
}
}
YENİLMEZ..

bulut_01

hala yanıt arıyorum bu konuda yardım arkadaslar
YENİLMEZ..

gökhan_

tam bilgim yok ancak switch kısmında yanlıslık oldugunu düşünüyorum bir fonksiyon ayzsanız mesela
int fonksiyon(int x)
{
switch(x)
{
case..
} şeklinde.

bulut_01

#3
kod şu şekilde değiştirdim calısıyor motor ılerı yada geri döndurmek ıcın nasıl bir algoritma gerekir ? benım koddakı hall taplosunun sıralamasını ters yerını değiştirdiğimde similasyonda motor yönü değişmiyor yön değiştirmek için nasıl bir teknık kullanmak lazım ?

#include <18f1330.h> 
#fuses INTRC_IO,NOWDT,NOMCLR
#use delay(clock=40M)
#use fast_io(a)
#use fast_io(b) 

int16 duty1;
int16 duty2;
int16 duty3;
int8 hall=0;
int16 p=220;
int1 v;
int1 c;
int1 z;

#int_timer0
void timer0_kesme()
{
set_timer0(250);

v=input(pin_a0);
c=input(pin_a1);
z=input(pin_b2);

if ((v==1) && (c==0) && (z==0))  //100
{
hall=1;
}
if  ((v==1) && (c==1) && (z==0))  //110
{
hall=2;
}
if  ((v==0) && (c==1) && (z==0))  //010
{
hall=3;
}
if  ((v==0) && (c==1) && (z==1))  //011
{
hall=4;
}
if  ((v==0) && (c==0) && (z==1))  //001
{
hall=5;
}
if  ((v==1) && (c==0) && (z==1))  //101
{
hall=6;
}
switch (hall)
{
case 1:
output_low(pin_b4);
set_power_pwm4_duty(duty3=P*64);
output_high(pin_b0);

break;
case 2:
set_power_pwm4_duty(duty3=0x00);
set_power_pwm2_duty(duty2=P*64);
output_high(pin_b0); 

break;
case 3:
output_low(pin_b0);
set_power_pwm2_duty(duty2=P*64);
output_high(pin_b6);

break;

case 4:
set_power_pwm2_duty(duty2=0x00);
set_power_pwm0_duty(duty1=P*64);
output_high(pin_b6);

break;
case 5:
output_low(pin_b6);
set_power_pwm0_duty(duty1=P*64);
output_high(pin_b4);

break; 
case 6:
set_power_pwm0_duty(duty1=0x00);
set_power_pwm4_duty(duty3=P*64);
output_high(pin_b4);
break;
}
}
           void main()
{
setup_power_pwm_pins(PWM_odd_on,PWM_odd_on,PWM_odd_on,PWM_odd_on);
setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,4095,0,1,0); 
setup_adc_ports(NO_ANALOGS); 
setup_adc( ADC_OFF );
setup_comparator(NC_NC_NC); 
set_tris_a(0b000000011);
set_tris_b(0b000001100);
OUTPUT_B(0x00);
enable_interrupts(GLOBAL);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_internal | rtcc_div_2);
while(TRUE)
{
}
}


mesaj birleştirme:: 28 Ekim 2012, 21:05:27

yaw çok mu zor soru sordum hiç tık yok millette  ::)
YENİLMEZ..

bulut_01

hala güncel bir soru ve cevap yok motor ters döndürmek ıcın var olan algoritmanın neler eklemek gerek ben tablo ters cevirdiğimde ise motor hala saga dönüyor similasyonda tabı gercekde ne olur bilmiyorum.
YENİLMEZ..

z

Motor dönüş yönünü değiştirmek için sadece iki fazın yerini değiştirmen yeterli. Yazılımı buna göre degiştir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

bulut_01

eyw bülent hocam saolasın bir sorum daha olacak motor sabit hızla dönerlen pwm frekans değişdirdiğimiz zaman torkunu duty değiştirdiğimiz zamanda hızı değişiyor demi hocam ?
YENİLMEZ..

z

#7
Pwm frekansı denince motor bobinlerini anahtarlayan voltajın frekansı akla gelir.

PWM frekansı genelde 20Khz civarında seçilir. Motor sargılarından 50Hz akım akıtmak istiyorsan 20Khz Pwm frekansı ile oynamazsın sadece modülasyon yaparsın.

Bu durumda tork pwmden bağımsız olur. pwm sadece akımdaki rıpılı belirler.  Eğer tork değişecekse (sabit güç altında) pwm frekansı ile değil pwmi modüle eden sinyalin frekansı ile değişir.

Tork akımla orantılı. Akım da duty ile.



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Salih

CCS de kullanmasak da Switch-Case yapısında Default maddesini koymak gerekiyor.
Default maddesini sona ekleyerek dener misin.

bulut_01

Alıntı yapılan: salih - 01 Kasım 2012, 13:59:10
CCS de kullanmasak da Switch-Case yapısında Default maddesini koymak gerekiyor.
Default maddesini sona ekleyerek dener misin.

Default kullanmanın tek mantıgı mcu swch case sonra diğer işlemler yapmak için bölümdür. bizimde motoru dondurmek harıcınde suanda ıslemımız olmadıgı ıcın kullanmanın yada kullanmamanın zararı yadar yararı olmuyacakdır.
YENİLMEZ..

Klein

Burada default: kullanmanın mantığı olmayabilir. kodu incelemedim. Ama default kullanmaktaki amaç, switch-case işleminden sonra diğer işlemleri yapmak değil. Case listemizde olmayan bir değer geldiğinde, bir şeyler yapmamız gerekiyorsa  onları yapmak.

Salih

#11
Hangi versiyon da başıma geldi hatırlamıyorum. Belki son versiyonlar da yapmıyordur. Demek istediğim default'u kullanmak veya kullanmamak değil. Yapı düzgün çalışmıyor.

4.128 versiyonda da denedim işimize yaramasa da DEFAULT'u koymak gerekiyor.

bulut_01

Alıntı yapılan: z - 31 Ekim 2012, 22:01:54
Motor dönüş yönünü değiştirmek için sadece iki fazın yerini değiştirmen yeterli. Yazılımı buna göre degiştir.
bülent hocam dediğiniz gibi yapdım normal çalışan motor iki fazını değiştirdim resmen motor masaüstünde zıpladı  ;D kısacası fazın yerini değiştirince motorun yönü değişmiyor peki nasıl değişiyor ?
YENİLMEZ..

z

Imkansiz.

3 fazli motorda  fazlar  A B C olsun.  (Asenkron yada senkron farketmez)

Surucuden gelen A B C uclarini motora A C B seklinde baglarsan motor donus yonu tersine cevrilir.

Edit: Yalniz aklima sensor uclari simdi geldi. Sensorun de iki fazini ters cevirsene.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

bulut_01

Alıntı yapılan: z - 03 Kasım 2012, 19:56:34
Imkansiz.

3 fazli motorda  fazlar  A B C olsun.  (Asenkron yada senkron farketmez)

Surucuden gelen A B C uclarini motora A C B seklinde baglarsan motor donus yonu tersine cevrilir.

Edit: Yalniz aklima sensor uclari simdi geldi. Sensorun de iki fazini ters cevirsene.
bülent hocam bende mı bir gariplik var sende mi yoksa devrede mi anlam veremedim gitti ne yapdıysam sımılasyonda motoru tersıne dönderemedım sensor uclarını çevirdim fazları cevirdim gine yok fazları cevirdim gine yok sensörleri çevirdim gine yok yok allah yok motor hep + yöne dönüyor - yöne çeviremedim gitti.. şema ekledım deneme yapdıgım şema asagıdakıdır.

YENİLMEZ..