当前位置:网站首页>[STM32] actual combat 3.1 - drive 42 stepper motors with STM32 and tb6600 drivers (I)

[STM32] actual combat 3.1 - drive 42 stepper motors with STM32 and tb6600 drivers (I)

2022-07-07 10:55:00 Goo Goo and melon

Catalog

0 Reference source

1 Expected effect of experiment

2 Hardware learning

2.1 TB6600 Driver

 2.1.1 Set the subdivision and current through the dial switch

2.1.2 Common Yin and common Yang wiring method

2.2 Switching Mode Power Supply (AC turn DC transformer )& power cord

2.3 42 Stepper motor

2.3.1 Basic knowledge

2.3.2 Speed subdivision control

2.3.3 Full step 、 half of step 、 Micro step driving principle

3 Software configuration and hardware wiring

3.1 STM32CubeMX Configuration of

3.1.1 Configure timer TIM2 ​ edit

3.1.2 Configure pins PA1

3.2 Wiring mode of the driver

3.3 Subdivision and current regulation

​ edit

4 Code writing

5 Final effect  

6 appendix

6.1 TB6600 Driver

6.1.1 Drive function

​6.1.2 connection

6.1.3 Common faults and Countermeasures

6.2 42 Dimension drawing and internal structure of stepping motor


0 Reference source

Reference blog :
        1、 utilize STM32F103 Accurately control the stepping motor _jl_mlh The blog of -CSDN Blog _stm32 Control stepping motor ;

        2、 Picture and text introduce the full step of stepping motor 、 half of step 、 Micro step driving principle - Shenzhen dongmochuan Servo Control Co., Ltd ;

        3、【STM32】stm32 drive TB6600 control 42/57 The case of stepping motor (TIM Break and PWM experiment )_ Ah Dan of maker Association ° The blog of -CSDN Blog _stm32 drive 42 Stepper motor program ;

        4、STM32 And TIM Timer drive 42 Stepper motor - Drive model TB6600_ For Lili's blog -CSDN Blog _stm32 drive 42 Stepper motor ;

Reference paper :

        1、 Houyanxia . The working principle of hybrid stepping motor and its PLC control ;

1 Expected effect of experiment

         Complete the forward rotation of the stepping motor ( No serial port control 、 Non removable power supply ).

2 Hardware learning

2.1 TB6600 Driver

         The information provided by a treasure store is as follows :        5932f0de44a34c488ba65673fb395e43.jpeg

 2.1.1 Set the subdivision and current through the dial switch

d22556d9c43841f1b51e544bc0572f9c.jpeg

d3ba9f4e8ec34cd9b7caf58c11d51128.jpeg

ea29477c990e435e99c1deba37f39262.jpeg

2.1.2 Common Yin and common Yang wiring method

06e71f7425fc464d84cdcf029f5b6607.jpeg

Common Yin :

        Driver   ——  stm32

        DIR- And PUL-  ——  GND
        DIR+ —— Direction pin
        PUL+ —— Pulse pin

Gongyang :

         Driver   ——  stm32

        DIR+ And PUL+  ——  +5V
        DIR- —— Direction pin
        PUL- ——  Pulse pin

2.2 Switching Mode Power Supply (AC turn DC transformer )& power cord

118b1401d800416094a41ebe179ee6ac.jpeg

8d5d8577f2b047cea80df897b0e04688.jpeg

2.3 42 Stepper motor

 9061c2df0478448488f62f193568067c.jpeg

