stm32f103zet6和tb6612双路驱动控制电机
时间: 2025-04-18 14:38:46 浏览: 32
### STM32F103ZET6配合TB6612进行双通道直流电机驱动控制
#### 控制方案概述
STM32F103ZET6是一款高性能微控制器,能够通过PWM信号精确控制外部设备的工作状态。当与TB6612电机驱动模块结合时,可以高效地实现对两路直流电机的速度和方向控制[^1]。
#### 硬件连接说明
为了使STM32F103ZET6成功驱动两个直流电机,需按照如下方式连接硬件组件:
- 将TB6612上的`AIN1`, `BIN1`分别接到STM32的不同GPIO引脚上作为IN1, IN2输入端;
- 同样地,将`AIN2`, `BIN2`也对应接到其他不同的GPIO引脚上来构成IN3, IN4输入端;
- 把`PWMA`, `PWMB`接口接入到支持PWM功能的GPIO引脚(如PA6, PA7),以便于调节电机转速;
- 连接电源线VCC至适当电压源,并确保GND良好接地以维持电路稳定工作。
#### 软件编程指导
下面给出一段基于HAL库编写的简单示例代码片段,展示了如何设置并启动两个直流电机运转:
```c
#include "stm32f1xx_hal.h"
// 定义使用的GPIO引脚编号
#define MOTOR_A_IN1_PIN GPIO_PIN_0
#define MOTOR_A_IN2_PIN GPIO_PIN_1
#define MOTOR_B_IN1_PIN GPIO_PIN_2
#define MOTOR_B_IN2_PIN GPIO_PIN_3
#define PWM_CHANNEL_A TIM_Channel_1
#define PWM_CHANNEL_B TIM_Channel_2
void Motor_Init(void){
__HAL_RCC_GPIOA_CLK_ENABLE(); // 开启GPIOA时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* 初始化电机控制IO */
GPIO_InitStruct.Pin = MOTOR_A_IN1_PIN | MOTOR_A_IN2_PIN |
MOTOR_B_IN1_PIN | MOTOR_B_IN2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// 设置PWM输出频率为20kHz
uint32_t pwm_freq = 20000;
// 配置定时器TIM3用于生成PWM波形
__HAL_RCC_TIM3_CLK_ENABLE();
TIM_HandleTypeDef htim3;
htim3.Instance = TIM3;
htim3.Init.Prescaler = (SystemCoreClock / 1000000) - 1;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = ((htim3.Init.Prescaler + 1)*100/pwm_freq)-1 ;
if(HAL_TIM_PWM_Init(&htim3)!= HAL_OK){
Error_Handler();
}
// 配置PWM通道
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.Pulse = 0;
HAL_TIM_PWM_ConfigChannel(&htim3,&sConfigOC,PWM_CHANNEL_A);
HAL_TIM_PWM_ConfigChannel(&htim3,&sConfigOC,PWM_CHANNEL_B);
}
/* 函数名:SetMotorSpeedAndDirection
* 参数一:motor_select - 选择要操作哪个电机(A/B)
* 参数二:direction - 设定电机转动方向(正向/反向)
* 参数三:speed_percent - 指定速度百分比范围[0~100]
*/
void SetMotorSpeedAndDirection(char motor_select,int direction,float speed_percent){
int duty_cycle=(int)(speed_percent*htim3.Init.Period/100);
switch(motor_select){
case 'A':
if(direction>0){ // 正转
HAL_GPIO_WritePin(GPIOC,MOTOR_A_IN1_PIN| MOTOR_A_IN2_PIN,
GPIO_PIN_SET|MOTOR_A
阅读全文
相关推荐



















