cyxavr 发表于 2009-7-21 19:51:17

想问一下,两相步进电机自锁时,他的相位时序是如何的?

最近,在用单片机的PWM去控制IR2104 驱动两相步进电机。
电机细分和电流控制倒是可以用,不过感觉有问题,并在电机正反控制时,电机振动加大,电流也加大,会不会是相位不对?
还有就是电机的自锁,他的相位是如何的?

高手指教下。

armok 发表于 2009-7-21 22:30:06

sz_zhao 发表于 2009-7-22 00:59:33

不知道你的单片机里做了步进电机的加减速控制没,步进电机在高频率下启动会抖,不知道你这是不是这样。
用了一下DOS下的cnc控制软件TurboCNC,确实好用,电机控制的很平稳。由于作控制用的电脑的硬盘挪作它用,机器上没硬盘就用一个1G的U盘作了个DOS启动,直接在U盘上运行TurboCNC控制机器打孔。不过还没试3D雕刻的效果。
你可以研究研究这个软件的配置,找出最适合你的电机的加减速控制频率再实现到你的单片机上。
http://cache.amobbs.com/bbs_upload782111/files_16/ourdev_463259.jpg
(原文件名:TurboCNC_conf.jpg)

http://cache.amobbs.com/bbs_upload782111/files_16/ourdev_463260.jpg
(原文件名:TurboCNC_jog.jpg)

armok 发表于 2009-7-22 06:37:10

cyxavr 发表于 2009-7-22 07:37:08

回2楼,我只做了细分,我电流控制,电机减速我现在没什么头绪,也不知道如何下手?
按你说的,我的做的驱动在正反转时就出现抖动,估计是你说的这个原因。
请指教!
另外TOarmok
其实手头上有类似的商品,只有一台示波仪,所测到的波形较乱,不知何看。

cyxavr 发表于 2009-7-24 14:34:43

各位老大,程序已做了16细分,但在低速时,运转起来还是感觉一格一格的,振动巨大啊,那位兄弟帮帮我,
这个问题搞了两天了,还是没搞定。

用软件仿真输出的波形也是正弦波,就是找不到问题出在那?


电路如下:这是其中的A相,B相与A相是相同的。
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_464167.jpg
(原文件名:QQ截图未命名.jpg)


程序:


struct Motor2P_COR
{
   unsigned int mTableId;//细分表ID
   unsigned char mTask;
   unsigned char mDirect;//马达走动方向
   unsigned char mStepIdleTimer;//步进时输出节电的时间寄存器
   unsigned int mStepCount;//细分表走动步长。1-2-4-8-16

};

struct Motor2P_PWM
{
   unsigned char mQuadrant;//象限0-3
   unsigned char mB_Pwm;//x输出的PWM
   unsigned char mA_Pwm;//y输出的PWM
};




正余弦表
#include "include.h"
const __flashstruct Motor2P_PWM cMotor2P_Table[]=
{

//第一象限 +x,+y

    Step_Quadrant0,255,0,

    Step_Quadrant0,254,25,

    Step_Quadrant0,251,50,

    Step_Quadrant0,244,74,

    Step_Quadrant0,237,98,
   
    Step_Quadrant0,226,121 ,
   
    Step_Quadrant0,211,141 ,
   
    Step_Quadrant0,195,160 ,
   
    Step_Quadrant0,180,180 ,
   
    Step_Quadrant0,160,195 ,
   
    Step_Quadrant0,141,211 ,
   
    Step_Quadrant0,121,226 ,
   
    Step_Quadrant0,98 ,237 ,
   
    Step_Quadrant0,74 ,244 ,
   
    Step_Quadrant0,50 ,251 ,
   
    Step_Quadrant0,25 ,254 ,
   
   

//第二象限 -x,+y
   
    Step_Quadrant1,0,255 ,
   
    Step_Quadrant1,25 ,254 ,
   
    Step_Quadrant1,50 ,251 ,
   
    Step_Quadrant1,74 ,244 ,
   
    Step_Quadrant1,98 ,237 ,
   
    Step_Quadrant1,121,226 ,
   
    Step_Quadrant1,141,211 ,
   
    Step_Quadrant1,160,195 ,
   
    Step_Quadrant1,180,180 ,
   
    Step_Quadrant1,195,160 ,
   
    Step_Quadrant1,211,141 ,
   
    Step_Quadrant1,226,121 ,
   
    Step_Quadrant1,237,98,
   
    Step_Quadrant1,244,74,
   
    Step_Quadrant1,251,50,
   
    Step_Quadrant1,254,25,

//第三象限 -x,-y

    Step_Quadrant2,255,0,
   
    Step_Quadrant2,254,25,
   
    Step_Quadrant2,251,50,
   
    Step_Quadrant2,244,74,
   
    Step_Quadrant2,237,98,
   
    Step_Quadrant2,226,121 ,
   
    Step_Quadrant2,211,141 ,
   
    Step_Quadrant2,195,160 ,
   
    Step_Quadrant2,180,180 ,
   
    Step_Quadrant2,160,195 ,

    Step_Quadrant2,141,211 ,

    Step_Quadrant2,121,226 ,

    Step_Quadrant2,98 ,237 ,

    Step_Quadrant2,74 ,244 ,

    Step_Quadrant2,50 ,251 ,

    Step_Quadrant2,25 ,254 ,

//第四象限 +x,-y

    Step_Quadrant3,0,255 ,

    Step_Quadrant3,25 ,254 ,

    Step_Quadrant3,50 ,251 ,

    Step_Quadrant3,74 ,244 ,

    Step_Quadrant3,98 ,237 ,

    Step_Quadrant3,121,226 ,

    Step_Quadrant3,141,211 ,

    Step_Quadrant3,160,195 ,

    Step_Quadrant3,180,180 ,

    Step_Quadrant3,195,160 ,

    Step_Quadrant3,211,141 ,

    Step_Quadrant3,226,121 ,

    Step_Quadrant3,237,98,

    Step_Quadrant3,244,74,

    Step_Quadrant3,251,50,

    Step_Quadrant3,254,25,

};


