- 我找了好多资料,好多关于42步进电机的都是文档,这么文档都需要积分,需要积分就算了内容还非常差,浪费时间和电脑的内存。关于大部分是基于Arduino和51去驱动的
42步进电机驱动硬件如下:
首先你要了解步进电机的驱动原理,我也不啰嗦了,请看这边博客:
二相四线,四相五线,四相六线步进电机接线及驱动方法 ,
看完这篇你就知道驱动和接线的原理了。
起初我也为如何接线烦恼,因为有些博客在讲述这些问题的时候没有讲的很透彻。
方法如下:
-
①用万用表调到欧姆档,用其中一个表笔搭在一个引脚上,依次测其它几个引脚当你发现有两个引脚的电阻值非常相近时,那两个引脚就为其中一组(A和~A,
B和~B),而你那个用表笔固定的那个引脚就是COM端(A还是B要看情况);
那么问题就来了,我不知道是什么原因,我测试的时候没有两个电阻值相近的两个引脚。我的个人解决措施为:用短路的测试方法,当两个引脚导通时,我就确定它们两个引脚为其中一组,这样我就确定了A组和B组,这样的线序和淘宝给的资料图上的线序相同。
原理如下:A,A是连通的,B和B是连通的。那么,A和A是同一相a,B和B是同一相。
其中电机内部由八个物理上独立的线圈组成,因为只有四根电线,所以它们只有两个线圈,
现在我将采用A4988驱动电路板对步进电机进行驱动 -
A4988驱动电路板如图所示:
接下来我将介绍怎么样接线:
-
ENA为使能端(低电平有效)
-
STEP为步进信号输入端(可采用PWM,也可采用IO引脚高低电平转换)
-
DIR为步进电机方向控制IO (高电平为顺势正 ,低电平为逆时针)
-
VDD为模块的逻辑电压3V3或5V(必须接)
-
VMOT为步进电机的输入电压(8V-35V)
-
1A、1B为同一相 , 2A、2B为同一相(不能接反,否则电机会出现抖动的情况)
-
在VMOT电压输入端,并联一个47uF以上的电容,滤波防止保持压值稳定
-
如果不使用SLEEP睡眠模式请将SLEEP与RESET短接
接线的图我就不发了, 我做完就把线拆了, 线也有点乱,这里有个大概图,但是本人亲测图里的接线有问题(当然其实STM32系列的单片机也是一样的):
我使用的开发环境石STM32CUBEIDE1.4.0,测试代码如下:
HAL_TIM_Base_Start(&htim4);
void BSP_DelayUs(uint32_t nus)
{
htim1.Instance = TIM1;
htim1.Init.Prescaler = 180 - 1;
htim1.Init.CounterMode = TIM_COUNTERMODE_DOWN;
htim1.Init.Period = nus;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_Base_Init(&htim1);
HAL_TIM_Base_Start(&htim1);
while (__HAL_TIM_GET_COUNTER(&htim1) > 0)
;
HAL_TIM_Base_Stop(&htim1);
}
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, RESET);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
for(uint8_t x= 0; x<200;x++)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, RESET);
HAL_GPIO_WritePin(Step_GPIO_Port, Step_Pin, SET);
BSP_DelayUs(1000);
HAL_GPIO_WritePin(Step_GPIO_Port, Step_Pin, RESET);
BSP_DelayUs(1000);
}
HAL_Delay(5000);
for(uint8_t x= 0; x<400;x++)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, SET);
HAL_GPIO_WritePin(Step_GPIO_Port, Step_Pin, SET);
BSP_DelayUs(1000);
HAL_GPIO_WritePin(Step_GPIO_Port, Step_Pin, RESET);
BSP_DelayUs(1000);
}
HAL_Delay(5000);
}
关于代码就不得不谈,关于步进电机全驱,半驱以及更细分的;
- 我们现在这个状态是全驱模式每转200步, 两个线圈都是工作的能够产生更高的转矩
- 半驱状态:将全驱和波驱的状态结合起来,分辨率从每转200步增加到400步
- 接下来就划分到1/4 , 1/8 …等等
现在这个程序中,每次STEP引脚捕捉高电平一次,电机则前进一步,基本上,电动机需要200步才能完成1转。这意味着360度为200个序列。每个序列将转换为1.8度。使用此,我们可以计算特定角度所需的步数。