Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: bulut_01 - 01 Ocak 2013, 12:26:41

Başlık: BLDC fazı ters çevirmek
Gönderen: bulut_01 - 01 Ocak 2013, 12:26:41
s.a picproje ailesi öncelikle yeni yılınızı kutlarım.sorunum bldc sürücü yapdım kodu tamamladım sayılır yanlız motor yönünü değiştirmek için swich case döngüsü tersden döngü kurmam lazım
söyle bişe yazdım ama işe yaramadı.
a4 port yön bilgisi için kullandım low oldugunda motor saga hıgh oldugunda sola dönmesi lazım.
(not: proteusda bldc motor similasyonunda yönü hep saga dönüyor fazını değiştirdiğim halde bende mi hata yoksa proteus bldc motor similasyonu tek yönemi döner sadace ?)


#int_RB
void RB_kesme()
{
x=input(pin_a4);
if(x==0)
hall  = input_a()& 0b00000011 ;
hall |= input_b()& 0b00001000 ;
if(x==1)
hall  = input_a()& 0b00000011^input_b()& 0b00001000 ;
hall |= input_b()& 0b00001000^input_a()& 0b00000011 ;


kodun tamamı burda normal hali tek yön.
#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;
int16 p=100;
int8 hall=0;


#int_RB
void RB_kesme()
{

hall  = input_a()& 0b00000011 ;
hall |= input_b()& 0b00001000 ;

switch (hall)
{
case 0b00001001:
output_low(pin_b4);
set_power_pwm4_duty(duty3=P*64);
output_high(pin_b0);
break;

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

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

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

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

case 0b00001000:
set_power_pwm0_duty(duty1=0x00);
set_power_pwm4_duty(duty3=P*64);
output_high(pin_b4);
break;
default:
}
}

      void main()
{
setup_power_pwm_pins(PWM_odd_on,PWM_odd_on,PWM_odd_on,PWM_odd_on);
setup_power_pwm(PWM_CLOCK_DIV_128|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_RB);


while(TRUE)
{
}
}
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: Mucit23 - 01 Ocak 2013, 14:37:36
Proteustaki BLDC motorun dönmesi için fazlardan herhangi birine 12V vermek yetiyor. :D
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: marecrisium - 01 Ocak 2013, 16:39:15
Motoru ters yönde döndürmek için ikinci bir switch-case içinde PWM anahtarlamalarını tersten başlayarak yaz.Yani sağa dönerken 1. adımda gönderilen sinyali, sola dönerken 6. sırada olacak şekilde 6 adım için tekrar yaz. İf ile yön şartı belirle ona göre istediğin yöndeki switch-case işletilsin.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: bulut_01 - 01 Ocak 2013, 21:32:57
söyle bir kod çıkdı meydana uzunluk bakımından ve gereksizlik bakımında neler söylenebilir ? en sade biçimde yazmaya çalışdım yanlız proteus similasyonda bldc motor hep saga dogru döndüğü için scopla bakdıgımda 2 fazın bazen aynı anda aktif oldugunu gördum sebebi motor yön değiştirmediği için olabilir mi ? bu kod gerçekde nasıl çalısır yada verimli sekilde çalısır mı ?

#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;
int16 p=100;
int8 ileri=0;
int8 geri=0;
int1 x=0;

#int_RB
void RB_kesme()
{
x=input(pin_a4);

if(x==1)
ileri  = input_a()& 0b00000011 ;
ileri |= input_b()& 0b00001000 ;

if(x==0)
geri  = input_a()& 0b00000011 ;
geri |= input_b()& 0b00001000 ;

switch (ileri)
{
case 0b00001001:
output_low(pin_b4);
set_power_pwm4_duty(duty3=P*64);
output_high(pin_b0);
break;

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

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

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

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

case 0b00001000:
set_power_pwm0_duty(duty1=0x00);
set_power_pwm4_duty(duty3=P*64);
output_high(pin_b4);
break;
default:
p=0;
}

switch (geri)
{
case 0b00001000:
set_power_pwm0_duty(duty1=0x00);
set_power_pwm4_duty(duty3=P*64);
output_high(pin_b4);
break;

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

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

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

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

case 0b00001001:
output_low(pin_b4);
set_power_pwm4_duty(duty3=P*64);
output_high(pin_b0);
break;
default:
p=0;

}
}


      void main()
{
setup_power_pwm_pins(PWM_odd_on,PWM_odd_on,PWM_odd_on,PWM_odd_on);
setup_power_pwm(PWM_CLOCK_DIV_128|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_RB);


while(TRUE)
{
}
}
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: marecrisium - 01 Ocak 2013, 22:00:12
switch case yapılarını ayrı ayrı iki if şartı ile işletsen daha iyi olabilir.Çünkü her durumda hem geri hem ileri yöndeki swich case işletiliyor.Bu hataya neden olabilir.

if (ileri yönde){ ileri yönde swith case adımları}
if(geri yönde){geri yönde switch case adımları }


şeklinde düzenlersen daha doğru sonuç alabilirsin.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: necati - 01 Ocak 2013, 22:23:37
http://www.4shared.com/rar/IufZjdgc/ESC_pic16f628.html (http://www.4shared.com/rar/IufZjdgc/ESC_pic16f628.html)
http://www.4shared.com/rar/ZfvKdvIG/bldc_driver_2431.html (http://www.4shared.com/rar/ZfvKdvIG/bldc_driver_2431.html)
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: bulut_01 - 01 Ocak 2013, 22:49:12
Alıntı yapılan: marecrisium - 01 Ocak 2013, 22:00:12
switch case yapılarını ayrı ayrı iki if şartı ile işletsen daha iyi olabilir.Çünkü her durumda hem geri hem ileri yöndeki swich case işletiliyor.Bu hataya neden olabilir.

if (ileri yönde){ ileri yönde swith case adımları}
if(geri yönde){geri yönde switch case adımları }


şeklinde düzenlersen daha doğru sonuç alabilirsin.

yukardakı verdiğin örnegi benım yazdıgım kodun uzerınden dırek yazarak örnek verırmısın.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: marecrisium - 01 Ocak 2013, 23:30:00
Kodlarına göre şöyle yazılması gerekir.
#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;
int16 p=100;
int8 alg=0;

int1 x=0;

#int_RB
void RB_kesme()
{
x=input(pin_a4);

alg  = input_a()& 0b00000011 ;
alg |= input_b()& 0b00001000 ;

if(x==1)    //ileri yönde
{

switch (alg)
{
case 0b00001001:
output_low(pin_b4);
set_power_pwm4_duty(duty3=P*64);
output_high(pin_b0);
break;

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

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

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

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

case 0b00001000:
set_power_pwm0_duty(duty1=0x00);
set_power_pwm4_duty(duty3=P*64);
output_high(pin_b4);
break;
default:
p=0;
}
}
if(x==0)
{
switch (geri)  // geri yönde
{
case 0b00001000:
set_power_pwm0_duty(duty1=0x00);
set_power_pwm4_duty(duty3=P*64);
output_high(pin_b4);
break;

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

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

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

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

case 0b00001001:
output_low(pin_b4);
set_power_pwm4_duty(duty3=P*64);
output_high(pin_b0);
break;
default:
p=0;
}
}
}


      void main()
{
setup_power_pwm_pins(PWM_odd_on,PWM_odd_on,PWM_odd_on,PWM_odd_on);
setup_power_pwm(PWM_CLOCK_DIV_128|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_RB);


while(TRUE)
{
}
}
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: Saruman - 02 Ocak 2013, 03:16:01
16F877 ile bu iş olur.
Ayrıca size XC8 ya da Hitech C tavsiye ederim.
Derin bir işle uğraşıyorsunuz fakat CCS kullanıyorsunuz, saç baş yoldurur böyle.

3 faza ihtiyaç yok.
Ben de fırçasız motor kontrolüyle ilgileniyorum bu aralar.
PWM'i 16F877 ya da benim kullandığım 16F887 nin CCP2 bacağından alın ve 4lü AND kapısı ile PWM adedini 3'e çıkarın.

Örnek, PWM'i AND kapılarının her birinin 1.girişine bağlayın.
AND kapılarının 2.girişlerini ise her hangi bir port'a bağlayın ve aktif olmasını istediğiniz pwm çıkışını and kapısının ilgili bacağını lojik-1'e çekerek aktif edersiniz.

Hall sensor değişimlerini PORTB değişim kesmesiyle algılarsanız hem yazılıma binen yükü hafifletmiş hem de sensör değişimlerini kaçırmamış olursunuz.

18F serisini sadece hızı için tercih edebilir ve motor sürücü modülü olan bir PIC kullanmak zorunda kalmayarak maliyeti azaltırsınız.

İyi Çalışmalar
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: teknikelektronikci - 02 Ocak 2013, 11:06:24
Kaan sen hem bize stm leri organize et, sat hemde kendin pic ile calis olmadi :D birak artik pici mici :) yok saka

