三相步進電機驅動

admin @ 2014-03-26 , reply:0

三相步進電機的三相六拍工作方式,正轉的繞組通電順序:A、AB、B、BC、C、CA、A,反轉的通電順序:A、AC、C、CB、B、BA、B、A。
由於步進電機轉子有一定的慣性以及所帶負載的慣性,故步進電機的工作過程中不能及時的啟動和停止,在啟動時應慢慢的加速到預定速度,在停止前應逐漸減速到停止,否則,將產生失步現象。
步進電機的控制問題可總結為兩點:
1、產生工作方式需要的時序脈衝;
2、控制步進電機的速度,使它始終遵循加速、勻速、減速的規律工作。

系統:
 
介面:
 

程序:
#include<io8515v.h>
#include<macros.h>
const char zhzhuan[7]={0x06,0x04,0x05,0x01,0x03,0x02,0x00};
const char fanzhuan[7]={0x06,0x02,0x03,0x01,0x05,0x004,0x00};
const int time[5]={4000,3200,2400,1600,800};/*脈衝寬度:0.05m,0.04ms,0.03ms,0.02ms,0.01ms*/
char num;   /*將要轉動的步數*/
char direct;  /*轉動方向,0為反轉,1為正轉*/
char num_run; /*已經轉動的步數*/

void main(void)
    {
  DDRA=0x07;
  TCCR1A=0x00;
  TCCR1B=0x09;
  TIMSK=0x10;
  SREG|=0x80;
  while(1)
  {
    ;
  }
 }
 
#pragma interrupt_handler time1coma:5
void time1coma(void)
     {
   char i,j;  
   if(num>9)                       
   {
    if(num_run<5) OCR1A=time[num_run];                 /*增速*/
    else if(num_run>(num-5)) OCR1A=time[num-num_run];/*減速*/
   }
   else
   {
    i=(num+1)/2;
    if(num_run<(i)) OCR1A=time[num_run];             /*增速*/
    else OCR1A=time[num-num_run];                    /*減速*/
   }
   if(num_run<num)
   {
    j=num_run%6;
    if(direct==1) PORTA=zhzhuan[j];           
    else PORTA=fanzhuan[j];
    num_run+=1;
   }
   else
   {
    OCR1A=0x0fa0;
   }
  }




[admin via 研發互助社區 ] 三相步進電機驅動已經有2282次圍觀

http://cocdig.com/docs/show-post-44604.html