记录驱动三相无刷电机的过程
·339 字·2 分钟阅读
嵌入式开发
原理
简单来说就是电生磁,磁场的方向可以根据 右手螺旋定则 又称 安培定则 来判断,然后根据磁铁的同斥异吸产生的力,就可以带动磁铁旋转起来,这篇文章不做详细解释,只记录自己写代码和思考的过程
三相无刷电机结构图
硬件购买
2804电机 + AS5600编码器 + FOC驱动板(MS8313芯片)
先做一个简单的电平高低驱动
代码如下:
void testMotorDriver(void)
{
static uint8_t step;
U_LOW;
V_LOW;
W_LOW;
switch (step)
{
case 0:
U_HIGH;
V_HIGH;
break;
case 1:
U_HIGH;
W_HIGH;
break;
case 2:
V_HIGH;
W_HIGH;
break;
case 3:
V_HIGH;
U_HIGH;
break;
case 4:
W_HIGH;
U_HIGH;
break;
case 5:
W_HIGH;
V_HIGH;
break;
default:
break;
}
if(++step >= 6){
step = 0;
}
}
调用
while (1)
{
if (sysCnt >= 10)
{
sysCnt = 0;
if (++stepCnt >= 500) // 500ms调用一次
{
stepCnt = 0;
testMotorDriver();
}
}
}
很显然,电机是一步一步走的,非常卡顿,并且是开环控制,我并不知道转到哪里了,接下来是我一步一步的优化和思考过程
testMotorDriver函数的调用频率问题
现在电机是一步一步走的,是因为我是500ms调用的,这让我有了思考,如果我把调用频率加快,它是不是就可以快速转动起来了,于是我改成在主循环调用:
while (1)
{
if (sysCnt >= 10)
{
sysCnt = 0;
if (++stepCnt >= 500) // 500ms调用一次
{
stepCnt = 0;
}
}
testMotorDriver();
}
发现电机直接不转了,使用示波器查看是有波形的 这个可能是由于换相过快,电机根本追不上来,导致直接不转动了,这就是开环控制的弊端,我不知道现在转哪了,只能盲目换相