STM32用TB6612驱动电机(智能家居系列二)

本文详细介绍了如何使用STM32C8T6主控板通过TB6612驱动电机,包括接线说明和STM32的代码实现,旨在帮助读者理解和实现电机控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        本篇文章主要讲解主控板为STM32,利用TB6612驱动来驱动电机的整个流程,看完点个赞吧!

        一、TB6612接线

PWMA---连接代码中的PB0口                                   VM------接10V以内电压

AIN2-----接代码中的PB3口                                       VCC-----接5V

AIN1-----接代码中的P7口                                         GND-----接地

STBY----连接5V                                                        A01-----连接电机1

BIN1---  接单片机I/O                                                 A02-----连接电机1

BIN2---- 接单片机I/O                                                B2------连接电机2

PWMB---接单片机PWM口                                       B1------连接电机2

GND-----接地                                                            GND----接地
 

        代码我们先放后面来讲吧,我们这里先讲如何接线的,我使用的是STM32C8T6,原理图具体看这个专栏的上一篇博客 《智能家居系列一》,这里不再附图啦。

          首先呢整个驱动需要接的口(对我使用的而言)是:PWMA ,AIN1,AIN2,STBY,VM ,VCC,A01, A02,三个GND(要与单片机共地!)

        我只使用了一个电机,所以咱们的PWA口直接接到单片机的随便一个PWM口就行,我接的是PB0口,也就是TIM3,CH3 定时器3通道3。然后AIN1,AIN2,这两个口是控制正反转的,随便接单片机的I/O口,然后进行初始化就行了,STBY口直接接5V口(STBY是使能,高电平电机才能转,低电平电机是不会转的,所以直接接电压即可),最后A01和A02接电机的两根正负线即可,接电机的正负无所谓,别把单片机接错就行啦!(如果要使用第二个电机,PWMB接PWM口,其他的照抄,只是序号变了)

        这是我使用的驱动

        然后我们看一下真值表,方便大家控制正反转

        二、STM32代码部分

MOTOR.C

#include "stm32f10x.h"
#include "MOTOR.h"
#include "sys.h" 
#include "delay.h"
void Motor_AIN(void)
 {
  GPIO_InitTypeDef GPIO_InitStructure;  
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_7; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_7); 
 }

 
void Motor_ZHENG(void)           //风扇正转
{
 GPIO_SetBits(GPIOB,GPIO_Pin_7);
 GPIO_ResetBits(GPIOB,GPIO_Pin_3);
}


void Motor_OFF(void)           //风扇停止
{
 GPIO_ResetBits(GPIOB,GPIO_Pin_3);
 GPIO_ResetBits(GPIOB,GPIO_Pin_7);
}

MOTOR.h

#ifndef __MOTOR_H
#define __MOTOR_H	 
#include "sys.h"
		
void Motor_AIN(void);
void Motor_ZHENG(void);
void Motor_OFF(void);


#endif

time.c

#include "stm32f10x.h"
#include "stdlib.h"
#include "stm32f10x_tim.h"
#include "led.h"
#include "myiic.h"
#include "key.h"
#include "delay.h"
#include "usart.h"	 
#include "time.h"
int pwm_L,pwm_R,change_pwm,eco_counter;
float get_ang,now_ang;
u8 place_flag,choose_num1=0,choose_num2=0,cargo_num,stop_flag,go_where,Return_stopflag;
u8 MOD1=0,MOD2=0,MOD3=0,MOD4=0;

void TIM3_PWM_Init(u16 arr,u16 psc)///pwm
{
	GPIO_InitTypeDef GPIO_InitStrue;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

	GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStrue.GPIO_Pin=GPIO_Pin_0;//PB0->CH3 
	GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStrue);
	
	TIM_TimeBaseStructure.TIM_Period = arr; 
	TIM_TimeBaseStructure.TIM_Prescaler =psc; 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 
	
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low ; 
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OC3Init(TIM3,&TIM_OCInitStructure);
	TIM_OC4Init(TIM3,&TIM_OCInitStructure);
	
	TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
	TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
	TIM_Cmd(TIM3,ENABLE);
}


time.h

#ifndef __TIME_H
#define __TIME_H	 
#include "sys.h"



extern int pwm_L,pwm_R,change_pwm;
extern float get_ang,now_ang;
extern u8 place_flag,choose_num1,choose_num2,cargo_num,MOD1,MOD2,MOD3,MOD4,stop_flag,go_where,Return_stopflag,go_where;
void Encoder_Init_TIM3(void);
int ReadLeft_Encoder(void);
int ReadRight_Encoder(void);
void TIM1_PWM_Init(u16 arr,u16 psc);
void TIM4_PWM_Init(u16 arr,u16 psc);
void TIM3_PWM_Init(u16 arr,u16 psc);		



#endif

mian.c

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"	 
#include "time.h"
#include "myiic.h"
#include "oled.h"
#include "beep.h"
#include "SR602.h"
#include "dht11.h"
#include "MOTOR.h"
int i=0;
u8 string[30] = {0},string1[30] = {0};
 int main(void)
{	 	
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先
		delay_init();//延时函数初始化	
	
		TIM3_PWM_Init(999,71);//定时器3初始化
		Motor_AIN();//风扇I/O初始化
	 while(1)
	 {		    
		 		Motor_ZHENG();
				TIM_SetCompare3(TIM3,1000);//设置占空比

	 }
	}		

把这些代码加到工程里面去,电机就能转动啦,有问题欢迎大家评论区提问,谢谢大家的阅读。

### TB6612STM32的连接方法 为了实现STM32电机的有效控制,通常会采用TB6612驱动芯片来间接控制电机的工作状态。这是因为GPIO接口无法提供足够的电流和电压去直接驱动电机工作。 #### 硬件连接说明 在硬件连接方面,TB6612有多个引脚用于接收来自微控制器(如STM32)的信号以及向外部电源供电给电机。具体来说: - **IN1/IN2 和 IN3/IN4**:这两个输入端分别对应两个直流电机的方向控制。当其中一个为高电平而另一个为低电平时,相应的电机将以特定方向旋转;如果两者均为相同逻辑电平,则该电机停止转动[^1]。 - **PWMA/PWMB**:这些引脚接受PWM波形作为速度调节机制的一部分。通过改变占空比可以调整施加到电机上的平均功率从而达到调速的目的。 - **STBY (Standby)**:此引脚决定了整个IC是否处于待机模式还是正常操作模式。将其拉至高电位可以使能所有功能并允许其他命令生效。 对于STM32而言,其通用I/O口能够很方便地配置成推挽输出形式以匹配上述需求,并且内部定时器单元支持生成精确可编程宽度变化的脉冲序列即PWM信号[^2]。 因此,在实际应用中,可以通过如下方式完成基本连线: | STM32 Pin | Function | Connected To | |-----------|-------------------|--------------| | GPIO | Motor Direction A | TB6612 IN1 | | GPIO | Motor Direction B | TB6612 IN2 | | TIM PWM | Speed Control A | TB6612 PWMA | | GPIO | Standby Enable | TB6612 STBY | 同样的设置适用于第电机通道(IN3, IN4 及 PWMB),只需重复以上过程即可。 ```cpp // 配置TIMx为PWM模式示例代码片段 void MX_TIMx_PWM_Init(TIM_HandleTypeDef* htim) { __HAL_RCC_TIMx_CLK_ENABLE(); // 初始化TIMx实例... } ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dandelion701

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值