• 我找了好多资料,好多关于42步进电机的都是文档,这么文档都需要积分,需要积分就算了内容还非常差,浪费时间和电脑的内存。关于大部分是基于Arduino和51去驱动的

42步进电机驱动硬件如下

42步进电机python驱动 42步进电机驱动方式_引脚

首先你要了解步进电机的驱动原理,我也不啰嗦了,请看这边博客:

二相四线,四相五线,四相六线步进电机接线及驱动方法 ,

看完这篇你就知道驱动和接线的原理了。

起初我也为如何接线烦恼,因为有些博客在讲述这些问题的时候没有讲的很透彻。
方法如下:

  • ①用万用表调到欧姆档,用其中一个表笔搭在一个引脚上,依次测其它几个引脚当你发现有两个引脚的电阻值非常相近时,那两个引脚就为其中一组(A和~A,
    B和~B),而你那个用表笔固定的那个引脚就是COM端(A还是B要看情况);
    那么问题就来了,我不知道是什么原因,我测试的时候没有两个电阻值相近的两个引脚。
    我的个人解决措施为:用短路的测试方法,当两个引脚导通时,我就确定它们两个引脚为其中一组,这样我就确定了A组和B组,这样的线序和淘宝给的资料图上的线序相同。
  • 42步进电机python驱动 42步进电机驱动方式_引脚_02

  • 原理如下:A,A是连通的,B和B是连通的。那么,A和A是同一相a,B和B是同一相。
  • 42步进电机python驱动 42步进电机驱动方式_测试方法_03

  • 其中电机内部由八个物理上独立的线圈组成,因为只有四根电线,所以它们只有两个线圈,
  • 42步进电机python驱动 42步进电机驱动方式_42步进电机python驱动_04

  • 现在我将采用A4988驱动电路板对步进电机进行驱动
  • A4988驱动电路板如图所示:

42步进电机python驱动 42步进电机驱动方式_引脚_05

接下来我将介绍怎么样接线:

  • ENA为使能端(低电平有效)
  • STEP为步进信号输入端(可采用PWM,也可采用IO引脚高低电平转换)
  • DIR为步进电机方向控制IO (高电平为顺势正 ,低电平为逆时针)
  • VDD为模块的逻辑电压3V3或5V(必须接)
  • VMOT为步进电机的输入电压(8V-35V)
  • 1A、1B为同一相 , 2A、2B为同一相(不能接反,否则电机会出现抖动的情况)
  • 在VMOT电压输入端,并联一个47uF以上的电容,滤波防止保持压值稳定
  • 如果不使用SLEEP睡眠模式请将SLEEP与RESET短接

接线的图我就不发了, 我做完就把线拆了, 线也有点乱,这里有个大概图,但是本人亲测图里的接线有问题(当然其实STM32系列的单片机也是一样的):

42步进电机python驱动 42步进电机驱动方式_步进电机_06

我使用的开发环境石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度。使用此,我们可以计算特定角度所需的步数。