本帖最后由 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自带有专门的控制电机的方法,接下来将尝试用专用的方法来控制电机
|
赞~!学习一下!