|
楼主 |
发表于 2018-7-19 11:14:58
|
显示全部楼层
如果我们把电机转子旋转一周分成4个象限,基础4拍只要一拍就跑完一个象限角度。细分就是在每个象限中划分出N个区域。
所以要细分的话我们必须要在每个象限中插入多个节拍,插入节拍越多,细分数就越大,电机转动的角度就越小。
/*
细分方法:
beat 节拍-4拍
fraction 细分数-16细分
基础4拍
ABCD
1000
0100
0010
0001
A和B之间插入16拍,0x00
B和C之间插入16拍 0x10
C和D之间插入16拍 0x20
D和A之间插入16拍 0x30
A和B之间插入16拍,0x40
*/
#define MAX 16 //在基础4拍的16细分,一周4拍变成64拍,角度每一拍变成了原来的1/16.
#define AQ RA0
#define BQ RA1
#define CQ RA2
#define DQ RC0
//beat节拍,fraction细分分数,
void motor_drive(unsigned char beat, unsigned char fraction)
{
static unsigned char index;
switch (beat)
{
case 0: //1#象限
if (index<MAX-fraction)
AQ = 1;
else
AQ = 0;
if (index < fraction)
BQ = 1;
else
BQ = 0;
if (++index>=MAX)
index=0;
CQ = 0; DQ = 0;
break;
case 1:
if (index<MAX-fraction)
BQ = 1;
else
BQ = 0;
if (index < fraction)
CQ = 1;
else
CQ = 0;
if (++index>=MAX)
index=0;
AQ = 0; DQ = 0;
break;
case 2://2#象限
if (index<MAX-fraction)
CQ = 1;
else
CQ = 0;
if (index < fraction)
DQ = 1;
else
DQ = 0;
if (++index>=MAX)
index=0;
AQ = 0; BQ = 0;
break;
case 3:
if (index<MAX-fraction)
DQ = 1;
else
DQ = 0;
if (index < fraction)
AQ = 1;
else
AQ = 0;
if (++index>=MAX)
index=0;
BQ = 0; CQ = 0;
break;
default: break;
}
}
//那么我们可以电机的驱动频率周期性的调用motor_drive()函数就可以让电机走步或停止在一定的角度
p = xf>>4; //xf节拍,如16拍,P是象限,x是细分角度对应节拍
x = xf &0x0f;
motor_drive(p, x);
上图是网上细出的细分曲线图
下面看下程序运时的PWM波形和对A相滤波后的结果
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|