搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2009-7-21 19:51:17 | 显示全部楼层 |阅读模式
最近,在用单片机的PWM去控制IR2104 驱动两相步进电机。
电机细分和电流控制倒是可以用,不过感觉有问题,并在电机正反控制时,电机振动加大,电流也加大,会不会是相位不对?
还有就是电机的自锁,他的相位是如何的?

高手指教下。

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)
头像被屏蔽

出0入0汤圆

发表于 2009-7-21 22:30:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2009-7-22 00:59:33 | 显示全部楼层
不知道你的单片机里做了步进电机的加减速控制没,步进电机在高频率下启动会抖,不知道你这是不是这样。
用了一下DOS下的cnc控制软件TurboCNC,确实好用,电机控制的很平稳。由于作控制用的电脑的硬盘挪作它用,机器上没硬盘就用一个1G的U盘作了个DOS启动,直接在U盘上运行TurboCNC控制机器打孔。不过还没试3D雕刻的效果。
你可以研究研究这个软件的配置,找出最适合你的电机的加减速控制频率再实现到你的单片机上。

(原文件名:TurboCNC_conf.jpg)


(原文件名:TurboCNC_jog.jpg)
头像被屏蔽

出0入0汤圆

发表于 2009-7-22 06:37:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2009-7-24 14:34:43 | 显示全部楼层
各位老大,程序已做了16细分,但在低速时,运转起来还是感觉一格一格的,振动巨大啊,那位兄弟帮帮我,
这个问题搞了两天了,还是没搞定。

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


电路如下:这是其中的A相,B相与A相是相同的。

(原文件名: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 __flash  struct 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; //A  B  相位相差90度
  
  TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);   // OCR1X时清0  TOP 时置位
  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[Mid];
                                                        
    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)
   {

    }
}

出0入0汤圆

 楼主| 发表于 2009-7-24 18:34:30 | 显示全部楼层
难道的我问题太菜了,没人愿意回答?
自己顶。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-17 22:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表