2.3.1 Basic knowledge

         According to the information provided by the merchant :42 Step motor The number of phases is 2(A、B two-phase , The number of parallel branches per phase is 2, Each branch is connected in series 2 A coil ) The step angle is 1.8°( Full step ) The number of rotor teeth is 50.   

 b14f65bc204d46b8835613976b992fdd.png

         Every beat There is only one phase The winding is energized , Four beats Form a cycle . Above picture , Stator B phase Electrify , magnetic pole 2 Of 5 Teeth and rotor Tooth to tooth ( Here's the picture 4), The analysis shows that , magnetic pole 6 Same as rotor Tooth to tooth , And the magnetic pole 4 and 8 yes Tooth to groove ( Here's the picture 2). Lateral A phase Winding magnetic pole 3 Of 5 Teeth and rotor teeth have 1/4 Dislocation of tooth pitch ( Here's the picture 3), namely 1.8°(360°/50/4).

a57f604ebef54b67b3e58306bc9843da.png

04df32b35d49428faa101024de496976.jpeg

         When B Phase outage A When connected with electricity , magnetic pole 3 produce N Polarity , Attract the nearest S Pole rotor teeth , Make the rotor rotate clockwise 1.8°, Realization magnetic pole 3 And rotor Tooth to tooth , here magnetic pole 4 And rotor teeth 1/4 Dislocation of tooth pitch .

         By analogy, if you continue to energize in the order of four beats , The rotor rotates clockwise step by step , Once every power on ( That is, every pulse ) The rotor turns 1.8°, Namely The step angle is 1.8°, It takes 360°/1.8° =200 Pulse . Consistent with the table . 

fba126bed2af4bf5b1f6fb4cd0b24b41.png

【 Parameters and formulas can be found in the article : utilize STM32F103 Accurately control the stepping motor _jl_mlh The blog of -CSDN Blog 】 

        ① Number of beats (N=km)—— The number of power on States contained in each cycle ( The number of pulses required for the motor to turn a pitch angle );
              Single shot system (k=1)—— Number of beats = Phase number ; Two beat system (k=2)—— Number of beats = Twice the number of phases

        ②  Phase number (m)—— That is, inside the motor Number of coil groups . If you use Subdivision drive , be The number of phases will become meaningless , Just change the number of Subdivisions on the drive , You can change Step angle ;

        ③  Number of rotor teeth (Zr);

        ④  Step angle (θs)—— The stepper passes An electrical pulse The rotation angle of the rotor ;

52983822fcc14b0cababaafeb4a576a6.png

        ⑤  speed (n)

262b18b4d62d483b8a438f9c160b89bd.png

2.3.2 Speed subdivision control

         Motor's speed And Pulse frequency In direct proportion to , The motor turns angle And Number of pulses In direct proportion to . Therefore, the precise speed regulation can be achieved by controlling the number and frequency of pulses .

01332cefb2504ac9a673a1ce3f082c35.png

         f: Pulse frequency ;θs: Step angle ;X: Subdivision values ;n: speed (rad/s).

        If the step angle is known =1.8°, Subdivision values =32, Want to achieve 1rad/s Speed of ( One revolution per second ), Then the pulse frequency =1*32*360/1.8=6400, namely 6400 One pulse is one revolution , Consistent with the table given .

cad96f55e4f3405596cf75d6cc28828c.png

2.3.3 Full step 、 half of step 、 Micro step driving principle

【 This part is extracted from the article : Picture and text introduce the full step of stepping motor 、 half of step 、 Micro step driving principle 】 

         Full step drive ( Single shot full step drive and double shot full step drive  ):

dc20ebfcbf3015fef40825dd336e8c0b.png

         Half step drive :

c5ef93b3ab8acc698548d1c371d4576c.png

         The advantage of half step driving is to improve the resolution , But the disadvantage is that the torque is only driven in full step 70%, Of course , You can also optimize the current in the coil , To improve the half step driving torque . 

         Micro step drive : 

ce1763f382d089ed4aa47fb0b175830a.png

        The English on the picture is :With maximum power in phase A, phase B is at zero. The rotor will line up with phase A. As current to phase A decreases, it increases to phase B. The rotor will take small steps towards phase B until phase B is at its maximum and phase A is at zero. The process then continues around the other phases.

        Translated roughly means :A The coil begins to have maximum current ,B The coil current is 0, The rotor points A coil . If A The coil current decreases slowly ,B The coil current increases slowly , The rotor will turn slowly B coil .

         From a macro perspective ,A、B The current variation of the coil is close to the trigonometric function curve . The magnitude of each step of current change , Determines the size of the micro step movement . Although the more steps , The smoother the motion , But the torque will be reduced accordingly .

49b836869a231797c1543bc4e3fc829e.png

         The change of current at each step , Determines the size of micro step movement , On the right is 1/4,1/8,1/16 Schematic diagram of Microstep current change . 

99c0c1c281ec38ad38e7e208391008b9.png

         Examples of micro step movement : In the figure 1 in ,A The coil is full of current , chart 2 in A The coil is connected with the maximum current 0.92 times , and B The coil is connected with the maximum current 0.38 times , Realization 22.5° rotate . Empathy , chart 3 in ,A and B The coil is connected with the maximum current at the same time 0.71 times , Can achieve 45° rotate .

        The more steps , You can get The smoother The movement of , The less noise , It is not easy to lose step ( Lose step ), But the price is The torque is greatly reduced .

3 Software configuration and hardware wiring

3.1 STM32CubeMX Configuration of

【 See for basic configuration 【STM32】1— Zero basic hardware and software configuration & complete LED The twinkle of _ココの wonderful な My blog -CSDN Blog _stm32 Configuration software

         Schematic diagram : 

b98039d66c0d4e2280cf52c54403f9ae.jpeg

3.1.1 Configure timer TIM2 9929503180c44952a8f746ed9120c233.jpeg

1829662a2b724207b57846684f5e1a9c.jpeg

          Its output pin is PA0.

3.1.2 Configure pins PA1

        Because I hope it turns forward , Then pull the level up :

0993ae2fad5b4ae9b124d19ebdb16576.jpeg

3.2 Wiring mode of the driver

         Adopt common female connection :

ae6b29069e584cb2bb54deb6680e2014.jpeg

3.3 Subdivision and current regulation

        Relevant see 2.1.1 

f11b720b3d34413b8b900b8f6c81532e.jpeg

4 Code writing

【 Code reference blog STM32 And TIM Timer drive 42 Stepper motor - Drive model TB6600_stm32 drive 42 Stepper motor 】 

         On the basis of automatic code generation, you need to main.c add : 

          Defining variables :

int count;

         Turn on PWM Interrupt and pull up the pin ( The latter can be omitted ):

  HAL_TIM_PWM_Start_IT(&htim2,TIM_CHANNEL_1);
  HAL_GPIO_WritePin(DIR_GPIO_Port, DIR_Pin, GPIO_PIN_SET);	

          Count 1000 Stop after times :

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
  if(htim == &htim2)
	{
		if(count <1000)
		{
			count++;
		}
		else
		{					
			HAL_TIM_PWM_Stop_IT(&htim2, TIM_CHANNEL_1);
			count = 0;
		}
	}
}

         The total code is as follows : 

        main.c: 

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2022 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
int count;
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start_IT(&htim2,TIM_CHANNEL_1);
  HAL_GPIO_WritePin(DIR_GPIO_Port, DIR_Pin, GPIO_PIN_SET);	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 168;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
  if(htim == &htim2)
	{
		if(count <1000)
		{
			count++;
		}
		else
		{					
			HAL_TIM_PWM_Stop_IT(&htim2, TIM_CHANNEL_1);
			count = 0;
		}
	}
}


