本帖最后由 xld0932 于 2019-6-4 14:02 编辑

1.项目背景
当前公司预研的项目使用到步进电机来调节核心部件参数的功能,硬件还没有投入进来,所以软件为了赶进度,就结合当前手头上uFun开发板扩展了一块控制步进电机的扩展板。

步进电机扩展板可以驱动两种类型的步进电机,一种是4相5线的步进电机,采用ULN2003BDR芯片驱动;另一种是2相4线的步进电机,采用LV8549MC-AH芯片驱动。

需要注意的是4相5线的是单极性(线圈中电流的流动方向是固定的)的步进电机,而2相4线的是双极性的步进电机,使用ULN2003BDR芯片是无法驱动2相4线的步进电机。

2.硬件设计

硬件设计使用的是嘉立创的EDA软件,为什么选它?可能是因为容易上手吧,方便找元件、买元件。不过在做Mini-PCIe接口封装时,还是花了点时间,因为没有手册说明,只能借鉴前人的设计经验来画了。硬件原理比较简单,如下些图所示。

2.1.硬件原理图设计

Schematic_uFun-StepMotor.png

2.2.硬件PCB设计

PCB_uFun-StepMotor_TOP.png PCB_uFun-StepMotor_BOTTOM.png

3.回板焊接调试

3.1.回板

回板后还是比较紧张的,因为Mini-PCIe的接口封装第一次做,之前没有画过。还有一个是扩展板的厚度,要求的是1mm,怕松了或者紧了……所以回板后第一件是就把扩展板插到Mini-PCIe插槽中试了一下安装,确认无误后,悬着的心算是放下来了。

1.jpg 2.jpg

3.2.焊接

扩展板需要焊接的元器件比较少,只准备了2套元器件,和同事一起焊接的,1人1套,如下图是我的焊接成果

3.jpg

3.3.调试

调试第一步:编写驱动代码,这个时候还没有将步进电机插到扩展板上,驱动编写,将程序下载到板子,通过示波器确认波形。如下图是驱动LV8549MC-AH芯片的波形图:

TEK0000.BMP

调试第二步:连接步进电机,尝试让其转动起来。在调试的时候,4相5线的步进电机一下子就动起来了。但是2相4线的就是在震动,并没有转动起来,通过硬件原理图和电机手册的比对,发现连接的线序不对,经过调整后,2相4线的步进电机也成功转动起来了。

4.jpg

4.STM32CubeMX设置

根据原理图设计对使用到的GPIO进行初始化配置。

5.png

5.主要程序

