关于42步进电机驱动——基于STM32 HAL库实现

  • 我找了好多资料,好多关于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度。使用此,我们可以计算特定角度所需的步数。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值