|
楼主 |
发表于 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)
{
}
} |
|