收到TB67S109A电机驱动板有段时间,前段时间忙于准备CES展会的样品,因此没多的时间,现在停下来使用该款电机驱动板来驱动一下二相四线式步进电机。本次使用的电机驱动板是由北京芯时代电子提供的,该双极微步电机评估板与市场上出售的电机驱动器外观上虽不大一样,但其功能上大同小异,也有细分设置,电流设置。主控TB67S109A上还布设了散热器,支持9V~42V的输入电压。
      这款驱动芯片是采用HTSSOP封装,48脚的分布如下:
顶视图.png
芯片管脚定义.png
       该控制板的功能结构框图如下图所示:
功能结构框图.png
      板上的细分设置可通过拨码开关进行设置,而电流大小设置可通过旋转变阻器设置。
步分辨率设置.png
        此次使用的主控板是基于STM32C031C6开发板,主控板与驱动板的连线示意图如下:
连接示意图.png
           使用STM32CubeMX生成一个简易的工程,这里实现电机控制即可。部分参考代码如下:
  1. /**
  2.   * @brief TIM3 Initialization Function
  3.   * @param None
  4.   * @retval None
  5.   */
  6. static void MX_TIM3_Init(uint16_t Prescaler,uint16_t period)
  7. {

  8.   /* USER CODE BEGIN TIM3_Init 0 */

  9.   /* USER CODE END TIM3_Init 0 */

  10.   TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  11.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  12.   TIM_OC_InitTypeDef sConfigOC = {0};

  13.   /* USER CODE BEGIN TIM3_Init 1 */

  14.   /* USER CODE END TIM3_Init 1 */
  15.   htim3.Instance = TIM3;
  16.   htim3.Init.Prescaler = Prescaler;//41-1;//84-1;
  17.   htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  18.   htim3.Init.Period = period;//1000;
  19.   htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  20.   htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  21.   if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  22.   {
  23.     Error_Handler();
  24.   }
  25.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  26.   if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  27.   {
  28.     Error_Handler();
  29.   }
  30.   if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  31.   {
  32.     Error_Handler();
  33.   }
  34.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  35.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  36.   if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  37.   {
  38.     Error_Handler();
  39.   }
  40.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  41.   sConfigOC.Pulse = 500;
  42.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  43.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  44.   if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  45.   {
  46.     Error_Handler();
  47.   }
  48.   /* USER CODE BEGIN TIM3_Init 2 */

  49.   /* USER CODE END TIM3_Init 2 */
  50.   HAL_TIM_MspPostInit(&htim3);

  51. }
  1. /**
  2.   * @brief  Starts the PWM signal generation.
  3.   * @param  htim TIM handle
  4.   * @param  Channel TIM Channels to be enabled
  5.   *          This parameter can be one of the following values:
  6.   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
  7.   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
  8.   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
  9.   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
  10.   *            @arg TIM_CHANNEL_5: TIM Channel 5 selected
  11.   *            @arg TIM_CHANNEL_6: TIM Channel 6 selected
  12.   * @retval HAL status
  13.   */
  14. HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
  15. {
  16.   uint32_t tmpsmcr;

  17.   /* Check the parameters */
  18.   assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

  19.   /* Check the TIM channel state */
  20.   if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY)
  21.   {
  22.     return HAL_ERROR;
  23.   }

  24.   /* Set the TIM channel state */
  25.   TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);

  26.   /* Enable the Capture compare channel */
  27.   TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);

  28.   if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
  29.   {
  30.     /* Enable the main output */
  31.     __HAL_TIM_MOE_ENABLE(htim);
  32.   }

  33.   /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
  34.   if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
  35.   {
  36.     tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
  37.     if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
  38.     {
  39.       __HAL_TIM_ENABLE(htim);
  40.     }
  41.   }
  42.   else
  43.   {
  44.     __HAL_TIM_ENABLE(htim);
  45.   }

  46.   /* Return function status */
  47.   return HAL_OK;
  48. }
  1. int main(void)
  2. {
  3.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  4.   HAL_Init();

  5.   /* USER CODE BEGIN Init */

  6.   /* USER CODE END Init */

  7.   /* Configure the system clock */
  8.   SystemClock_Config();

  9.   /* USER CODE BEGIN SysInit */
  10.         HAL_NVIC_SetPriority(SysTick_IRQn,0,0);
  11.   /* USER CODE END SysInit */

  12.   /* Initialize all configured peripherals */
  13.   MX_GPIO_Init();
  14.   MX_I2C1_Init();
  15.   MX_TIM3_Init(11-1,1000);
  16.   HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
  17.   while (1)
  18.   {
  19.   }
  20. }
         实物的硬件连接如下图所示:
整体连线.jpg
     这里着重细看板上的引脚连接,只用到EN,CLK、DIR、GND四根杜邦线与主控板连接,驱动板的输入电源采用12V直流适配器,电机是比较常见的两相四线步进电机。
接线.jpg
     工程编译后,由于STM32C031C6主控板上已经集成了ST-Link调试器,因此可直接将可执行文件下载到STM32C031C6主控中,然后将TB67S109A电机驱动板上电,重启主控板,则能看到42步进电机逆时针缓慢旋转,可通过拨码开发设置步长细分,旋转定位器可控制电机的停止与启动。