A3992學習記錄

ATmega64+A3992驅動步進電機

//ATmega 64a 電機驅動板程序
//編譯環境 AVR Studio 4.17/AVR GCC
//系統外部時鐘16M
//做者:虞愷

//日期:2012.9.17開坑
//***********************************************************************
//
包含文件
//***********************************************************************

#include <string.h>
#include <stdio.h>
//***********************************************************************
//串口及時鐘信號定義
#define
F_CPU
16000000
/* 單片機主頻爲16MHz,用於延時子程序 */
#include <util/delay.h>
//***********************************************************************
#include <avr/io.h>
#include <avr/iom64.h>
#define delay_us(x)     _delay_us(x)    //AVR GCC延時函數 x(us)
#define delay_ms(x)     _delay_ms(x)    //AVR GCC延時函數 x(ms)
//***************************IO口設置***********************************
//水平電機三線SPI接口設置
#define MOTOH_STROBE_H  PORTC |= (1 << PC1)//拉高STROBE片選線
#define MOTOH_STROBE_L  PORTC &=~(1 << PC1)//拉低STROBE片選線
#define MOTOH_CLK_H 
PORTC |=(1 << PC0)//拉高時鐘線
#define MOTOH_CLK_L 
PORTC &=~(1 << PC0)//拉低時鐘線
#define MOTOH_DATA_H 
PORTG |= (1 << PG1)//拉高數據線
#define MOTOH_DATA_L 
PORTG &=~(1 << PG1)//拉低數據線
//LED指示
#define LedOn
PORTA &=~(1 << PA2)//LED點亮
#define LedOff
PORTA |= (1 << PA2)//LED滅
#define Led
PORTA ^= (1 << PA2)//LED狀態取反

//===========================================================2相四線1.8度步進電機相關=============
unsigned long  MotoForward8[]=

{0x4be98,0x4bd30,0x4ba44,0x4b658,0x4b168,0x4ac74,0x4a67a,0x4a07e,0x5667a,0x56c74,0x57168,0x57658,0x57a44,0x57d30,0x57e98,0x57f80, 

  

0x4de98,0x4dd30,0x4da44,0x4d658,0x4d168,0x4cc74,0x4c67a,0x4c07e,0x5067a,0x50c74,0x51168,0x51658,0x51a44,0x51d30,0x51e98,0x51f80};
//以上數組包含了電機的8細分的驅動數據
//======================================================================

//====================三線SPI發送數據給電機芯片

void MOTO_Send(unsigned long  buf)//buf是要發送的數據
{
Led;
unsigned char i;
MOTOH_STROBE_L;
for(i=0;i<19;i++)//一次發19個數據

{
if(buf&0x40000)
MOTOH_DATA_H;//若是首位爲1,數據線上送高電平,先送MSB
else MOTOH_DATA_L;//不然送低電平
delay_us(1);
MOTOH_CLK_H;//時鐘線的上升沿,驅動芯片讀入一位數據
buf<<=1;//數據左移,準備發送下一位數據
MOTOH_CLK_L;//時鐘線低
}
MOTOH_STROBE_H;//發送完一幀數據後拉高片選線
}

//*************************************************************************
//
系統初始化子程序 
//*************************************************************************
void system_init(void)
{                                 
  DDRD =0xc2;//設置PD7,PD6,PD1爲輸出口
  DDRC =0x03;//設置PC1,PC0爲輸出口
  DDRG =0x03;//設置PG1,PG0爲輸出口
  DDRA =0x04;//設置PA2爲輸出口
  DDRB =0xff;
  DDRF =0xff;
  PORTB=0xff;
  LedOff;
}


//*******************************************************
//
主函數
//*******************************************************
int main(void)
{
unsigned char j;
system_init();
for(i=0;i<6;i++)//Led閃動3次

{

Led;

delay_ms(200);

}
LedOff;
MOTO_Send(0x40779);//設置電機芯片A3992
while(1)
{
for(j=0;j<32;j++)//

{

MOTO_Send(MotoForward8[j]);//不停的把數組中的數據發送到電機驅動芯片,此處電機順時針轉

//用上面這個代碼,電機工做正常,工做時幾乎沒有聲音,可是若是想反轉啓用下面那句代碼時,

//電機共振,聲音很大

//MOTO_Send(MotoForward8[31-j]);//此處電機逆時針轉

delay_us(800);//控制此延時,能夠控制電機的轉速。

}
}
}數組

 

 

百度文庫搜索 《兩相步進電機驅動器A3992及其應用》函數

相關文章
相關標籤/搜索