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 Schematic_uFun-StepMotor.png](https://static.assets-stash.eet-china.com/forum/201906/04/135944li7xsb7es7sycsdz.png)
2.2.硬件PCB设计
![PCB_uFun-StepMotor_TOP.png PCB_uFun-StepMotor_TOP.png](https://static.assets-stash.eet-china.com/forum/201906/04/140006uw2lpv4noj54vrnb.png)
![PCB_uFun-StepMotor_BOTTOM.png PCB_uFun-StepMotor_BOTTOM.png](https://static.assets-stash.eet-china.com/forum/201906/04/140006sgeer2m9gghrfii2.png)
3.回板焊接调试
3.1.回板
回板后还是比较紧张的,因为Mini-PCIe的接口封装第一次做,之前没有画过。还有一个是扩展板的厚度,要求的是1mm,怕松了或者紧了……所以回板后第一件是就把扩展板插到Mini-PCIe插槽中试了一下安装,确认无误后,悬着的心算是放下来了。
![1.jpg 1.jpg](https://static.assets-stash.eet-china.com/forum/201906/04/140050pnczvtcpaignta8n.jpg)
![2.jpg 2.jpg](https://static.assets-stash.eet-china.com/forum/201906/04/140050yqbyjfzymz5y55wq.jpg)
3.2.焊接
扩展板需要焊接的元器件比较少,只准备了2套元器件,和同事一起焊接的,1人1套,如下图是我的焊接成果
![](static/image/smiley/default/lol.gif)
![3.jpg 3.jpg](https://static.assets-stash.eet-china.com/forum/201906/04/140159qjijhp98diymiqoa.jpg)
3.3.调试
调试第一步:编写驱动代码,这个时候还没有将步进电机插到扩展板上,驱动编写,将程序下载到板子,通过示波器确认波形。如下图是驱动LV8549MC-AH芯片的波形图:
![TEK0000.BMP TEK0000.BMP](https://static.assets-stash.eet-china.com/forum/201906/04/140159j42bd519bc9bvudo.bmp)
调试第二步:连接步进电机,尝试让其转动起来。在调试的时候,4相5线的步进电机一下子就动起来了。但是2相4线的就是在震动,并没有转动起来,通过硬件原理图和电机手册的比对,发现连接的线序不对,经过调整后,2相4线的步进电机也成功转动起来了。
![4.jpg 4.jpg](data/attachment/forum/201906/04/134342qszc0hr2st89rrta.jpg)
4.STM32CubeMX设置
根据原理图设计对使用到的GPIO进行初始化配置。
![5.png 5.png](data/attachment/forum/201906/04/134748ii3e5hjqovnhrq5i.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.工程代码
![](static/image/filetype/rar.gif)
举报
内容系网友发布,其中涉及到安全隐患的内容系网友个人行为,不代表面包板社区观点
关闭
站长推荐
/3
![上一条 上一条](static/image/common/pic_nv_prev.gif)
![下一条 下一条](static/image/common/pic_nv_next.gif)
-
返回顶部
-