|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2009-7-30 09:28:51
|
显示全部楼层
TO【13楼】 wayhe
想了一下,13楼讲的也有道理。
不知道【13楼】兄弟,有无简单点电流采方法呢?
上原理图,不过采样电流还没有画。
![](http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_465808.jpg)
(原文件名:MOTO_D.jpg)
上面电路电流采样的没有画。
我现在买了HCNR200
想按这个电路采样,不知可否?
![](http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_465809.jpg)
(原文件名:MOTO_D_D.jpg)
晶振:16MHZ
CPU: M16
IAR AVR 4.3版
struct Motor2P_COR
{
unsigned int mTableId;//细分表ID
unsigned char mDirect;//马达走动方向
unsigned int mStepCount;//细分表走动步长。1-2-4-8-16 ~200 其实就是设置细分用的
};
struct Motor2P_PWM
{
unsigned char mQuadrant;//象限0-3
unsigned char mB_Pwm;//x输出的PWM
unsigned char mA_Pwm;//y输出的PWM
};
先发程序
//象限 余弦波 正弦波
Step_Quadrant0 , 200 , 0 ,
Step_Quadrant0 , 196 , 39 ,
Step_Quadrant0 , 185 , 77 ,
Step_Quadrant0 , 166 , 111 ,
Step_Quadrant0 , 141 , 141 ,
Step_Quadrant0 , 111 , 166 ,
Step_Quadrant0 , 77 , 185 ,
Step_Quadrant0 , 39 , 196 ,
Step_Quadrant1 , 0 , 200 ,
Step_Quadrant1 , 39 , 196 ,
Step_Quadrant1 , 77 , 185 ,
Step_Quadrant1 , 111 , 166 ,
Step_Quadrant1 , 141 , 141 ,
Step_Quadrant1 , 166 , 111 ,
Step_Quadrant1 , 185 , 77 ,
Step_Quadrant1 , 196 , 39 ,
Step_Quadrant2 , 200 , 0 ,
Step_Quadrant2 , 196 , 39 ,
Step_Quadrant2 , 185 , 77 ,
Step_Quadrant2 , 166 , 111 ,
Step_Quadrant2 , 141 , 141 ,
Step_Quadrant2 , 111 , 166 ,
Step_Quadrant2 , 77 , 185 ,
Step_Quadrant2 , 39 , 196 ,
Step_Quadrant3 , 0 , 200 ,
Step_Quadrant3 , 39 , 196 ,
Step_Quadrant3 , 77 , 185 ,
Step_Quadrant3 , 111 , 166 ,
Step_Quadrant3 , 141 , 141 ,
Step_Quadrant3 , 166 , 111 ,
Step_Quadrant3 , 185 , 77 ,
Step_Quadrant3 , 196 , 39
};
void timer1_init(void)
{
TCCR1B = 0x00;
TCCR1A = 0x00;
ICR1=255;//这里比较输出的TOP值
OCR1A=0;
OCR1B=200; //A B 相位相差90度
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11); // OCR1X时清0 TOP 时置位
TCCR1B = (1<<CS10)|(1<<WGM13)|(1<<WGM12);// 8位的快速PWM
}
void Motor_Init(void)
{
sMotor2P.mStepCount=1;
//mNum_C= 10;//初始化
Step_OutMode();
}
void init(void)
{
CLI();
port_init();
timer1_init();
// timer0_init();
//timer2_init();
// Motor_Init();//马达初始化
MCUCR = 0x00;
GICR = 0x20;//INT2中断
TIMSK = 0x03; //timer interrupt sources
SEI();
}
#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_C) >>4);// 余弦
// A=(unsigned int)(( pc_Motor2P_Table->mA_Pwm *mNum_C) >>4);//正弦
B=(unsigned int)( pc_Motor2P_Table->mB_Pwm ) ;// 余弦
A=(unsigned int)( pc_Motor2P_Table->mA_Pwm ) ;//正弦
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)-sMotor2P.mStepCount;
else
sMotor2P.mTableId-=sMotor2P.mStepCount;
}
else//反转
{
sMotor2P.mTableId+=sMotor2P.mStepCount;
if(sMotor2P.mTableId >= (sizeof(cMotor2P_Table)/sizeof(struct Motor2P_PWM))) sMotor2P.mTableId=0;
}
}
主函数:
void main(void)
{
init();
while(1)
{}
} |
|