void timer1_init(void)
{
TCCR1B = 0;
TCCR1A = 0;                   
ICR1=255;//这里比较输出的TOP值
OCR1A=255;
OCR1B=0; //AB相位相差90度

TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);   // OCR1X时清0TOP 时置位
TCCR1B = (1<<CS10)|(1<<WGM13)|(1<<WGM12);//    8位的快速PWM   
}

#pragma vector=INT2_vect//只有外中断程序才是电机控制程序
__interrupt void INT2_vect_ISR(void)
{      
      Motor_Step_one( sMotor2P.mDirect );//走动细分表
      InMotor_Energy( sMotor2P.mTableId,mNum_C);//输出电


}


void InMotor_Energy(unsigned int Mid,unsigned char mNum)
{
   
    const struct Motor2P_PWM __flash*pc_Motor2P_Table;
    static unsigned char C_DIR;
    unsigned int A,B;

   pc_Motor2P_Table=&cMotor2P_Table;
                                                      
    B=(unsigned int)( pc_Motor2P_Table->mB_Pwm *mNum) >>4;// 余弦
    A=(unsigned int)( pc_Motor2P_Table->mA_Pwm *mNum) >>4;//正弦
   
   CLI();
   
   C_DIR= pc_Motor2P_Table->mQuadrant;
   
   OCR1B=B; //B_PWM余弦
   OCR1A=A; //A_PWM正弦
    switch (C_DIR)
   {
   case 1:EN_B=0;EN_A=1;break;
   case 2:EN_A=1;EN_B=1;break;
   case 3:EN_B=1;EN_A=0;break;
   case 4:EN_A=0;EN_B=0;break;
   default:       break;
   }

   SEI();
   
}



void Motor_Step_one(unsigned char F_DIR) //走一步
{
   
   if(F_DIR)//顺时针
   {
   if(sMotor2P.mTableId<=0)
       sMotor2P.mTableId=sizeof( cMotor2P_Table)/sizeof( struct Motor2P_PWM)-1-sMotor2P.mStepCount;      
   else
      sMotor2P.mTableId-=sMotor2P.mStepCount;
   }
   else//反转
   {
      sMotor2P.mTableId+=sMotor2P.mStepCount;
      if(sMotor2P.mTableId>=((sizeof(cMotor2P_Table)/sizeof(struct Motor2P_PWM))-1)) sMotor2P.mTableId=0;
   }
}


#include "include.h"
void main(void)
{
init();
mNum_C=10;
sMotor2P.mStepCount=1;
sMotor2P.mDirect=1;
while(1)
   {

    }
}

cyxavr 发表于 2009-7-24 18:34:30

难道的我问题太菜了,没人愿意回答?
自己顶。
页: [1]
查看完整版本: 想问一下,两相步进电机自锁时,他的相位时序是如何的?