iyi geceler arkadaslar bitirdiğim bldc brushless sürücü devresi bitti proteus similasyon basarılı.motor hızını
1-255 ile duty ayarlanıyor devre protatip olup gelıstırılebılır ıstege baglı motora göre frekans ayarlayabılırsınız kodu ve sema asagıdadır. tek sorum bu motor normali kac herz frekansda calısır ? örnek harddisk motoru.
(http://e1209.hizliresim.com/11/s/dbpd4.jpg)
#include <18f1330.h>
#fuses INTRC_IO,NOWDT,NOMCLR
#use delay(clock=40M,oscillator=10M)
#use fast_io(a)
#use fast_io(b)
int16 duty1=0;
int16 duty2=0;
int16 duty3=0;
int16 p=200; // duty oranı (1-255) hız ayar.
int1 f=0;
int1 l=0;
int1 e=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_64|PWM_FREE_RUN,1,0,4095,0,1,0);
setup_adc_ports(NO_ANALOGS);
setup_adc( ADC_OFF );
set_tris_a(0b000000111);
set_tris_b(0x00);
while(1)
{
f=input(pin_a0);
l=input(pin_a1);
e=input(pin_a2);
if ((f==1)&&(l==0)&&(e==1)) //101
{
duty3=p*64;
set_power_pwm4_duty(duty3);
output_high(pin_b4);
}
else if ((f==1)&&(l==0)&&(e==0))
{
set_power_pwm4_duty(duty3*0);
output_low(pin_b4);
}
if ((f==1)&&(l==0)&&(e==0)) // 100
{
duty3=p*64;
set_power_pwm4_duty(duty3);
output_high(pin_b0);
}
else if ((f==1)&&(l==1)&&(e==0))
{
set_power_pwm4_duty(duty3*0);
}
delay_ms(1);
if ((f==1)&&(l==1)&&(e==0)) //110
{
duty2=p*64;
set_power_pwm2_duty(duty2);
}
else if ((f==0)&&(l==1)&&(e==0))
{
set_power_pwm2_duty(duty2*0);
output_low(pin_b0);
}
if ((f==0)&&(l==1)&&(e==0)) //010
{
duty2=p*64;
set_power_pwm2_duty(duty2);
output_high(pin_b6);
}
else if ((f==0)&&(l==1)&&(e==1))
{
set_power_pwm2_duty(duty2*0);
}
if ((f==0)&&(l==1)&&(e==1)) //011
{
duty1=p*64;
set_power_pwm0_duty(duty1);
}
else if ((f==0)&&(l==0)&&(e==1))
{
set_power_pwm0_duty(duty1*0);
output_low(pin_b6);
}
if ((f==0)&&(l==0)&&(e==1)) //001
{
duty1=p*64;
set_power_pwm0_duty(duty1);
output_high(pin_b4);
}
else if ((f==1)&&(l==0)&&(e==1))
{
set_power_pwm0_duty(duty1=0x00);
}
}
}
Güç katında mosların sürümü yanlış olmuş dolayısı ile bu devre şemasını gerçekte çalıştıramazsın. (Protesusda herşey toz pembe)
Bu tip motorlar 0 ile max devir arasında herhangi bir devirde çalıştırılabilir. Dolayısı ile çalışma frekansı oldukça geniştir.
Ancak geniş devir aralığında kullanacaksan motor akımından da geribesleme gerekir.
Alıntı yapılan: z - 24 Eylül 2012, 01:51:50
Güç katında mosların sürümü yanlış olmuş dolayısı ile bu devre şemasını gerçekte çalıştıramazsın. (Protesusda herşey toz pembe)
Bu tip motorlar 0 ile max devir arasında herhangi bir devirde çalıştırılabilir. Dolayısı ile çalışma frekansı oldukça geniştir.
Ancak geniş devir aralığında kullanacaksan motor akımından da geribesleme gerekir.
Mosfetleri sürmedeki yanlışlık sürücü bir entegre veya transistör devresi kullanılmaması mı hocam?
Emetor yada source izleyici devrelerde çıkış voltajı giriş voltajından düşüktür. Şeması verilen devrede üst moslar bu yapıdadır. Bu durumda 5v dan mosların eşik voltajını çıkartırsak motor sargıları için geriye çok düşük voltaj kalır. Üstelik üst anahtarlar lineer bölgede kalırlar. Bu nedenlerle gerçek uygulamada çalışmaz.
Mosların önüne sürücü konmalı ya da eğer motor 5v ile beslenecekse hiç olmazsa üst moslar P tipine çevrilmeli.
sayın arkadaslar yukardakı sema temsilidir gercekde mos sürücüsü ve feedback devreye eklenecek vs vs ayrıntılar.
Kodlardan sonra asıl sürücüü devre için de epeyce kafa yormak gerekecek gibi duruyor...
Alıntı yapılan: pisayisi - 24 Eylül 2012, 10:39:36
Kodlardan sonra asıl sürücüü devre için de epeyce kafa yormak gerekecek gibi duruyor...
Amerikayi tekrar kesfetmeye gerek yok arkadaslar cikis kati 6 IGBT veya Moslu 3 faz cikis kati bunun icin nette bolca sema olmakla birlikte cesitli üreticilerin cok güzel programlari var kafa yormaniz gereken kisim bence yazilim arkadasimizda isin mantigini gösteren fikir vermesi acisindan bir program yazmis paylasmis Tesekürler
donanım olarak sahsen benı kasmaz full bıtırp uygulamaya gecdıgım gun vıdeo sunu yayınlarım asıl burda önemli nokta hızlı bır yazılım ve mcu gerisi tefferuattır.
---PWM ile hızı nasıl değiştiriyorsun onun ile ilgisi nedir?. Ben daha önce asenkron motor için bir program yazmıştım. Pwm ile motor akımını ayarlıyordum. Timer 1 ile hızı. Pwm ile hız değitirme mantığınız nedir öğrenebilirmiyim.
hocam ccsc de yeniyim "set_pwm1_duty(duty)" ile "set_power_pwm4_duty(duty3)" arasındaki fark ne anlayamadım teşekkürler
"
Alıntı yapılan: halilgalic - 24 Eylül 2012, 13:33:17
hocam ccsc de yeniyim "set_pwm1_duty(duty)" ile "set_power_pwm4_duty(duty3)" arasındaki fark ne anlayamadım teşekkürler
"
ilki her mikroişlemcide olan ccp modulundeki pwm nin duty_cycle nin ayarlama ikincisi ise bazı pic modellerinde bulunan 6 adet olan power pwm modülünün duty sini ayarlama
Alıntı yapılan: bulut_01 - 24 Eylül 2012, 12:50:23
donanım olarak sahsen benı kasmaz full bıtırp uygulamaya gecdıgım gun vıdeo sunu yayınlarım asıl burda önemli nokta hızlı bır yazılım ve mcu gerisi tefferuattır.
ufak BLDC Motorlar ve ufak gerilim ve akimlarla calisacaksaniz dediginizde haklisiniz
Elimde atıl bulunan mitsubishi power modül ile 2kw bi brushess motor için sürücü yaptım. Güç katı tasarımını çok rahatlatıyor. Sadece yazılım düşünüyorsunuz. Tavsiyem temin edebilirseniz hazır modül kullanmanız.
Alıntı yapılan: teknikelektronikci - 25 Eylül 2012, 09:58:37
ufak BLDC Motorlar ve ufak gerilim ve akimlarla calisacaksaniz dediginizde haklisiniz
hocam güç fark etmez ister 10 wattlık olsun ıster 10kw olsun yaparız evelallah para tek mesele ne kadar köfte o kadar ekmek elımde var bıtane 200 watt cıvarında blcd brus. motor bu hastanelerın gırıs camlı fotosellı kapısının motoru bu hayvan max kac rpm yapar sunu bılmiyorum bu motorların özellıgı surucu frekansınız artıgında onla beraber ters orantı olarak tork dusuyor ne kadar frekans o kadar dusen tork kucuk frekanslarda max tork alınıyor ornek 50 ıle 200 hz arası bıtırebılırsım zaman bulup burda yayınlarım pcb tasarımı ıle
Alıntı yapılan: bulut_01 - 25 Eylül 2012, 22:52:02
hocam güç fark etmez ister 10 wattlık olsun ıster 10kw olsun yaparız evelallah para tek mesele ne kadar köfte o kadar ekmek elımde var bıtane 200 watt cıvarında blcd brus. motor bu hastanelerın gırıs camlı fotosellı kapısının motoru bu hayvan max kac rpm yapar sunu bılmiyorum bu motorların özellıgı surucu frekansınız artıgında onla beraber ters orantı olarak tork dusuyor ne kadar frekans o kadar dusen tork kucuk frekanslarda max tork alınıyor ornek 50 ıle 200 hz arası bıtırebılırsım zaman bulup burda yayınlarım pcb tasarımı ıle
o zaman size bol sans ve basari ;)
yukaridaki yaziyi yazmamin sebebi kendim bire bir program ve pcb si ile ugrasmis olmasamda tecrübe ile sabitdir
Merhaba
Alıntı Yap
max kac rpm yapar sunu bılmiyorum bu motorların özellıgı surucu frekansınız artıgında onla beraber ters orantı olarak tork dusuyor ne kadar frekans o kadar dusen tork kucuk frekanslarda max tork alınıyor ornek 50 ıle 200 hz arası bıtırebılırsım zaman bulup burda yayınlarım pcb tasarımı ıle
Tork; hesaplanıp imal edildiği kutup sayısına göre ön görülen maksimum çalışma hızına kadar düşmez (belki %10 değişim) sabit kalır.(Ön görülen voltaj ve akım değerleri çerçevesinde) Bu hızın üzerindede çalışılabilir işte o zaman tork düşmeye başlar.
tor
Alıntı yapılan: salim ALTIN - 30 Eylül 2012, 09:33:45
Merhaba
Tork; hesaplanıp imal edildiği kutup sayısına göre ön görülen maksimum çalışma hızına kadar düşmez (belki %10 değişim) sabit kalır.(Ön görülen voltaj ve akım değerleri çerçevesinde) Bu hızın üzerindede çalışılabilir işte o zaman tork düşmeye başlar.
ben tork hız ıle duser yada artar demedım. ben torku yazılım ıle ayarlanıyor ve frekans artıkca tork dusuyor dedım.
yorumları takip ediyorum arkadaşlar esc çalışmaları nasıl gidiyor?? pcb çıkınca basalım testlerini yapayım benim motorlarla :))
tabi malzemeleri bulursak :P
İYİ geceler arkadaslar pcb + yazılım bitti projeye burda full olarak yayınlıyorum. pcb ilgili küçük bir kac not yazayım sürücü transıstorlerın oldugu beyaz yuvarlak uzerıne dırek fan monte edilebilir ve sogutucuya gerek yok devre 2 bagımsız besleme ıle calısmaktadır motor beslemesı 24 AC YADA DC ıle calışır. devrenın kontrol kısmınıda cep telefon sarj devresını kullanarak beslenmekdedır smps olarakda pcb uzerınde belirtmıs olup devre yazılım ve pcb ıle fulldur. pcb eksık yada hatalarım var ise yardımlarınızla duzeltırım devre 1 saatte çizdiğim için gözden kaçmıs yerler olabilir fark ettıysenınız uyarınız.devre küçük boyutta oldugu ıcın bıraz jumper bol bulunmaktadır. ;D
(http://b1210.hizliresim.com/12/2/dl4ly.png)
(http://b1210.hizliresim.com/12/2/dl4n0.png)
#include <18f1330.h>
#fuses INTRC_IO,NOWDT,NOMCLR
#use delay(clock=40M,oscillator=10M)
#use fast_io(a)
#use fast_io(b)
int16 duty1=0;
int16 duty2=0;
int16 duty3=0;
int16 p=40 ; // duty oranı (1-255)
int1 f=0;
int1 l=0;
int1 e=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_64|PWM_FREE_RUN,1,0,4095,0,1,0);
setup_adc_ports(NO_ANALOGS);
setup_adc( ADC_OFF );
set_tris_a(0b000000111);
set_tris_b(0x00);
while(1)
{
f=input(pin_a0);
l=input(pin_a1);
e=input(pin_a2);
if ((f==1)&&(l==0)&&(e==1)) //101
{
duty3=p*64;
set_power_pwm4_duty(duty3);
output_high(pin_b4);
}
else if ((f==1)&&(l==0)&&(e==0))
{
set_power_pwm4_duty(duty3*0);
output_low(pin_b4);
}
if ((f==1)&&(l==0)&&(e==0)) // 100
{
duty3=p*64;
set_power_pwm4_duty(duty3);
output_high(pin_b0);
}
else if ((f==1)&&(l==1)&&(e==0))
{
set_power_pwm4_duty(duty3*0);
}
delay_ms(1);
if ((f==1)&&(l==1)&&(e==0)) //110
{
duty2=p*64;
set_power_pwm2_duty(duty2);
}
else if ((f==0)&&(l==1)&&(e==0))
{
set_power_pwm2_duty(duty2*0);
output_low(pin_b0);
}
if ((f==0)&&(l==1)&&(e==0)) //010
{
duty2=p*64;
set_power_pwm2_duty(duty2);
output_high(pin_b6);
}
else if ((f==0)&&(l==1)&&(e==1))
{
set_power_pwm2_duty(duty2*0);
}
if ((f==0)&&(l==1)&&(e==1)) //011
{
duty1=p*64;
set_power_pwm0_duty(duty1);
}
else if ((f==0)&&(l==0)&&(e==1))
{
set_power_pwm0_duty(duty1*0);
output_low(pin_b6);
}
if ((f==0)&&(l==0)&&(e==1)) //001
{
duty1=p*64;
set_power_pwm0_duty(duty1);
output_high(pin_b4);
}
else if ((f==1)&&(l==0)&&(e==1))
{
set_power_pwm0_duty(duty1=0x00);
}
}
}
mesaj birleştirme:: 02 Ekim 2012, 10:38:26
bir küçük not daha sarj agletı smps kucuk bir operasyonla 18 vdc cevrilip sisteme veriliyor.
Şemada sıkıntı yok pcb de otomatik modda çizildi sanırım, devre tıkır tıkır çalışır ;D :Jumper evet fazla olmuş bu ancak lehimleme sırasında offf dedirtir insana... Bu arada motor hall sensor mu kullanıyor geribesleme bilgisi olarak?
aynen hall sensor var pisayısı bende bıtane 200 watt cıvarında hayvan var onu bu sürücüyle koşturacam bakalım kaç nala koşacak ;D
18f1330 pwm çıkışlarına deadtime ölü zaman eklemesi yapıyor mu yoksa hall bilgisine göre çıkışlar anlık mı değişiyor, seçilen pwm frekansı nedir? bunların hepsi performansı belirleyecek etkenler tabii...
hall gelen bilgiye göre anlık pwm degişiyor frekans sabit artırdıgımız zaman tork düşüyor ters orantılı frekans ıle tork yazılımda hız ve tork bılgılerı kodda gömülü hız ve tork bilgileri pic yeniden deger atanarak yapılıyor ben demo seklinde yazdım kodu bir buton ıle yada pot ıle hız ve tork ayarlamak ıcın ufak kod parcası eklemem lazım benım amacım bendekı motor max kac rpm yapar görmek bide dead time sabit %0 dır.
Tebrik ederim ...
Alıntı yapılan: graski - 02 Ekim 2012, 17:08:16
Tebrik ederim ...
eyw arkadasım bu uygulamayı zaman buldukca geliştireceğim.
Alıntı yapılan: bulut_01 - 02 Ekim 2012, 18:36:15
eyw arkadasım bu uygulamayı zaman buldukca geliştireceğim.
çok başarılı ilk fırsatta karttan basıp deneyeceğim
hocam bunun malzeme ücreti nedir acaba hiç hesapladınızmı
elinize emeğinize sağlık
60 ile 70 TL civarı tutar sanırım.
Naçizane bir öneri;
f;l;e için ayrı ayrı değişkenler tanımlamak yerine, 1 değişken tanımlayıp
0. bit f,
1. bit l,
2. bit e,
şeklinde atayabilirsiniz ve daha sonra direkt bu değişken üzerinden select case yapabilirsiniz, bu sayede her if+else if ile 6 karşılaştırma yapmaktan kurtulursunuz ve size ciddi hız sağlar.
set_power_pwm2_duty(duty2*0); burada 0 ile çarpma işleminin özel bir sebebi var mı, direkt sıfır yazmak ile aynı sonuca çıkacak ve gereksiz bir işlem ortadan kalkacak...
önerin dikkate alacagım case komutu kullanacakdım ama neden vaz gecdım bılmıyorum 0 carpamk okanalı sıfırlamak carpmak mcu yorarsa da dırek sıfrlarım
Bi öneride benden gelsin A0-B2-B3 pinleri interrupt olarak ayarlanabiliyor. Hall efectleri bu pinlere bağlayıp kesmeleri aktif edersen ve 3 pini okuyup 1 değişkene kaydedip bu kaydettiğin değerle bir tablo üzerinden pwm pozisyonlarını vermen daha güzel olur. Bu sayede main içersinde başka işler yaptırabilirsin.
sayın arkadaslar temel benden geliştrip güzel devre olacagına inanıyorum önerilerizi bekliyorum pcb hakkında yorum yok begendininiz sanırım :)
iyi aksamlar bu devredeyi arkadasların önerısıne uyarak daha fazla hız kazanmak ıcın kodda degısıklık yapdım yanlız bldc motor hall sensörlerınden aldıgım (101-100-110--010-011-001) bilgileri devamlı oldugu ıcın kodda devamlı kesmeye gidiyor ve kod switch satırına dallanmıyor. devamlı kesmede kaldıgı ıcın sorum şu şekilde kesme sürekli oldugu ıcın switch nasıl dallandırırım ?
#include <18f1330.h>
#fuses INTRC_IO,NOWDT,NOMCLR
#use delay(clock=40M,oscillator=10M)
#use fast_io(a)
#use fast_io(b)
int8 x ;
int16 duty1=0;
int16 duty2=0;
int16 duty3=0;
int16 p=50 ;
#int_RB
void RB_kesme ()
{
x=0;
if(input(pin_a1 ))
x=x+1;
if(input(pin_B2 ))
x=x+2;
if(input(pin_B3 ))
x=x+4;
disable_interrupts (int_RB);
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:
set_power_pwm0_duty(duty1=0x00);
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 ;
}
}
void main()
{
setup_power_pwm_pins(PWM_odd_on,PWM_odd_on,PWM_odd_on,PWM_odd_on);
setup_power_pwm(PWM_CLOCK_DIV_64|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)
{
}
}
disable_interrupts (int_RB); kısmını kesmeye girdiğiniz gibi yazsanız. Çalışmasını pek bilimyorum ama ilk bakışta bu geldi aklıma.
Alıntı yapılan: fryrmnd - 07 Ekim 2012, 22:21:43
disable_interrupts (int_RB); kısmını kesmeye girdiğiniz gibi yazsanız. Çalışmasını pek bilimyorum ama ilk bakışta bu geldi aklıma.
kesmeye girdiği gibi derken ne demek istedin anlamadım acık yazarsan ?
şimdi yanlış anlamadıysam
void RB_kesme ()
{
x=0;
if(input(pin_a1 ))
x=x+1;
if(input(pin_B2 ))
x=x+2;
if(input(pin_B3 ))
x=x+4;
disable_interrupts (int_RB);
kısmında
void RB_kesme ()
{
den sonra switch case e kadar olan kısımda kesme geliyor olabilir. O yüzden kesmeleri
void RB_kesme ()
dan sonra pasif (disable_interrupts (int_RB);
) yapabilirsin.
yani kesme rutinine hemen girdiğinde.
yanlışım da olabilir tabii.
hocam bu rb kesmesi düşündüğünüz kadar hızlı cevap vermiyor.Bence bundan vazgeçin.
yok illa bunu kullanacam diyorsanız disable_interrupts(int_rb) satırını direk interrupta girdiğinizde yazın.Ama göreceksinizki kaçıracak ve performans alamayacaksınız.İnterruptın sonundada enable yazıp interruptı bitirin
evt arkadaslar bu kesme algoritması kosunda fikirlerinizi bekliyorum.
mesaj birleştirme:: 07 Ekim 2012, 23:38:26
şuanda kod calısıyor sadece pıc ılk enerjı anında kesme olusdugu ıcın ılk anda calısmıyor ben hall gelen ucları swich ıle verdıgımde proteus ile similasyonda sınyalleri pıc calısıyor motor. ılk an pıc enerjılendıgı an kesmeden cıkıp swıch dallanmaması tek sorunum kodun son hali:
#include <18f1330.h>
#fuses INTRC_IO,NOWDT,NOMCLR
#use delay(clock=40M,oscillator=10M)
#use fast_io(a)
#use fast_io(b)
int8 x ;
int16 duty1=0;
int16 duty2=0;
int16 duty3=0;
int16 p=250 ;
#int_RB
void RB_kesme ()
{
disable_interrupts (int_RB);
x=0;
if(input(pin_a1 ))
x=x+1;
if(input(pin_B2 ))
x=x+2;
if(input(pin_B3 ))
x=x+4;
enable_interrupts (int_RB);
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:
set_power_pwm0_duty(duty1=0x00);
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 ;
}
}
void main()
{
setup_power_pwm_pins(PWM_odd_on,PWM_odd_on,PWM_odd_on,PWM_odd_on);
setup_power_pwm(PWM_CLOCK_DIV_64|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)
{
}
}
Case bloğunda ki kod çok verimsiz..
Case kısmındaki kod tamamen kaldırılıp, yerine elektriksel döngünün 6 farklı durumu için hangi PWM kanallarının aktif olması gerektiği OVDCOND registerine göre yazılıp, bir diziye atılır. Devrenize göre de OVDCONS = 0x00 olmalı..
Sensörden okunan 3 bit den oluşturulacak bir sayı bu dizinin indisi olarak kullanılıp bütün case bloğunun yerine 1-2 clock harcayarak PWM kanalı anahtarlaması IC kesmesinde yapılır.
Bunun dışında akım , hız, hızlanma gibi olmazsa olmaz kontroller eksik..
Alıntı yapılan: iyildirim - 08 Ekim 2012, 00:24:24
Case bloğunda ki kod çok verimsiz..
Case kısmındaki kod tamamen kaldırılıp, yerine elektriksel döngünün 6 farklı durumu için hangi PWM kanallarının aktif olması gerektiği OVDCOND registerine göre yazılıp, bir diziye atılır. Devrenize göre de OVDCONS = 0x00 olmalı..
Sensörden okunan 3 bit den oluşturulacak bir sayı bu dizinin indisi olarak kullanılıp bütün case bloğunun yerine 1-2 clock harcayarak PWM kanalı anahtarlaması IC kesmesinde yapılır.
Bunun dışında akım , hız, hızlanma gibi olmazsa olmaz kontroller eksik..
dediklerine göre bir algoritma olusturursanız ve dedıgınız register kullanarak bi kod örnediği yazarsanız bu devreye baya katkınız olur.
Sensörün hangi konumunda hangi PWM kanallarının aktif olacağını hazırlarsan olur..
tabi
sensör bilgisi
101 (set_power_pwm4_duty) output_high(pin_b4)
100 (set_power_pwm4_duty) output_high(pin_b0)
110 (set_power_pwm2_duty) output_high(pin_b0)
010 (set_power_pwm2_duty) output_high(pin_b6)
011 (set_power_pwm0_duty) output_high(pin_b6)
001 (set_power_pwm0_duty) output_high(pin_b4)
tablo yukardekı gıbıdır her 3 bitlik veriden sonra önceki pwm kanalı sıfırlanmalıdır.
Global değişken olarak tanımlanacaklar..
char OvrArr[8], IOBArr[8];
Main içinde ana döngüden önce ;
//101 (set_power_pwm4_duty) output_high(pin_b4)
OvrArr[0b00000101] = 0b00010000;
IOBArr[0b00000101] = 0b00010000;
//100 (set_power_pwm4_duty) output_high(pin_b0)
OvrArr[0b00000100] = 0b00010000;
IOBArr[0b00000100] = 0b00000001;
//110 (set_power_pwm2_duty) output_high(pin_b0)
OvrArr[0b00000110] = 0b00000100;
IOBArr[0b00000110] = 0b00000001;
//010 (set_power_pwm2_duty) output_high(pin_b6)
OvrArr[0b00000010] = 0b00000100;
IOBArr[0b00000010] = 0b01000000;
//011 (set_power_pwm0_duty) output_high(pin_b6)
OvrArr[0b00000011] = 0b00000001;
IOBArr[0b00000011] = 0b01000000;
//001 (set_power_pwm0_duty) output_high(pin_b4)
OvrArr[0b00000001] = 0b00000001;
IOBArr[0b00000001] = 0b00010000;
OVDCONS = 0x00;
Kesme içinde;
Switch(x) bloku komple silinip yerine;
OVDCOND = OvrArr[x];
PORTB = IOBArr[x];
değişikliklerini yapınca söylemiş olduğum mantık ile çalışıyor olacak..
http://ww1.microchip.com/downloads/en/DeviceDoc/39758D.pdf (http://ww1.microchip.com/downloads/en/DeviceDoc/39758D.pdf)
datasheetin sf:140 sayfasında detaylıca anlatılıyor..
Duty' yi herhangi bir yerde ayarlayabilirsiniz. Örneğin bir pota veya okunan bir bilgiye bağlı olarak hız ayarlanabilir.
Eğer motorun sabit bir devirde dönmesi isteniyorsa kesmeden çıkarken bir timer kurup, kesmeye tekrar girdiğinde geçen süreye göre deviri hesaplayabilir ve duty ile oynayarak ayarlayabilirsiniz.
suanda pc kapattım tel giiriyorım yarın bakarım koda ilginc komut ilk defa böle komut setı gordum pekı yazılımla frekans degıstırerek tork ayarıda yapsak guzel olmazmıydı?
Frekans, PWM frekansı ise verimlilikle ilgili.. Modeller için satilan BLDC motorların çoğu için 8khz lik bir frekans öneriliyor.
Tork ile devir ilişkili. Motor yüklenince ister istemez devri düşecek. Tork fazla olunca devir artacak. Bu da iki kesme arasındaki süreden anlaşılır. Devir düşüyorsa PWM duty uygun bir kontrol kullanılarak arttırılır. Değişken yük altında istenen devir sabit tutulabiliyorsa motor zaten uygun tork ile çalışıyordur.
yıldırım kardesım 8 khz yuksek frekans bu frekans motor yukdeyken hıc dönecegı sanmıyorum dusuk frekans yuksek tork alınıyor örnek 20 hz max tork gıbı frekans ıle tork ters orantılı olarak calısıyor.
8Khz = PWM frekansı
tamam frekans deyince bende pwm frekans diyorum 8 khz bldc motor ıcın yuksek frekans bu frekans pwmde tork çok dusecek kanısındayım.
Alıntı yapılan: bulut_01 - 08 Ekim 2012, 11:52:20
tamam frekans deyince bende pwm frekans diyorum 8 khz bldc motor ıcın yuksek frekans bu frekans pwmde tork çok dusecek kanısındayım.
siz kac ile sürüyorsunuz ?
max tork ıcın 20 hz civarı.
Hocam bence bi yanlışınız var 20hz çok düşük bi rakam.. Bi frekans metre yada scop ile pwm sinyalinin frekansını ölçün. En olmadı mevcut osc ayarlarını isis te uygulayıp pinin birinden %50 pwm çıkarıp frekansı ölçün. Ben 2 kw motoru 10-14 khz aralığında sürüyorum.
Farklı frekanslardan bahsediliyor gibime geliyor.
kesinlikle arkadasin bahsetigi frekans farkli frekans osilaskopda farkli ölcmüs olsa insan yazdigi programdan bilir
siz bu devrenizi programinizi gercek hayatta denedinizmi ?
efe kardesım ben proteusda sımılasyona göre konusuyorum frekans artıgında pwm in motor kalkıs tork dusuyor frekans dustukde motor kalkıs tork artıyr ben similasyon sonuclarına görre konusdum
Yaa iş proteusa kaldıysa sıfır hertz de bile motoru döndürcek. Gerçek devreyi kurup uygulamaya başladığınızda orda oluşabilcek sıkıntıları paylaşmak daha sağlıklı olacaktır. 20 hz gibi bir pwm frekansı olmaz olsa olsa blok komutasyonda oluşan toplam faz dalgasının frekansıdır o...
Alıntı yapılan: pisayisi - 08 Ekim 2012, 19:11:52
Yaa iş proteusa kaldıysa sıfır hertz de bile motoru döndürcek. Gerçek devreyi kurup uygulamaya başladığınızda orda oluşabilcek sıkıntıları paylaşmak daha sağlıklı olacaktır. 20 hz gibi bir pwm frekansı olmaz olsa olsa blok komutasyonda oluşan toplam faz dalgasının frekansıdır o...
yaw ben kendimi anlatamıyorum. diyorumkı bu bldc denen zımbırtı motor kac khzde yada hangı frekansda calısır ? bunun yanıtını bulamadımkı kodu rotasını o yöne çeviriyim arkadas demıs yukarda 8 khz o zaman ben f1330 hayvanı PLL özgür bırakıyım 8 khz degılde katalogunda 1023 hz frekans cıkabılırdıye bılıyorum PLL aktıfken pic 40 mhz kadar dahılı osc cıkamıyor diye biliyorum 32/4 = 8 mhz calısma hızımdan max 1 khz mı neydı katalogunda öncelıkle bu motor denen zımbırtı kac herz ÇALIŞIR?
efektif sinyalin frekansı, PWM frekansı ve PWM güncelleme frekansları karışmış durumda
sanırım bu (PWM)modülasyonu kendiniz oluşturuyor sanıyorsunuz
bunları tek tek ele almak lazım
(http://www.infolytica.com/en/applications/ex0145/Line%20crrent.jpg)
(http://gearmotorblog.files.wordpress.com/2010/11/sensorless_blog_back-emf_11-15-2010mbm-crop.jpg)
yıldırım arkadasımızın yayınladıgı kod ben derleyemedım burda hata nerdedir sizce ?
#include <18f1330.h>
#fuses INTRC_IO,NOWDT,NOMCLR
#use delay(clock=40M,oscillator=10M)
#use fast_io(a)
#use fast_io(b)
char OvrArr[8], IOBArr[8];
#int_RB
void RB_kesme ()
{
OVDCOND = OvrArr[x];
PORTB = IOBArr[x];
}
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);
clear_interrupt(INT_EXT);
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL);
enable_interrupts(int_RB);
//101 (set_power_pwm4_duty) output_high(pin_b4)
OvrArr[0b00000101] = 0b00010000;
IOBArr[0b00000101] = 0b00010000;
//100 (set_power_pwm4_duty) output_high(pin_b0)
OvrArr[0b00000100] = 0b00010000;
IOBArr[0b00000100] = 0b00000001;
//110 (set_power_pwm2_duty) output_high(pin_b0)
OvrArr[0b00000110] = 0b00000100;
IOBArr[0b00000110] = 0b00000001;
//010 (set_power_pwm2_duty) output_high(pin_b6)
OvrArr[0b00000010] = 0b00000100;
IOBArr[0b00000010] = 0b01000000;
//011 (set_power_pwm0_duty) output_high(pin_b6)
OvrArr[0b00000011] = 0b00000001;
IOBArr[0b00000011] = 0b01000000;
//001 (set_power_pwm0_duty) output_high(pin_b4)
OvrArr[0b00000001] = 0b00000001;
IOBArr[0b00000001] = 0b00010000;
OVDCONS = 0x00 ;
while(TRUE)
{
}
}
Bir de bunu inceleyin
http://www.servomagazine.com/downloads.php (http://www.servomagazine.com/downloads.php)
February 2009
BLDC Driver program & PCB file
Bldc driver ı ccsc ye çevirebilirmisiniz veya derleyip hex ve cof dosyasini yukleyebilirmisiniz
http://www.scorpionsystem.com/catalog/motors/s30_series_v2/SII-3008-1090KV/ (http://www.scorpionsystem.com/catalog/motors/s30_series_v2/SII-3008-1090KV/)
Motor Timing 5deg
Drive Frequency 8kHz
benim bugüne dek kullandıklarımın hepsi 8khz idi
çalışmalarınızda başarılar dilerim.