/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

        gpio.c:

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    gpio.c
  * @brief   This file provides code for the configuration
  *          of all used GPIO pins.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2022 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "gpio.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/*----------------------------------------------------------------------------*/
/* Configure GPIO                                                             */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
*/
void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(DIR_GPIO_Port, DIR_Pin, GPIO_PIN_SET);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = DIR_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(DIR_GPIO_Port, &GPIO_InitStruct);

}

/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

        tim.c:

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    tim.c
  * @brief   This file provides code for the configuration
  *          of the TIM instances.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2022 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "tim.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

TIM_HandleTypeDef htim2;

/* TIM2 init function */
void MX_TIM2_Init(void)
{

  /* USER CODE BEGIN TIM2_Init 0 */

  /* USER CODE END TIM2_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  /* USER CODE BEGIN TIM2_Init 1 */

  /* USER CODE END TIM2_Init 1 */
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 83;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 999;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 500;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM2_Init 2 */

  /* USER CODE END TIM2_Init 2 */
  HAL_TIM_MspPostInit(&htim2);

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM2)
  {
  /* USER CODE BEGIN TIM2_MspInit 0 */

  /* USER CODE END TIM2_MspInit 0 */
    /* TIM2 clock enable */
    __HAL_RCC_TIM2_CLK_ENABLE();

    /* TIM2 interrupt Init */
    HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM2_IRQn);
  /* USER CODE BEGIN TIM2_MspInit 1 */

  /* USER CODE END TIM2_MspInit 1 */
  }
}
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(timHandle->Instance==TIM2)
  {
  /* USER CODE BEGIN TIM2_MspPostInit 0 */

  /* USER CODE END TIM2_MspPostInit 0 */

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**TIM2 GPIO Configuration
    PA0-WKUP     ------> TIM2_CH1
    */
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN TIM2_MspPostInit 1 */

  /* USER CODE END TIM2_MspPostInit 1 */
  }

}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM2)
  {
  /* USER CODE BEGIN TIM2_MspDeInit 0 */

  /* USER CODE END TIM2_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_TIM2_CLK_DISABLE();

    /* TIM2 interrupt Deinit */
    HAL_NVIC_DisableIRQ(TIM2_IRQn);
  /* USER CODE BEGIN TIM2_MspDeInit 1 */

  /* USER CODE END TIM2_MspDeInit 1 */
  }
}

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

5 Final effect  

42 Rotation of stepping motor

6 appendix

6.1 TB6600 Driver

         The information provided by a treasure store is as follows :        

6.1.1 Drive function

582cf80617094e97b32a1826a9c303a3.jpeg

​6.1.2 connection

c44a356f4aa649899bc7dcd14c925f57.jpeg

6.1.3 Common faults and Countermeasures

a10ade1561634a0f9d33433a2a2223b5.jpeg

6.2 42 Dimension drawing and internal structure of stepping motor

965c5529a0834678acdbdb1ac53233d1.jpeg62b85598c3e94d3ba4a65ca50db1152b.jpeg

原网站

版权声明
本文为[Goo Goo and melon]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207070841196039.html