记录驱动三相无刷电机的过程

·339·2 分钟阅读
嵌入式开发

原理

简单来说就是电生磁,磁场的方向可以根据 右手螺旋定则 又称 安培定则 来判断,然后根据磁铁的同斥异吸产生的力,就可以带动磁铁旋转起来,这篇文章不做详细解释,只记录自己写代码和思考的过程

三相无刷电机结构图

三相无刷电机结构图

硬件购买

https://item.taobao.com/item.htm?id=798692885752&mi_id=00004bCXyEbhWUxPilYAZcWq6_E4UiCvb_UTOWkkVvzVQw8&spm=tbpc.mytb_itemcollect.item.goods&upStreamPrice=4500

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();
}

发现电机直接不转了,使用示波器查看是有波形的 这个可能是由于换相过快,电机根本追不上来,导致直接不转动了,这就是开环控制的弊端,我不知道现在转哪了,只能盲目换相