BLDC motorun hızını ölçmek ve motorun hızını ayarlamak

Başlatan mustafa_cmbz, 23 Aralık 2014, 13:37:55

mustafa_cmbz

Merhabalar..
Uzun uğraşlar sonucunda bldc motoru yavaş bir şekilde de olsa bekleme komutları ile hızını arttırıp azalttırarak kontrol edebiliyorum.

Fakat şimdi istenen ise tuşlardan girilen devir sayısına kadar motorun hızını arttırmak ve bu hıza sabitlemek.

Bunun için nasıl bir yol izlemeliyim acaba kafam iyice karıştı.

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2014 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 14.12.2014                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
' select MCU and clock speed
Device = 18F452
Xtal=20
  'XTAL=4   
   Config_Start
   OSC   = HS ; XT
   OSCS  = OFF ; Disabled
   PWRT  = On ; Enabled
   
   BOR   = OFF ; Disabled
   WDT   = OFF ; Disabled
   STVR  = OFF ; Disabled
   LVP   = OFF ; Disabled
   CP0   = OFF ; Disabled
   CP1   = OFF ; Disabled
   CP2   = OFF ; Disabled
   CP3   = OFF ; Disabled
   CPB   = OFF ; Disabled
   CPD   = OFF ; Disabled
   
   WRT0  = OFF ; Disabled
   WRT1  = OFF ; Disabled
   WRT2  = OFF ; Disabled
   WRT3  = OFF ; Disabled
   WRTB  = OFF ; Disabled
   WRTC  = OFF ; Disabled
   WRTD  = OFF ; Disabled
   EBTR0 = OFF ; Disabled
   EBTR1 = OFF ; Disabled
   EBTR2 = OFF ; Disabled
   EBTR3 = OFF ; Disabled
   EBTRB = OFF ; Disabled
   Config_End
All_Digital=On
TRISA = 0
TRISB = 0

TRISD = 0 
TRISE = 0

PORTB=0
PORTA=0

PORTD=0
PORTE=0

 Declare CCP1_Pin PORTC.2 
 Declare CCP2_Pin PORTC.1 
 CCP1CON = %00001100

 Declare LCD_DTPin PORTC.4
 Declare LCD_RSPin PORTB.5
 Declare LCD_ENPin PORTB.3

 
Symbol HARICI_M_PWR_PWM_TETIK   = PORTD.1
Symbol ORTAK_M_PWR_PWM_TETIK    = PORTD.2                                    
 
Symbol LCD_LED            = PORTD.3 
Symbol MOTOR_PWR_PWM      = PORTC.1
Symbol SURUCU_PWM         = PORTC.2 


Symbol A1                 = PORTA.5
Symbol A0                 = PORTE.0
Symbol B1                 = PORTE.2 
Symbol B0                 = PORTE.1
Symbol C1                 = PORTC.3
Symbol C0                 = PORTD.0

Symbol YON_TUS            = PORTA.0
Symbol STOP_TUS           = PORTA.1
Symbol DWN_TUS            = PORTA.2
Symbol UP_TUS             = PORTA.3


Output A1                
Output A0                
Output B1                 
Output B0                 
Output C1                 
Output C0

Output MOTOR_PWR_PWM     
Output SURUCU_PWM        
 
Low A1                
Low A0                
Low B1                 
Low B0                 
Low C1                 
Low C0


Input YON_TUS            
Input STOP_TUS        
Input DWN_TUS          
Input UP_TUS 


Symbol USB_BAGLANTISI     = PORTC.0
Symbol BUZZER             = PORTB.4


Dim DEVIR As Word 'degiskenler atanir
Dim HIZ   As Word                   
Dim SAYAC As Word 
HIZ = 0
DEVIR=0
SAYAC=0





Dim A          As Word 
A=0
Dim LCD_DUTY   As Byte 
LCD_DUTY=0  
Dim BEKLEME    As Word 
BEKLEME=100
GoSub LCD_LED_YAK 
GoSub SURUCULERE_PWM
GoSub MOTOR_PWRA_PWM

High HARICI_M_PWR_PWM_TETIK      ' p kanal fet olduğu için yalıtımda olması için ( enerji kesilmesi için ) 1 verilmesi gerekiyor.






DelayMS 200 : Cls : GoSub BEEP 
 
BASLA:                  
Print At 2,1,"    HAKAN   "
Print At 3,1,"    CANDAN  "
DelayMS 2000 : Cls : GoSub BEEP 
Print At 2,1,"     BLDC      "
Print At 3,1," MOTOR KONTROL "
DelayMS 2000 : Cls : GoSub BEEP 

YON_SEC_SAG_LCD:
Print At 2,1," >  SAG"
Print At 3,1,"    SOL"

YON_SEC_SAG:

 If     STOP_TUS  = 1 Then        ' SISTEM SAATI AYARI MENUSUNE GIRIS
 While  STOP_TUS  = 1 
 Wend 
 Cls : GoSub BEEP : DelayMS 100 :GoSub MOTOR_STOP_ET : GoTo MOTOR_SAG_CALIS
 EndIf 
 
 