程序功能:上电后硬件自检,自检完成后可通过触摸按键对电机的进行控制,分为是4相5线步进电机的正反转和2相4线步进电机的正反转。
  1. /**
  2. * @brief  :
  3. * @param  :
  4. * @returns:
  5. * @details:
  6. */
  7. void KEY_Handler(uint8_t value, eKEY_TYPE type)
  8. {
  9.     gtKey.type = type;
  10.     gtKeyValue = (eKEY_VALUE)value;
  11.     switch(gtKeyValue)
  12.     {
  13.         case KEY_VALUE_0_R:
  14.             printf("Key right event\r\n"); uFUN_SM_2P4L_Running(1); break;
  15.         case KEY_VALUE_1_U:
  16.             printf("Key up    event\r\n"); uFUN_SM_4P5L_Running(1); break;
  17.         case KEY_VALUE_2_L:
  18.             printf("Key left  event\r\n"); uFUN_SM_2P4L_Running(0); break;
  19.         case KEY_VALUE_3_D:
  20.             printf("Key down  event\r\n"); uFUN_SM_4P5L_Running(0); break;
  21.         default : break;
  22.     }
  23. }
  1. /**
  2.   ******************************************************************************
  3.   * @file    uFun_SteppingMotor.c
  4.   * @version V1.00
  5.   * @author  xld0932
  6.   * @brief   
  7.   ******************************************************************************
  8.   * @attention
  9.   *
  10.   * Copyright (c) 2019. All rights reserved.
  11.   *
  12.   ******************************************************************************
  13.   */
  14. /* Define to prevent recursive inclusion -------------------------------------*/
  15. #define __UFUN_STEPPINGMOTOR_C__
  16. /* Includes ------------------------------------------------------------------*/
  17. #include "uFun_SteppingMotor.h"
  18. /* Private constants ---------------------------------------------------------*/
  19. /* Private defines -----------------------------------------------------------*/
  20. /* Private typedef -----------------------------------------------------------*/
  21. /* Private macro -------------------------------------------------------------*/
  22. /* Private variables ---------------------------------------------------------*/
  23. static uint8_t STEP_VALUE[8] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09};
  24. /* Private function prototypes -----------------------------------------------*/
  25. /* Exported variables --------------------------------------------------------*/
  26. /* Exported function prototypes ----------------------------------------------*/
  27. /**
  28. * @brief  :
  29. * @param  :
  30. * @returns:
  31. * @details:
  32. */
  33. void uFUN_SM_4P5L_SetPin(uint8_t value)
  34. {
  35.     if(value & 0x01)    HAL_GPIO_WritePin(ULN2003B_1B_GPIO_Port, ULN2003B_1B_Pin, GPIO_PIN_SET);
  36.     else                HAL_GPIO_WritePin(ULN2003B_1B_GPIO_Port, ULN2003B_1B_Pin, GPIO_PIN_RESET);
  37.     if(value & 0x02)    HAL_GPIO_WritePin(ULN2003B_2B_GPIO_Port, ULN2003B_2B_Pin, GPIO_PIN_SET);
  38.     else                HAL_GPIO_WritePin(ULN2003B_2B_GPIO_Port, ULN2003B_2B_Pin, GPIO_PIN_RESET);
  39.     if(value & 0x04)    HAL_GPIO_WritePin(ULN2003B_3B_GPIO_Port, ULN2003B_3B_Pin, GPIO_PIN_SET);
  40.     else                HAL_GPIO_WritePin(ULN2003B_3B_GPIO_Port, ULN2003B_3B_Pin, GPIO_PIN_RESET);
  41.     if(value & 0x08)    HAL_GPIO_WritePin(ULN2003B_4B_GPIO_Port, ULN2003B_4B_Pin, GPIO_PIN_SET);
  42.     else                HAL_GPIO_WritePin(ULN2003B_4B_GPIO_Port, ULN2003B_4B_Pin, GPIO_PIN_RESET);
  43. }
  44. /**
  45. * @brief  :
  46. * @param  :
  47. * @returns:
  48. * @details:
  49. */
  50. void uFUN_SM_4P5L_Running(uint8_t dir)
  51. {
  52.     uint8_t r = 0, d = 0, p = 0;
  53.     for(r = 0; r < 1; r++)
  54.     {
  55.         for(d = 0; d < 64; d++)
  56.         {
  57.             for(p = 0; p < 64; p++)
  58.             {
  59.                 if(dir) uFUN_SM_4P5L_SetPin(STEP_VALUE[(p % 8) - 0]);
  60.                 else    uFUN_SM_4P5L_SetPin(STEP_VALUE[7 - (p % 8)]);
  61.                 HAL_Delay(1);
  62.             }
  63.         }
  64.     }
  65. }
  66. /**
  67. * @brief  :
  68. * @param  :
  69. * @returns:
  70. * @details:
  71. */
  72. void uFUN_SM_2P4L_SetPWM(uint8_t index)
  73. {
  74.     switch(index)
  75.     {
  76.         case 0:
  77.             HAL_GPIO_WritePin(LV8549MC_IN1_GPIO_Port, LV8549MC_IN1_Pin, GPIO_PIN_SET);
  78.             HAL_GPIO_WritePin(LV8549MC_IN2_GPIO_Port, LV8549MC_IN2_Pin, GPIO_PIN_RESET);
  79.             break;
  80.         case 1:
  81.             HAL_GPIO_WritePin(LV8549MC_IN1_GPIO_Port, LV8549MC_IN1_Pin, GPIO_PIN_SET);
  82.             HAL_GPIO_WritePin(LV8549MC_IN2_GPIO_Port, LV8549MC_IN2_Pin, GPIO_PIN_SET);
  83.             break;
  84.         case 2:
  85.             HAL_GPIO_WritePin(LV8549MC_IN1_GPIO_Port, LV8549MC_IN1_Pin, GPIO_PIN_RESET);
  86.             HAL_GPIO_WritePin(LV8549MC_IN2_GPIO_Port, LV8549MC_IN2_Pin, GPIO_PIN_SET);
  87.             break;
  88.         case 3:
  89.             HAL_GPIO_WritePin(LV8549MC_IN1_GPIO_Port, LV8549MC_IN1_Pin, GPIO_PIN_RESET);
  90.             HAL_GPIO_WritePin(LV8549MC_IN2_GPIO_Port, LV8549MC_IN2_Pin, GPIO_PIN_RESET);
  91.             break;
  92.         default:
  93.             break;
  94.     }
  95. }
  96. /**
  97. * @brief  :
  98. * @param  :
  99. * @returns:
  100. * @details:
  101. */
  102. void uFUN_SM_2P4L_Running(uint8_t dir)
  103. {
  104.     uint8_t r = 0, d = 0, p = 0;
  105.     HAL_GPIO_WritePin(LV8549MC_ENA_GPIO_Port, LV8549MC_ENA_Pin, GPIO_PIN_SET);
  106.     for(r = 0; r < 1; r++)
  107.     {
  108.         for(d = 0; d < 32; d++)
  109.         {
  110.             for(p = 0; p < 16; p++)
  111.             {
  112.                 if(dir) uFUN_SM_2P4L_SetPWM((p % 4) - 0);
  113.                 else    uFUN_SM_2P4L_SetPWM(3 - (p % 4));
  114.                 HAL_Delay(1);
  115.             }
  116.         }
  117.     }
  118.     HAL_GPIO_WritePin(LV8549MC_ENA_GPIO_Port, LV8549MC_ENA_Pin, GPIO_PIN_RESET);
  119. }
  120. /************************ (C) COPYRIGHT ************************END OF FILE****/

6.工程代码

SteppingMotor.part2.rar (778.88 KB, 下载次数: 10)
举报
内容系网友发布,其中涉及到安全隐患的内容系网友个人行为,不代表面包板社区观点
请点击举报理由
关闭 站长推荐上一条 /2 下一条
  • 返回顶部