2016-04-28 40 views
1

我想在Atmega 16控制器的幫助下使用L6234驅動器IC驅動BlDC電機。驅動電機的邏輯在第9頁的電機驅動器IC L6234數據表中給出。以下是link for datasheet。所以,根據數據表,我寫了一個代碼來驅動我的電機。這是我的代碼: -無法使用帶ATmega16的L6234運行BLDC電機

#define F_CPU 8000000UL 
#include<avr/io.h> 
#include<avr/interrupt.h> 
#include<util/delay.h> 

#define hall1 (PINC & 1<<1) // connect hall sensor1 
#define hall2 (PINC & 1<<2) //connect hall sensor2 
#define hall3 (PINC & 1<<3) //connect hall sensor3 



void main() 
{ 
    DDRC=0XF0; 
    DDRB=0XFF; //output as In1=PB.0 ,In2=PB.1, In3=PB.2, En0=PB.3 ,En1=PB.4, En3=PB.5 
    while(1) 
    { 
     if((hall3==4)&(hall2==0)&(hall1==1)) // step1 
      { 
      PORTB=0X19; 
      } 

     if((hall3==0)&(hall2==0)&(hall1==1)) // step2 
      { 
      PORTB=0X29; 
      } 

     if((hall3==0)&(hall2==2)&(hall1==1)) // step3 
      { 
      PORTB=0X33; 
      } 

     if((hall3==0)&(hall2==2)&(hall1==0)) // step4 
      { 
      PORTB=0X1E; 
      } 

     if((hall3==4)&(hall2==2)&(hall1==0))// step5 
      { 
      PORTB=0X2E; 
      } 

     if((hall3==4)&(hall2==0)&(hall1==0))// step6 
      { 
      PORTB=0X34; 
      } 
    } 
} 

但是,當我運行此代碼時,我的電機不工作。所以,任何人都可以告訴我,我的代碼中的錯誤在哪裏。

回答

0

您的代碼的格式使它很難調試。既然你已經在使用宏,我可以提出一些建議讓它更容易閱讀嗎?

你有#define hall3 (PINC & 1<<3),但是這個值需要是4或0.爲什麼不把它用作布爾值?

if(hall3 && etc) // note the double && 

馬上,這將修復一個錯誤。 1<<38而不是4,所以if語句在編寫代碼時都不會成功。 (例如,1是1 < < 0而不是1 < < 1)

PORTB硬編碼輸出也很難破譯。我建議使用#defines來使這更容易。

#define EN1 3 
#define EN2 4 
#define EN3 5 
#define IN1 0 
#define IN2 1 
#define IN3 2 

... 
    PORTB = 1<<EN1 | 1<<EN2 | 1<<IN1; // step 1 
+0

我試試這個代碼,但工作不正常電機我們可以驅動這個電機驅動器L6234與PWM幫助 –

+0

看一看這個[示例](http://www.atmel.com/images/AVR443。 zip)來自Atmel。它運行驅動程序並使用PWM控制。 – UncleO

相關問題