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

[复制链接]
1688|1
 楼主| yuyy1989 发表于 2023-6-23 10:56 | 显示全部楼层 |阅读模式
本帖最后由 yuyy1989 于 2023-6-23 13:29 编辑

#申请原创#

5.我的无刷电机控制入门
第一次接触无刷电机,从入门一点一点来吧。
5.1无刷电机的原理
首先来了解一下无刷电机是如何转起来的,和有刷电机不同,无刷电机的永磁体在转子上,电磁线圈在定子上,通过不断切换不同组的电磁线圈通电来驱使转子转动,从这张动图更能直接了解这个过程
R-C.35d35a2de8e98c122111a29c640ecd59.gif
也有另一种驱动方式
avpx2-926hd.gif
而MCU要让无刷电机转起来做的就是不断的切换电磁线圈组
看一下功率底板的原理图
QQ截图20230622202336.png
底板上通过2个io控制一个LKS560的芯片来间接控制电磁线圈一个脚的高低电平,这样4个io来控制一个电磁线圈的通电和极性,查看LKS560的手册
QQ截图20230622203112.png
了解了控制逻辑之后,就知道如何用这个MCU配合底板让无刷电机转起来了
5.2简单让电机先转起来
看一下MUC板的原理图,UP UN VP VN WP WN这6个是控制电机转起来的引脚
QQ截图20230622203550.png
通过上面的了解,电机转一圈(先不管方向)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的方式先让电机转起来
代码示例
  1. #include "lks32mc07x.h"
  2. #include "lks32mc07x_gpio.h"
  3. #include "lks32mc07x_sys.h"

  4. #include "yuyy_delay.h"

  5. #define LED_GPIO GPIO0
  6. #define LED1_PIN GPIO_Pin_6
  7. #define LED2_PIN GPIO_Pin_7
  8. #define LED3_PIN GPIO_Pin_3
  9. #define LED_PINS LED1_PIN|LED2_PIN|LED3_PIN

  10. #define KEY_GPIO GPIO2
  11. #define KEY_START_PIN GPIO_Pin_11
  12. #define KEY_STOP_PIN GPIO_Pin_12
  13. #define KEY_PINS KEY_START_PIN|KEY_STOP_PIN

  14. void led_init(void)
  15. {
  16.     GPIO_InitTypeDef GPIO_InitStruct;
  17.     GPIO_StructInit(&GPIO_InitStruct);
  18.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  19.     GPIO_InitStruct.GPIO_Pin =  LED_PINS;
  20.     GPIO_Init(LED_GPIO, &GPIO_InitStruct);
  21.     GPIO_ResetBits(LED_GPIO, LED1_PIN|LED2_PIN);
  22.     GPIO_SetBits(LED_GPIO, LED3_PIN);
  23. }

  24. void key_init()
  25. {
  26.     GPIO_InitTypeDef GPIO_InitStruct;
  27.     GPIO_StructInit(&GPIO_InitStruct);
  28.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
  29.     GPIO_InitStruct.GPIO_Pin =  KEY_PINS;
  30.     GPIO_Init(KEY_GPIO, &GPIO_InitStruct);
  31. }

  32. void uvw_testinit()
  33. {
  34.     GPIO_InitTypeDef GPIO_InitStruct;
  35.     GPIO_StructInit(&GPIO_InitStruct);
  36.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  37.     GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
  38.     GPIO_Init(GPIO1, &GPIO_InitStruct);
  39. }

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

  55. int main(void)
  56. {
  57.     uint8_t run = 0;
  58.     uint8_t key_start_downcount = 0;
  59.     uint8_t key_stop_downcount = 0;
  60.     uint8_t runstep = 0;
  61.     mcu_init();
  62.     while (1)
  63.     {
  64.         if(Bit_RESET == GPIO_ReadInputDataBit(KEY_GPIO,KEY_START_PIN))
  65.         {
  66.             if(key_start_downcount < 0xFF)
  67.                 key_start_downcount++;
  68.         }
  69.         else
  70.         {
  71.             if(key_start_downcount > 3 && run == 0)
  72.             {
  73.                 run = 1;
  74.                 runstep = 0;
  75.             }
  76.             key_start_downcount = 0;
  77.         }
  78.         
  79.         if(Bit_RESET == GPIO_ReadInputDataBit(KEY_GPIO,KEY_STOP_PIN))
  80.         {
  81.             if(key_stop_downcount < 0xFF)
  82.                 key_stop_downcount++;
  83.         }
  84.         else
  85.         {
  86.             if(key_stop_downcount > 3 && run > 0)
  87.             {
  88.                 run = 0;
  89.                 runstep = 0;
  90.             }
  91.             key_stop_downcount = 0;
  92.         }
  93.         
  94.         if(runstep > 0)
  95.             runstep--;
  96.         else
  97.         {
  98.             runstep = 0;//200;//先用较长的时间测试,没问题后再改成0
  99.             switch(run)
  100.             {
  101.                 case 1:
  102.                     GPIO_SetBits(LED_GPIO, LED1_PIN);
  103.                     GPIO_ResetBits(LED_GPIO, LED2_PIN);
  104.                     GPIO_SetBits(LED_GPIO, LED3_PIN);
  105.                     
  106.                     GPIO_SetBits(GPIO1, GPIO_Pin_4|GPIO_Pin_5);
  107.                     GPIO_ResetBits(GPIO1, GPIO_Pin_6|GPIO_Pin_7);
  108.                     GPIO_ResetBits(GPIO1, GPIO_Pin_8);
  109.                     GPIO_SetBits(GPIO1, GPIO_Pin_9);
  110.                     run = 2;
  111.                     break;
  112.                 case 2:
  113.                     GPIO_ResetBits(LED_GPIO, LED1_PIN);
  114.                     GPIO_SetBits(LED_GPIO, LED2_PIN);
  115.                     GPIO_SetBits(LED_GPIO, LED3_PIN);

  116.                     GPIO_SetBits(GPIO1, GPIO_Pin_6|GPIO_Pin_7);
  117.                     GPIO_ResetBits(GPIO1, GPIO_Pin_8|GPIO_Pin_9);
  118.                     GPIO_ResetBits(GPIO1, GPIO_Pin_4);
  119.                     GPIO_SetBits(GPIO1, GPIO_Pin_5);
  120.                     run = 3;
  121.                     break;
  122.                 case 3:
  123.                     GPIO_ResetBits(LED_GPIO, LED1_PIN);
  124.                     GPIO_ResetBits(LED_GPIO, LED2_PIN);
  125.                     GPIO_ResetBits(LED_GPIO, LED3_PIN);
  126.                     
  127.                     GPIO_SetBits(GPIO1, GPIO_Pin_8|GPIO_Pin_9);
  128.                     GPIO_ResetBits(GPIO1, GPIO_Pin_4|GPIO_Pin_5);
  129.                     GPIO_ResetBits(GPIO1, GPIO_Pin_6);
  130.                     GPIO_SetBits(GPIO1, GPIO_Pin_7);
  131.                     run = 1;
  132.                     break;
  133.                 default:
  134.                     GPIO_ResetBits(LED_GPIO, LED1_PIN);
  135.                     GPIO_ResetBits(LED_GPIO, LED2_PIN);
  136.                     GPIO_SetBits(LED_GPIO, LED3_PIN);
  137.                
  138.                     GPIO_ResetBits(GPIO1, GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_8);
  139.                     GPIO_SetBits(GPIO1, GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_9);
  140.                     run = 0;
  141.                     break;
  142.             }
  143.         }
  144.         yuyy_delay_ms(10);
  145.     }
  146. }

注意正式接电机前,先用较长的切换周期,用万用表测一下UVW的输出是否正常,停下后是否输出都为0,一切OK后再接上电机进行测试
最终效果
WeChat_20230622204919 00_00_00-00_00_30.gif
当然作为一颗面向电机控制的芯片,LKS32MC071自带有专门的控制电机的方法,接下来将尝试用专用的方法来控制电机





评论

赞~!学习一下!  发表于 2023-6-26 10:09
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:同飞软件研发工程师
简介:制冷系统单片机软件开发,使用PID控制温度

168

主题

826

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部