her ne kadar dedigin dogruda olsa birincisi 18f serisi 16 serisinden ucuz ollabiliyor ikincisi gelecekde kodun ve projenin büyüyecegini düsünürsen 18 serisini kullanmak daha mantikli geliyor tabiyki hw Motor pwm i olanlar pahalli ama yarin öbür gün hem kod yükünü azaltir hemde zamandan tasaruf ki belki amcam bu projeyi yarin öbür gün bir otomasyon firmasina satma sansini yakalayacak bu duurmda 2 gün bekleyinde ben bunu bir üst modelle uyarlayayim demek olmaz, zaten marecrisium arkadasimiz bir ise girismis ve uzun zamandir ugrasiyor sanirim maddi durumu düsünecek durumda degildir :D kolay gelsin
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: z - 02 Ocak 2013, 11:20:32
Bahsettiğiniz yöntemde herhangi bir anda tek fazı on yapabilirsiniz ve sinus yada trapez akım oluşturamazsınız.

BLDC de faz farklı 3 PWM ihtiyacınız var. Vektor kontrol yapmak istemiyorsunuz galiba.

Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: bulut_01 - 02 Ocak 2013, 15:00:57
tek faz pwm bldc motor sürülmez 3 bagımsız pwm fazınızın olmanısı lazım kod tamamladım proteus similasyonunda yön değiştirmiyor gercekde yapıp denemek lazım koda bakarak bişeler söylenebilir yorumlarınızı beklıyorum gercekde nasıl çalışır kurup görmek lazım.
tork ayarı için pwm fazının nasıl modülasyon frekans değiştirebilirim ? motorun ana sürme frekansı 8 khz.