If DWN_TUS=1 Then YON_SEC_SOL_LCD
GoTo YON_SEC_SAG  

YON_SEC_SOL_LCD:
Print At 2,1,"    SAG"
Print At 3,1," >  SOL"

YON_SEC_SOL:

 If     STOP_TUS  = 1 Then        ' SISTEM SAATI AYARI MENUSUNE GIRIS
 While  STOP_TUS  = 1 
 Wend 
 Cls : GoSub BEEP : DelayMS 100 : GoSub MOTOR_STOP_ET : GoTo MOTOR_SOL_CALIS
 EndIf 

If UP_TUS=1 Then YON_SEC_SAG_LCD
GoTo YON_SEC_SOL 





 MOTOR_SAG_CALIS:
 Print At 2,2,  " RPM: " ,Dec4 DEVIR
 Print At 3,2,  " HIZ SEViYESi: ",Dec4 BEKLEME 
 
 DEVIR = PulsIn PORTB.0,300  
 
 If UP_TUS  = 1 And BEKLEME < 10000 Then BEKLEME=BEKLEME+1  
 If DWN_TUS = 1 And BEKLEME > 2   Then BEKLEME=BEKLEME-1  
 
 If     STOP_TUS  = 1 Then        ' SISTEM SAATI AYARI MENUSUNE GIRIS
 While  STOP_TUS  = 1 
 Wend 
 Cls : GoSub BEEP : DelayMS 100 : GoSub MOTOR_STOP_ET : GoTo YON_SEC_SAG_LCD
 EndIf  
 
 DelayMS BEKLEME
 A1=0 : A0=0 : B1=0 : B0=1 : C1=1 : C0=0   ' 1 ADIM  
 DelayMS BEKLEME 
 A1=1 : A0=0 : B1=0 : B0=1 : C1=0 : C0=0   ' 2 ADIM    
 DelayMS BEKLEME
 A1=1 : A0=0 : B1=0 : B0=0 : C1=0 : C0=1   ' 3 ADIM
 DelayMS BEKLEME
 A1=0 : A0=0 : B1=1 : B0=0 : C1=0 : C0=1   ' 4 ADIM
 DelayMS BEKLEME
 A1=0 : A0=1 : B1=1 : B0=0 : C1=0 : C0=0   ' 5 ADIM    
 DelayMS BEKLEME
 A1=0 : A0=1 : B1=0 : B0=0 : C1=1 : C0=0   ' 6 ADIM
 GoTo MOTOR_SAG_CALIS
 
 
 MOTOR_SOL_CALIS:
 Print At 2,2,  " RPM: ",Dec4 DEVIR
 Print At 3,2,  " HIZ SEViYESi: ",Dec4 BEKLEME  
 DEVIR = PulsIn PORTB.0,300 
 If UP_TUS  = 1 And BEKLEME < 10000 Then BEKLEME=BEKLEME+1  
 If DWN_TUS = 1 And BEKLEME > 2   Then BEKLEME=BEKLEME-1  
 
 If     STOP_TUS  = 1 Then        ' SISTEM SAATI AYARI MENUSUNE GIRIS
 While  STOP_TUS  = 1 
 Wend 
 Cls : GoSub BEEP : DelayMS 100 :GoSub MOTOR_STOP_ET : GoTo YON_SEC_SOL_LCD
 EndIf
 
 DelayMS BEKLEME
 A1=0 : A0=0 : B1=0 : B0=1 : C1=1 : C0=0   ' 1 ADIM  
 DelayMS BEKLEME
 A1=1 : A0=0 : B1=0 : B0=1 : C1=0 : C0=0   ' 2 ADIM    
 DelayMS BEKLEME
 A1=1 : A0=0 : B1=0 : B0=0 : C1=0 : C0=1   ' 3 ADIM
 DelayMS BEKLEME
 A1=0 : A0=0 : B1=1 : B0=0 : C1=0 : C0=1   ' 4 ADIM
 DelayMS BEKLEME
 A1=0 : A0=1 : B1=1 : B0=0 : C1=0 : C0=0   ' 5 ADIM    
 DelayMS BEKLEME
 A1=0 : A0=1 : B1=0 : B0=0 : C1=1 : C0=0   ' 6 ADIM

 GoTo MOTOR_SOL_CALIS
 




'*******************************
 
LCD_LED_YAK:
High LCD_LED
Return 
'*********

'*******************
BEEP:
High BUZZER
DelayMS 50
Low BUZZER 
DelayMS 17
High BUZZER
DelayMS 50
Low BUZZER 
DelayMS 40 
High BUZZER
DelayMS 35
Low BUZZER 
DelayMS 25
Return  



SURUCULERE_PWM:
DelayMS 100
HPWM 1 ,250,4000
DelayMS 100
Return 

MOTOR_PWRA_PWM:
DelayMS 100
HPWM 2,250,4000
DelayMS 100
Return  
 
MOTOR_STOP_ET:
A1=0 : A0=0 : B1=0 : B0=0 : C1=0 : C0=0   ' MOTOR STOP
DelayMS 300
Return



