1.项目背景
当前公司预研的项目使用到步进电机来调节核心部件参数的功能,硬件还没有投入进来,所以软件为了赶进度,就结合当前手头上uFun开发板扩展了一块控制步进电机的扩展板。
步进电机扩展板可以驱动两种类型的步进电机,一种是4相5线的步进电机,采用ULN2003BDR芯片驱动;另一种是2相4线的步进电机,采用LV8549MC-AH芯片驱动。
需要注意的是4相5线的是单极性(线圈中电流的流动方向是固定的)的步进电机,而2相4线的是双极性的步进电机,使用ULN2003BDR芯片是无法驱动2相4线的步进电机。
2.硬件设计
硬件设计使用的是嘉立创的EDA软件,为什么选它?可能是因为容易上手吧,方便找元件、买元件。不过在做Mini-PCIe接口封装时,还是花了点时间,因为没有手册说明,只能借鉴前人的设计经验来画了。硬件原理比较简单,如下些图所示。
2.1.硬件原理图设计
2.2.硬件PCB设计
3.回板焊接调试
3.1.回板
回板后还是比较紧张的,因为Mini-PCIe的接口封装第一次做,之前没有画过。还有一个是扩展板的厚度,要求的是1mm,怕松了或者紧了……所以回板后第一件是就把扩展板插到Mini-PCIe插槽中试了一下安装,确认无误后,悬着的心算是放下来了。
3.2.焊接
扩展板需要焊接的元器件比较少,只准备了2套元器件,和同事一起焊接的,1人1套,如下图是我的焊接成果
3.3.调试
调试第一步:编写驱动代码,这个时候还没有将步进电机插到扩展板上,驱动编写,将程序下载到板子,通过示波器确认波形。如下图是驱动LV8549MC-AH芯片的波形图:
调试第二步:连接步进电机,尝试让其转动起来。在调试的时候,4相5线的步进电机一下子就动起来了。但是2相4线的就是在震动,并没有转动起来,通过硬件原理图和电机手册的比对,发现连接的线序不对,经过调整后,2相4线的步进电机也成功转动起来了。
4.STM32CubeMX设置
根据原理图设计对使用到的GPIO进行初始化配置。
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.工程代码
举报
内容系网友发布,其中涉及到安全隐患的内容系网友个人行为,不代表面包板社区观点
关闭
站长推荐 /2
- 返回顶部