#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;
int16 p=100;
int8 ileri=0;
int8 geri=0;
int1 x=0;

#int_RB
void RB_kesme()
{
ileri  = input_a()& 0b00000011 ;
ileri |= input_b()& 0b00001000 ;

if(x==1)
switch (ileri)
{
case 0b00001001:
output_low(pin_b4);
set_power_pwm4_duty(duty3=P*64);
output_high(pin_b0);
break;

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

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

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

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

case 0b00001000:
set_power_pwm0_duty(duty1=0x00);
set_power_pwm4_duty(duty3=P*64);
output_high(pin_b4);
break;
default:
}

geri  = input_a()& 0b00000011 ;
geri |= input_b()& 0b00001000 ;

if(x==0)
switch (geri)
{
case 0b00001000:
set_power_pwm0_duty(duty1=0x00);
set_power_pwm4_duty(duty3=P*64);
output_high(pin_b4);
break;

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

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

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

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

case 0b00001001:
output_low(pin_b4);
set_power_pwm4_duty(duty3=P*64);
output_high(pin_b0);
break;
default:
}
}
      void main()
{
setup_power_pwm_pins(PWM_odd_on,PWM_odd_on,PWM_odd_on,PWM_odd_on);
setup_power_pwm(PWM_CLOCK_DIV_128|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(0b000010011);
set_tris_b(0b000001100);
OUTPUT_B(0x00);

enable_interrupts(GLOBAL);
enable_interrupts(int_RB);


while(TRUE)
{
x=input(pin_a4);
}
}
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: Saruman - 02 Ocak 2013, 15:10:35
Murat, arkadaş işe yeni girişiyor, mantığını kavraması açısından pwm barındıran istediği işlemci ile başlayabilir.İçinde motor kontrol modülü bulunduran PIC'ler diğerlerine nazaran pahalı.

@z , "trapez akım oluşturamazsınız" yanıtı eğer bana ise yazdığımı anlamadığınızı düşünüyorum.

Çünkü ben bu yöntemle fırçasız motor çalıştırıyorum. Faz farkını oluşturan zaten hall sensörler.

BLDC Motor Control with 16F887 (http://www.youtube.com/watch?v=fjkX9Ns5XuA#)

@bulut_01
Ayrıca sen de farkında değilsin ama tek faz PWM ile sürüyorsun motoru.
DUTY'ler hep aynı.Yine dediğim kapıya çıkıyor.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: bulut_01 - 02 Ocak 2013, 15:49:02
@silvercopper duty çarpanları aynı evet yanlız atladıgın nokta  pwm fazları birbirinden bagımsız hall bilgisine göre aktif oluyolar senın mantıkla torkunu ayarlayamazsın sadece hız ayarı yapabilirsin.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: z - 02 Ocak 2013, 15:53:27
@silvercopper

Tek PWM'i AND kapılarla seçerek yaptığın uygulamada 3 faz motorun sargı akımlarının dalga şeklini de görseydik.

Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: Saruman - 02 Ocak 2013, 16:40:18
Alıntı yapılan: bulut_01 - 02 Ocak 2013, 15:49:02
@silvercopper duty çarpanları aynı evet yanlız atladıgın nokta  pwm fazları birbirinden bagımsız hall bilgisine göre aktif oluyolar senın mantıkla torkunu ayarlayamazsın sadece hız ayarı yapabilirsin.

@bulut_01 sen bildiğin yoldan devam edebilirsin. Deneyim edindiğini sanar olduğun yerde sayarsın. Ben de fazları sensör bilgisine göre birbirinden bağımsız olarak aktif ediyorum.Trapezoidal sinyal oluşturuyorum.

@z hocam,
(http://img842.imageshack.us/img842/7310/newfile0.png)

Sinyal gürültülüdür. Kart tasarımında çok deneyimli değilim. Tabi bu bir çok önlemi almadığım anlamına gelmiyor, fakat güç elektroniği gerektiğinden fazla ilgi istiyor.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: bulut_01 - 02 Ocak 2013, 16:48:21
@silvercopper dediğin yöntemle tork ayarlayabiliyormusun hızı sormuyorum ?
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: Saruman - 02 Ocak 2013, 17:12:05
 Fırçasız motor kontrolünü biraz daha araştırman lazım.

Kaç çeşit kontrol var, hangi parametre ne ile orantılı, biz o parametreleri nasıl değiştiririz  biraz daha bilgi topladıktan sonra tekrar tartışalım.
Bu yöntemi ticari bir projede kullanıyorum @bulut_01.

Sana bir tavsiye.

Motorun hızını DUTY Cycle'ı değiştirerek ayarlayabilirsin, aynı zamanda komütasyonlar arası süreyi arttırarak da değiştirebilirsin, şöyle bir toplayacak olursak:

Duty Cycle sabit ise, motorun hızını de komütasyonlar arası süreyle oynayarak azaltabiliyorsan, d(fi)/dt azalıyorsa, geriye daha az emk uygulamış oluruz. O zaman motora aktardığın akım da artar. Akım artar ise, doğru orantılı olarak tork da artmış olur.

Şimdi ben sana soruyorum ? Sence torku ayarlayabilir miyim ?
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: SERRO EFE - 02 Ocak 2013, 17:16:23
@bulut_01 senin uyguladığın yöntemde sen ayarlayabiliyormusun torku. Ayrıca @silvercopper ile motoru sürme mantığınız aynı bunu senin yazdığın programa bakarak söylüyorum. Sen her kanaldan eşit duty lerdeki pwm i çıkıyorsun mosfetlere iletiyorsun @silvercopper tek pwm i and kapıları ile seçip uygun mosfete gönderiyor. Sen işlemci içersinde pwm i kanallara ayırıyorsun @silvercopper işlemci dığında.. Ben iki yöntemlede brushless motor sürücüsü yaptım (2kw).
Ayrıca benim incelediğim uygulama notlarında bu şekilde sürülen brusless dc motorlarda kapalı çevrim kontrol yaparak ayarlanabiliyordu tork. Bunun için duty değerini devir cinsinden skala etmen lazım hallefectlerden gelen bilgilere göre motorun kaç devirde dönüyor hesaplaman gerek ki bu ikisinin farkından motorun devri istenen devirden aşağıdamı yukardamı kalıyo bilesin. Sonuca görede yapacağın hesapla yeni pwm değerini yükleyesin..

@silvercopper komütasyon süreleri ile oynamak motorda titreşime sebep olmuyormu? Komütasyonun hallefect lere bağlı değilmi
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: bulut_01 - 02 Ocak 2013, 17:33:58
@SERRO EFE torku sadece hall gelen bilgi ile çıkıs pwm duty oranları hesaplayarak mı illa yapılır? peki pwm fazı modulasyon frekansını değiştirerek tork ayarı yapılmaz mı ?
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: z - 02 Ocak 2013, 17:41:26
Burada yapılan trapezoidal akım sürme değil. Akım dalga şeklide zaten bunu söylüyor.
Motoru tam güçle sürülmüyor. Büyük rıpıl büyük tork kaybı demek.

Her bir faz akımı trapez formunda yada motor tipine göre sinüsoidal ve küçük rıpıla sahip olmalı.

Amaç sadece motor döndürmekse sorun yok.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: Saruman - 02 Ocak 2013, 17:48:08
Torku modülasyon frekanslarıyla oynayarak da ayarlayabilirsin.

Bu sefer de değişken frekansın getirdiği anahtarlama sıkıntılarıyla ilgilenmek gerekir.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: z - 02 Ocak 2013, 17:49:09
Bu olmadı işte.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: Saruman - 02 Ocak 2013, 17:52:51
Ripple'ın sebebi yazılım değil. Ben farklı bir şey yapmıyorum.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: z - 02 Ocak 2013, 18:47:16
Bu uygulamada rıpılın sebebi tek pwm kullanıyor olman.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: pisayisi - 02 Ocak 2013, 19:14:13
@z hocam riplin sebebi tek pwm kullanılması değil, burda silvercopper in yaptığı hall sensör girişlerini durum makinası gibi giriş olarak kullanıp fetleri sürecek çıkışları pwm işareti ile and işlemine tabi tutuyor. Yöntem yetersiz pwm imkanı olan işlemcilerde kullanılabilcek en basit ve etkili bir kontrol tipidir. Ben bir aralar hall girişlerini alıp 6 adet fet için gerekli olan çıkışları üreten bir durum makinasını hiç lojik kapı kullanmadan d flip flop larla tasarlamış ve fırçasız motor döndürmüştüm . Burda ripple 6 step trapezoidal kontrolün doğasından kaynaklanmakta. Halen daha fırçasız motorlarda tork ripli azaltabilcek teknikler üzerinde kafa yorulmakta, isteyen ieee de 2012 senesine ait makaleleri inceleyebilir.

Fırçasız motorlarda tork doğrudan hat akımı ile orantılıdır. Aşağıdaki gibi bir kontrol düzeni ile aynı anda hız ve tork kontrolünü gerçekleştirebilirsiniz. Hız ve tork kontrolü yükün değişimine de bağlı ve birbirinden bağımsız paremetleler değildir. Basit bir pi kontrolcü ile hız sabitken değişken yükler altında torkun yüke uyum sağlaması istenir. Yoksa kimse torkum şu olsun demez...

[IMG]http://imageshack.us/a/img254/5438/bldcspeed.jpg[/img]
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: Saruman - 02 Ocak 2013, 19:31:27
Hocam ben hiç bir fark göremiyorum.
Orada görülen ripple PWM'in kendisi. Şekli trapezoidal fakat o ripple'lar PWM.

Frekansı ve duty'si aynı olan 3 PWM sinyali ile, tek çıkışın AND kapılarıyla üçlenmesi sonucu elde edilen PWM sinyalleri arasındaki farkı ben bilmiyorum.Ya da siz biliyorsunuz.

En basidinden microchip AN899 incelenebilir.

Edit:Mesaj yazarken @pisayisi da cevap atmış. Halimden anlayan birilerini görmek güzel.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: z - 02 Ocak 2013, 19:45:09
Rıpıl ne yaparsanız yapın muhakkak  olacak, olacak da tek pwm kullanıldığında oluşan dalgalanmaya rıpıl demek ne kadar doğru olur?

3 pwm kullanarak vektor space komutasyon yapıldığında akımlar istenen forma giriyor.

Sinusel 3 Fazlı BLDC motorun akımları an ve an aşağıdaki gibi olmalı. (Trapez formu yazmak zor diye sinüsoşdal sürüşü örnek verdim)

Ia=Im sin(wt)
Ib=Im sin(wt+120)
Ic=Im sin(wt+240)

Trapez olanında da her an dolu olmalı. Aksi halde rıpıl kaçınılmaz olur.

Dediğim gibi amaç sadece motor döndürmekse sözüm yok.

Bir ara BLDC için trapezoidal akımların grafiğini vereyim. Rıpıl'a bakarsınız.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: pisayisi - 02 Ocak 2013, 21:55:55
6 adım trapez kontrol de görülen faz gerilim akım ve tork dalga şekilleri aşağıda görünmekte. En dikkat çeken  faz akımındaki dalgalanmaların en altta torkta oluşturduğu dalgalanmalardır.Mavi grafikler pwm modunda ki dalga şekilleri, kırmızı grafikler ise pwm yok iken (% 100 duty) oluşan dalga şekilleridir. Görüldüğü gibi pwm varken ve yokken ripple açısından bir fark yoktur. Sinusoidal kontrol de ise kıyaslama yapıldığında ripple oldukça düşüktür. Ancak Böyle bir kontrolcüde de hall sensörler tek başına iyi bir pozisyon bilgisi üretmek için yeterli gelmeyecek, pahalı pozisyon encoder ları gerekecektir...

[IMG]http://imageshack.us/a/img651/8209/bldcphases.jpg[/img]
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: SERRO EFE - 03 Ocak 2013, 08:33:47
Alıntı yapılan: silvercopper - 02 Ocak 2013, 17:48:08
Torku modülasyon frekanslarıyla oynayarak da ayarlayabilirsin.
@silvercopper microchip ,atmel,stm nin uygulama notlarının hepsini inceledim neredeyse ama senin şu bahsettiğin yöntemden hiç biri ile ilgili bir detay göremedim belki ben atlamışımdır.. Literatüre yeni bir sürme şekli getirmeye çalışıyorsan onu bilemem tabi :)
Alıntı yapılan: pisayisi - 02 Ocak 2013, 21:55:55
Ancak Böyle bir kontrolcüde de hall sensörler tek başına iyi bir pozisyon bilgisi üretmek için yeterli gelmeyecek, pahalı pozisyon encoder ları gerekecektir...
@pisayisi sana katılıyorum 3-4 farklı brushless motor var elimde bir adette femsanın optik encoderli motoru var motora özel yapılmış bir encoder. .Diğer motorlarda hall geçişlerinde ripiller oluşuyor ama femsanın motorunda bunlar neredeyse yok. Motor üzerindeki sensörlerde çok önemli bu işte.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: bulut_01 - 03 Ocak 2013, 20:20:50
Alıntı yapılan: SERRO EFE - 03 Ocak 2013, 08:33:47
Diğer motorlarda hall geçişlerinde ripiller oluşuyor ama femsanın motorunda bunlar neredeyse yok. Motor üzerindeki sensörlerde çok önemli bu işte.
dijital hall sensör ripleye sebep olmasının nedeni nedir kalitesiz olması mı yoksa yüksek devirlerdeki tepkime hızına yetişememesi midir neden ? UGN 3503  örnek hall dijital sensor katalogunda 23 khz Flat Response demiş bu frekans kaç devire denk gelmektedir ?
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: z - 03 Ocak 2013, 20:37:08
Sinüsel sürüşte milin açısal konumunu her 60 derecede değil detaylı şekilde bilmeye ihtiyacınız var. O yüzden pahalı encoder gerekiyor.

Zaten eğer yüksek doğrulukta pozisyon kontrol yapılacaksa sürüş şeklinden bağımsız olarak her durumda yüksek çözünürlükte encodere ihtiyaç olacak.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: bulut_01 - 03 Ocak 2013, 20:45:58
bülent hocam benım gördugum bldc motorlarda yukardakı sensorden vardı ve 120 derece acılarla yerlestırılmıs 3 tane mevcuttu. bunu her 30 dereceye yada 15 dereceye yerlestırsek sensor sayısını artırırsak olur mu acaba. sargı olukları ona ızın vermez sarım seklını komple değiştirmek gerekır motorun dogasını değiştirmek gibi bir durum ortaya cıkar.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: pisayisi - 03 Ocak 2013, 21:08:37
Hall sensör sayısını artırmak pozisyon bilgisinde performansı artırcak kadar bir çözünürlük artışına sebeb olmayacaktır.Avago nun manyetik enkoder modülleri var , optiklerden birazdaha ucuz o tip bir enkoder motor miline kuple edilerek pozisyon bilgisi daha hassas olarak okunabilir. Bu pozisyon bilgisi ile de sinusoidal pwm kontrolü yapabilirsiniz. Ancak bldc motorlarda trapez kontrol en yaygın kontrol biçimidir, tork ripple ise bu tip kontrolde herkesin yaşadığı bir durumdur...
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: bulut_01 - 03 Ocak 2013, 21:16:35
kod tamam devre tamam ama daha gercege gecemedım  ;D reel daha ortada yok
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: teknikelektronikci - 04 Ocak 2013, 11:17:36
Alıntı yapılan: bulut_01 - 03 Ocak 2013, 20:45:58
bülent hocam benım gördugum bldc motorlarda yukardakı sensorden vardı ve 120 derece acılarla yerlestırılmıs 3 tane mevcuttu. bunu her 30 dereceye yada 15 dereceye yerlestırsek sensor sayısını artırırsak olur mu acaba. sargı olukları ona ızın vermez sarım seklını komple değiştirmek gerekır motorun dogasını değiştirmek gibi bir durum ortaya cıkar.

sizin bahsetiginiz sensör tipi encoder degil sanirsam resolver veya sin-cos vericisi
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: bulut_01 - 04 Ocak 2013, 11:37:28
UGN 3503 hall effect sensor gibi 3 tane kompanent mevcuttu motorun ıcınde.
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: teknikelektronikci - 04 Ocak 2013, 11:53:05
Türkcesini bilmyiorum
http://de.wikipedia.org/wiki/Resolver (http://de.wikipedia.org/wiki/Resolver)
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: z - 04 Ocak 2013, 11:54:53
Encoder, bunların alayına verilen genel isim. Shaft encoder diye geçer. Resolver olur, sin cos çıkışlı sensor olur, incremental encoder olur, absolute olur.

Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: teknikelektronikci - 04 Ocak 2013, 12:11:46
Alıntı yapılan: z - 04 Ocak 2013, 11:54:53
Encoder, bunların alayına verilen genel isim. Shaft encoder diye geçer. Resolver olur, sin cos çıkışlı sensor olur, incremental encoder olur, absolute olur.

evet encoder deyince akla sadece dijital olan gelir diye düsündüm haklisiniz bilgilendirme icin tesekürler
Başlık: Ynt: BLDC fazı ters çevirmek
Gönderen: siro - 09 Mart 2019, 16:45:58
@bulut_01 forumda bu tartışmanıza rast geldim. bitirme projemde bldc motor kontrolürü yapmam gerekiyor . ama yeteri kadar kaynak bulamadım işe başlayabilmem için. bu konu hakkındaki son paylaşımınızda böyle bir tasarımı gerçeklediğinizi söylemişsiniz. bu konuda eğer hala daha elinizde mevcut kaynak vs. varsa yardımcı olur musunuz?