打印
[LKS32 软件]

【凌鸥创芯电机开发板LKS32MC071CBT8评测报告】5.我的无刷电机控制入门

[复制链接]
1133|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 yuyy1989 于 2023-6-23 13:29 编辑

#申请原创#

5.我的无刷电机控制入门
第一次接触无刷电机,从入门一点一点来吧。
5.1无刷电机的原理
首先来了解一下无刷电机是如何转起来的,和有刷电机不同,无刷电机的永磁体在转子上,电磁线圈在定子上,通过不断切换不同组的电磁线圈通电来驱使转子转动,从这张动图更能直接了解这个过程

也有另一种驱动方式

而MCU要让无刷电机转起来做的就是不断的切换电磁线圈组
看一下功率底板的原理图

底板上通过2个io控制一个LKS560的芯片来间接控制电磁线圈一个脚的高低电平,这样4个io来控制一个电磁线圈的通电和极性,查看LKS560的手册

了解了控制逻辑之后,就知道如何用这个MCU配合底板让无刷电机转起来了
5.2简单让电机先转起来
看一下MUC板的原理图,UP UN VP VN WP WN这6个是控制电机转起来的引脚

通过上面的了解,电机转一圈(先不管方向)UP UN VP VN WP WN的变化过程为
1 1 0 0 0 1
0 1 1 1 0 0
0 0 0 1 1 1
停下来时,要让所有线圈都断电
0 1 0 1 0 1
转的步骤是不是很像流水灯,那就把留水灯那个程序改一改用手动控制IO的方式先让电机转起来
代码示例
#include "lks32mc07x.h"
#include "lks32mc07x_gpio.h"
#include "lks32mc07x_sys.h"

#include "yuyy_delay.h"

#define LED_GPIO GPIO0
#define LED1_PIN GPIO_Pin_6
#define LED2_PIN GPIO_Pin_7
#define LED3_PIN GPIO_Pin_3
#define LED_PINS LED1_PIN|LED2_PIN|LED3_PIN

#define KEY_GPIO GPIO2
#define KEY_START_PIN GPIO_Pin_11
#define KEY_STOP_PIN GPIO_Pin_12
#define KEY_PINS KEY_START_PIN|KEY_STOP_PIN

void led_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Pin =  LED_PINS;
    GPIO_Init(LED_GPIO, &GPIO_InitStruct);
    GPIO_ResetBits(LED_GPIO, LED1_PIN|LED2_PIN);
    GPIO_SetBits(LED_GPIO, LED3_PIN);
}

void key_init()
{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStruct.GPIO_Pin =  KEY_PINS;
    GPIO_Init(KEY_GPIO, &GPIO_InitStruct);
}

void uvw_testinit()
{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
    GPIO_Init(GPIO1, &GPIO_InitStruct);
}

void mcu_init(void)
{
    __disable_irq();         /* 关闭中断 中断总开关 */
    SYS_WR_PROTECT = 0x7a83; /*使能系统寄存器写操作*/
    FLASH_CFG |= 0x00080000; /* enable prefetch ,FLASH预取加速使能*/        
    IWDG_DISABLE();                                                /*关闭清零看门狗*/
    SYS_MclkChoice(SYS_MCLK_96M_RC); /*选择当前主时钟频率*/
    led_init();        
    key_init();
    yuyy_hs12864g18b_init();
    uvw_testinit();
    yuyy_delay_us(100);          /* 延时等待硬件初始化稳定 */
    SYS_WR_PROTECT = 0x0;    /*关闭系统寄存器写操作*/
    __enable_irq();          /* 开启总中断 */
}

int main(void)
{
    uint8_t run = 0;
    uint8_t key_start_downcount = 0;
    uint8_t key_stop_downcount = 0;
    uint8_t runstep = 0;
    mcu_init();
    while (1)
    {
        if(Bit_RESET == GPIO_ReadInputDataBit(KEY_GPIO,KEY_START_PIN))
        {
            if(key_start_downcount < 0xFF)
                key_start_downcount++;
        }
        else
        {
            if(key_start_downcount > 3 && run == 0)
            {
                run = 1;
                runstep = 0;
            }
            key_start_downcount = 0;
        }
        
        if(Bit_RESET == GPIO_ReadInputDataBit(KEY_GPIO,KEY_STOP_PIN))
        {
            if(key_stop_downcount < 0xFF)
                key_stop_downcount++;
        }
        else
        {
            if(key_stop_downcount > 3 && run > 0)
            {
                run = 0;
                runstep = 0;
            }
            key_stop_downcount = 0;
        }
        
        if(runstep > 0)
            runstep--;
        else
        {
            runstep = 0;//200;//先用较长的时间测试,没问题后再改成0
            switch(run)
            {
                case 1:
                    GPIO_SetBits(LED_GPIO, LED1_PIN);
                    GPIO_ResetBits(LED_GPIO, LED2_PIN);
                    GPIO_SetBits(LED_GPIO, LED3_PIN);
                    
                    GPIO_SetBits(GPIO1, GPIO_Pin_4|GPIO_Pin_5);
                    GPIO_ResetBits(GPIO1, GPIO_Pin_6|GPIO_Pin_7);
                    GPIO_ResetBits(GPIO1, GPIO_Pin_8);
                    GPIO_SetBits(GPIO1, GPIO_Pin_9);
                    run = 2;
                    break;
                case 2:
                    GPIO_ResetBits(LED_GPIO, LED1_PIN);
                    GPIO_SetBits(LED_GPIO, LED2_PIN);
                    GPIO_SetBits(LED_GPIO, LED3_PIN);

                    GPIO_SetBits(GPIO1, GPIO_Pin_6|GPIO_Pin_7);
                    GPIO_ResetBits(GPIO1, GPIO_Pin_8|GPIO_Pin_9);
                    GPIO_ResetBits(GPIO1, GPIO_Pin_4);
                    GPIO_SetBits(GPIO1, GPIO_Pin_5);
                    run = 3;
                    break;
                case 3:
                    GPIO_ResetBits(LED_GPIO, LED1_PIN);
                    GPIO_ResetBits(LED_GPIO, LED2_PIN);
                    GPIO_ResetBits(LED_GPIO, LED3_PIN);
                    
                    GPIO_SetBits(GPIO1, GPIO_Pin_8|GPIO_Pin_9);
                    GPIO_ResetBits(GPIO1, GPIO_Pin_4|GPIO_Pin_5);
                    GPIO_ResetBits(GPIO1, GPIO_Pin_6);
                    GPIO_SetBits(GPIO1, GPIO_Pin_7);
                    run = 1;
                    break;
                default:
                    GPIO_ResetBits(LED_GPIO, LED1_PIN);
                    GPIO_ResetBits(LED_GPIO, LED2_PIN);
                    GPIO_SetBits(LED_GPIO, LED3_PIN);
               
                    GPIO_ResetBits(GPIO1, GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_8);
                    GPIO_SetBits(GPIO1, GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_9);
                    run = 0;
                    break;
            }
        }
        yuyy_delay_ms(10);
    }
}

注意正式接电机前,先用较长的切换周期,用万用表测一下UVW的输出是否正常,停下后是否输出都为0,一切OK后再接上电机进行测试
最终效果

当然作为一颗面向电机控制的芯片,LKS32MC071自带有专门的控制电机的方法,接下来将尝试用专用的方法来控制电机





使用特权

评论回复
评论
forgot 2023-6-26 10:09 回复TA
赞~!学习一下! 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

695

帖子

6

粉丝