sadece motor hızını ayarlayabildiğim kod burada buna nasıl bir eklenti yaparak motor hızını ölçebilirim ? öyle çok hassas birşey olması da gerekmiyor motor artınca ekrandaki hız değeri artsın yavaşlayınca bu deger düşsün gerisini ben hallederim.

ohacagatay

merhaba,
kodunu okumadım, şematiğini koymamışsın ama sanıyorum ki sensor olamayan bldc motor hız kontrolü yapmak istiyorsunş. BLDC uygulamalarında sensör olmayınca  BACK EMF ölçüldükten ( current shunt kullanılarak ) sonra PID/PI kontrollör uygulanarak yapılmakta. Open loop kontrolle başlayıp sonradan gerekli hıza ulaşılca closed cloopa dönen uygulamalar da var. Sensorless BLDC motor control diye google'dan atırsan geniş bir dökümantasyon bulabilirsin nerdeyse her yarı iletken üreticisinin bu konuyla ilgili bir application dökümanı var. Genelde kodlar flow chart şeklinde verilir sen bunu kendi yazdığın programlama diline çevirirsin
umarım yardımı dokunur
Some people believe çiğ köfte is a matter of life and death, I am very disappointed with that attitude. I can assure you it is much, much more important than that

Kabil ATICI

 DelayMS BEKLEME
A1=0 : A0=0 : B1=0 : B0=1 : C1=1 : C0=0   ' 1 ADIM 
DelayMS BEKLEME
A1=1 : A0=0 : B1=0 : B0=1 : C1=0 : C0=0   ' 2 ADIM   
DelayMS BEKLEME
A1=1 : A0=0 : B1=0 : B0=0 : C1=0 : C0=1   ' 3 ADIM
DelayMS BEKLEME
A1=0 : A0=0 : B1=1 : B0=0 : C1=0 : C0=1   ' 4 ADIM
DelayMS BEKLEME
A1=0 : A0=1 : B1=1 : B0=0 : C1=0 : C0=0   ' 5 ADIM   
DelayMS BEKLEME
A1=0 : A0=1 : B1=0 : B0=0 : C1=1 : C0=0   ' 6 ADIM
motor çalışma hızınızı üç aşağı beş yukarı
DelayMS BEKLEME satırı belirliyor.
bir işlem için 6 kez çağırdınızdan bunları toplarsanız işlemci içinde kaç adımda kontrol etteğinizi görürsünüz. Buradaki nokta motor 1 tam devrini bunlardan kaç tanesi ile tamamlıyor.

Motor tıck açısı yani. 1 devir için kaç tık ile tamalıyorsa BEKLEMExtık oluyor. elde edeceğin 1 devir için.
basit bir oran orantı ile 1 saniyede kaç kez döndüğünü ve 1 dakikada kaç kez döndüğüğü hesaplamak gerekiyor.

Buradaki eksik motor 1 tam devir dönmesi için
DelayMS BEKLEME
kaç kez işlem yaptığı...
ambar7

mustafa_cmbz

Peki şöyle birşey yapamazmıyız.Arkadaşın hocası biraz kıl bir hoca ve bundan dolayı şöyle bir şey istediğinden bahsedildi.

Motor dönüş esnasında elimizle motorun milini tutarsak motor dönüş hızı düşeceği için ekranda devir dk olayınında düşmesini görmeyi istiyormuş.Normal şartlarda bu tarz bir motorun bu şekilde dışarıdan bir müdahaleye maruz kalması zaten saçma ama kolay bir şekilde yapılabilirliği varsa yapıp kurtulalım istiyoruz.

Bunu yapabilmek için protondaki pulsın ve counter komutlarını kullanmak istiyorum fakat bu kez de motor dönüşünü beklemeden dolayı etkiliyor.



Kabil ATICI

Bu işi geri besleme yapmadan nasıl olacakmış?
Encodersiz olmaz.  DC motorlarda akım kesilmesi bir şekilde sayılarak yapılabiliyor. Ama bu motorlarda nasıl yapılır bilemem.
O hocanın yaptığı şey ancak dc motorlarda olur. Programı yanlış okumadıysam 3 faz motor gibi bir şey bu.
Eğer hoca onu yaparsa motor adım kaçırır . Hıza göre adımları da konrol etmek gerekir ki, bu işlemci için biraz zor.

Ek:Hızı ve adımları kontrol edebilecek kapasitede bir şey isteniyorsa, bildiğim kadarı ile bunu pic24 serisi altındakiler biraz zor...
ambar7

z

Bu motorlar da DC motorlar gibi kontrol edilebilir. Zaten bu motorların DC motorlardan hiç farkı yoktur. Sadece fırca komutator yerine elektronık komutator bulunmaktadır.

DC motora nasıl encoder bağlayıp pozisyonu kontrol edebiliyorak bu motorda da hızı ve pozisyonu denetleyebiliriz.

Ama kodlar böyle delayle falan olmaz.

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

triyak

Motora adım attırırken  motorun sadece 2 uçunu kullanıp 1 uçunu boşta bırakıyoruz ya, ha işte o boş kalan uçtan gelen sinyali işleyip motorun devrini hesaplayabiliriz.