想问一下,两相步进电机自锁时,他的相位时序是如何的?
最近,在用单片机的PWM去控制IR2104 驱动两相步进电机。电机细分和电流控制倒是可以用,不过感觉有问题,并在电机正反控制时,电机振动加大,电流也加大,会不会是相位不对?
还有就是电机的自锁,他的相位是如何的?
高手指教下。 不知道你的单片机里做了步进电机的加减速控制没,步进电机在高频率下启动会抖,不知道你这是不是这样。
用了一下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) 回2楼,我只做了细分,我电流控制,电机减速我现在没什么头绪,也不知道如何下手?
按你说的,我的做的驱动在正反转时就出现抖动,估计是你说的这个原因。
请指教!
另外TOarmok
其实手头上有类似的商品,只有一台示波仪,所测到的波形较乱,不知何看。 各位老大,程序已做了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)
{
}
} 难道的我问题太菜了,没人愿意回答?
自己顶。
页:
[1]