本帖最后由 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线步进电机的正反转。
/**
  • * @brief  :
  • * @param  :
  • * @returns:
  • * @details:
  • */
  • void KEY_Handler(uint8_t value, eKEY_TYPE type)
  • {
  •     gtKey.type = type;
  •     gtKeyValue = (eKEY_VALUE)value;
  •     switch(gtKeyValue)
  •     {
  •         case KEY_VALUE_0_R:
  •             printf("Key right event\r\n"); uFUN_SM_2P4L_Running(1); break;
  •         case KEY_VALUE_1_U:
  •             printf("Key up    event\r\n"); uFUN_SM_4P5L_Running(1); break;
  •         case KEY_VALUE_2_L:
  •             printf("Key left  event\r\n"); uFUN_SM_2P4L_Running(0); break;
  •         case KEY_VALUE_3_D:
  •             printf("Key down  event\r\n"); uFUN_SM_4P5L_Running(0); break;
  •         default : break;
  •     }
  • }
  • 复制代码
    /**
  •   ******************************************************************************
  •   * @file    uFun_SteppingMotor.c
  •   * @version V1.00
  •   * @author  xld0932
  •   * @brief   
  •   ******************************************************************************
  •   * @attention
  •   *
  •   * Copyright (c) 2019. All rights reserved.
  •   *
  •   ******************************************************************************
  •   */
  • /* Define to prevent recursive inclusion -------------------------------------*/
  • #define __UFUN_STEPPINGMOTOR_C__
  • /* Includes ------------------------------------------------------------------*/
  • #include "uFun_SteppingMotor.h"
  • /* Private constants ---------------------------------------------------------*/
  • /* Private defines -----------------------------------------------------------*/
  • /* Private typedef -----------------------------------------------------------*/
  • /* Private macro -------------------------------------------------------------*/
  • /* Private variables ---------------------------------------------------------*/
  • static uint8_t STEP_VALUE[8] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09};
  • /* Private function prototypes -----------------------------------------------*/
  • /* Exported variables --------------------------------------------------------*/
  • /* Exported function prototypes ----------------------------------------------*/
  • /**
  • * @brief  :
  • * @param  :
  • * @returns:
  • * @details:
  • */
  • void uFUN_SM_4P5L_SetPin(uint8_t value)
  • {
  •     if(value & 0x01)    HAL_GPIO_WritePin(ULN2003B_1B_GPIO_Port, ULN2003B_1B_Pin, GPIO_PIN_SET);
  •     else                HAL_GPIO_WritePin(ULN2003B_1B_GPIO_Port, ULN2003B_1B_Pin, GPIO_PIN_RESET);
  •     if(value & 0x02)    HAL_GPIO_WritePin(ULN2003B_2B_GPIO_Port, ULN2003B_2B_Pin, GPIO_PIN_SET);
  •     else                HAL_GPIO_WritePin(ULN2003B_2B_GPIO_Port, ULN2003B_2B_Pin, GPIO_PIN_RESET);
  •     if(value & 0x04)    HAL_GPIO_WritePin(ULN2003B_3B_GPIO_Port, ULN2003B_3B_Pin, GPIO_PIN_SET);
  •     else                HAL_GPIO_WritePin(ULN2003B_3B_GPIO_Port, ULN2003B_3B_Pin, GPIO_PIN_RESET);
  •     if(value & 0x08)    HAL_GPIO_WritePin(ULN2003B_4B_GPIO_Port, ULN2003B_4B_Pin, GPIO_PIN_SET);
  •     else                HAL_GPIO_WritePin(ULN2003B_4B_GPIO_Port, ULN2003B_4B_Pin, GPIO_PIN_RESET);
  • }
  • /**
  • * @brief  :
  • * @param  :
  • * @returns:
  • * @details:
  • */
  • void uFUN_SM_4P5L_Running(uint8_t dir)
  • {
  •     uint8_t r = 0, d = 0, p = 0;
  •     for(r = 0; r < 1; r++)
  •     {
  •         for(d = 0; d < 64; d++)
  •         {
  •             for(p = 0; p < 64; p++)
  •             {
  •                 if(dir) uFUN_SM_4P5L_SetPin(STEP_VALUE[(p % 8) - 0]);
  •                 else    uFUN_SM_4P5L_SetPin(STEP_VALUE[7 - (p % 8)]);
  •                 HAL_Delay(1);
  •             }
  •         }
  •     }
  • }
  • /**
  • * @brief  :
  • * @param  :
  • * @returns:
  • * @details:
  • */
  • void uFUN_SM_2P4L_SetPWM(uint8_t index)
  • {
  •     switch(index)
  •     {
  •         case 0:
  •             HAL_GPIO_WritePin(LV8549MC_IN1_GPIO_Port, LV8549MC_IN1_Pin, GPIO_PIN_SET);
  •             HAL_GPIO_WritePin(LV8549MC_IN2_GPIO_Port, LV8549MC_IN2_Pin, GPIO_PIN_RESET);
  •             break;
  •         case 1:
  •             HAL_GPIO_WritePin(LV8549MC_IN1_GPIO_Port, LV8549MC_IN1_Pin, GPIO_PIN_SET);
  •             HAL_GPIO_WritePin(LV8549MC_IN2_GPIO_Port, LV8549MC_IN2_Pin, GPIO_PIN_SET);
  •             break;
  •         case 2:
  •             HAL_GPIO_WritePin(LV8549MC_IN1_GPIO_Port, LV8549MC_IN1_Pin, GPIO_PIN_RESET);
  •             HAL_GPIO_WritePin(LV8549MC_IN2_GPIO_Port, LV8549MC_IN2_Pin, GPIO_PIN_SET);
  •             break;
  •         case 3:
  •             HAL_GPIO_WritePin(LV8549MC_IN1_GPIO_Port, LV8549MC_IN1_Pin, GPIO_PIN_RESET);
  •             HAL_GPIO_WritePin(LV8549MC_IN2_GPIO_Port, LV8549MC_IN2_Pin, GPIO_PIN_RESET);
  •             break;
  •         default:
  •             break;
  •     }
  • }
  • /**
  • * @brief  :
  • * @param  :
  • * @returns:
  • * @details:
  • */
  • void uFUN_SM_2P4L_Running(uint8_t dir)
  • {
  •     uint8_t r = 0, d = 0, p = 0;
  •     HAL_GPIO_WritePin(LV8549MC_ENA_GPIO_Port, LV8549MC_ENA_Pin, GPIO_PIN_SET);
  •     for(r = 0; r < 1; r++)
  •     {
  •         for(d = 0; d < 32; d++)
  •         {
  •             for(p = 0; p < 16; p++)
  •             {
  •                 if(dir) uFUN_SM_2P4L_SetPWM((p % 4) - 0);
  •                 else    uFUN_SM_2P4L_SetPWM(3 - (p % 4));
  •                 HAL_Delay(1);
  •             }
  •         }
  •     }
  •     HAL_GPIO_WritePin(LV8549MC_ENA_GPIO_Port, LV8549MC_ENA_Pin, GPIO_PIN_RESET);
  • }
  • /************************ (C) COPYRIGHT ************************END OF FILE****/
  • 复制代码

    6.工程代码

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