TB6612FNG介绍
单片机引脚的电流一般只有几十个毫安,无法驱动电机,因此一般是通过单片机控制电机驱动芯片进而控制电机。TB6612是比较常用的电机驱动芯片之一。
TB6612FNG可以同时控制两个电机,工作电流1.2A,最大电流3.2A。
AIN1/2、BIN1/2接单片机的GPIO口。PWMA/B接单片机的定时器口(配置为定时器pwm)。AO1/2、BO1/2接电机的正负极。
PWMA、AIN1/2、AO1/2为一组驱动一个电机, PWMB、BIN1/2、BO1/2为一组驱动另一个电机。
STBY为正常工作、待机状态控制引脚,一般接3.3V电即可。VM为电机驱动电压输入(<10V),VCC为逻辑电平输入端(2.7V~5.5V)。
编码器直流电机
编码器直流电机是一种通过霍尔元件检测电机转速的直流电机。普通电机只有两个引脚,但编码器电机一边有六根引脚。其中两根控制电机正反转,其余四根用于编码器供电和型号传输。
编码器的四根线不接,就可以当作普通电机使用。
M+、M-为控制电机正反转引脚。其余四个为编码器引脚。本文暂时介绍TB6612FNG驱动电机,编码器部分以后再介绍。
STM32接线与代码讲解
本文使用STM32F103C8T6核心板连接TB6612FNG驱动普通直流电机和带编码器直流电机。
接线图
官方数据手册接线图
以接一个电机为例,选择两个GPIO口分别连接TB6612FNG的AIN1/2,这两个引脚没有什么讲究,能够推挽输出就行,这里选择PA4、PA5。紧接着选择一个定时器引脚连接驱动的PWMA,这里选择PA2输出PWM。驱动上的VM接5V,STBY、VCC接3.3V。
C8T6官方数据手册中PA2可以作为定时器2通道3的引脚,可以输出PWM。接线图如下。
代码
本文以正点原子模板为例。
首先建立两个C文件和两个H文件,分别命名为MOTOR和PWM。MOTOR用于控制电机的正反转,PWM用于控制电机的转速。
void Motor_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
PWM_Init();
}
电机正反转引脚配置(PA4/5推挽输出)
void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启定时器2的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIO时钟
/********** TIM2引脚的GPIO配置 **********/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //对定时器GPIO设置为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_InternalClockConfig(TIM2);
/********** TIM2配置 **********/
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //TIM2配置
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //自动重装载值 ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1; //设置预分频值 PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
//C8T6的主频为72MHZ,设置的PWM频率为 72M/((ARR+1)*(PSC+1))=72M/(100*36)=20KHZ
/********** TIM2的通道3配置 **********/
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//PWM1模式
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //设置极性为高
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //CCR
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_Cmd(TIM2, ENABLE); //使能TIM2
}
PWM初始化
/********** 占空比设置 **********/
void PWM_SetCompare3(int16_t Compare)
{
TIM_SetCompare3(TIM2, Compare);
}
设置占空比
/******** 设置电机转动 *****/
void Motor_SetSpeed(int8_t Speed) //设置电机转速,有符号量,正反转
{
if (Speed >= 0)
{
GPIO_SetBits(GPIOA, GPIO_Pin_4);
GPIO_ResetBits(GPIOA, GPIO_Pin_5);
PWM_SetCompare3(Speed); //将速度值传到占空比
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
GPIO_SetBits(GPIOA, GPIO_Pin_5);
PWM_SetCompare3(-Speed); //将速度值传到占空比
}
}
电机转动以及转速设置
主要代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Motor.h"
#include "Key.h"
int main(void)
{
Motor_Init();
Motor_SetSpeed(50); //将speed50传到motor.c中以及占空比中
while (1)
{
}
}
主函数,main.c
#include "stm32f10x.h" // Device header
#include "PWM.h"
void Motor_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
PWM_Init();
}
/******** 设置电机转动 *****/
void Motor_SetSpeed(int8_t Speed) //设置电机转速,有符号量,正反转
{
if (Speed >= 0)
{
GPIO_SetBits(GPIOA, GPIO_Pin_4);
GPIO_ResetBits(GPIOA, GPIO_Pin_5);
PWM_SetCompare3(Speed); //将速度值传到占空比
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
GPIO_SetBits(GPIOA, GPIO_Pin_5);
PWM_SetCompare3(-Speed); //将速度值传到占空比
}
}
电机设置,motor.c
#include "PWM.h"
#include "stm32f10x.h" // Device header
void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启定时器2的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIO时钟
/********** TIM2引脚的GPIO配置 **********/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //对定时器GPIO设置为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_InternalClockConfig(TIM2);
/********** TIM2配置 **********/
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //TIM2配置
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //自动重装载值 ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1; //设置预分频值 PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
//C8T6的主频为72MHZ,设置的PWM频率为 72M/((ARR+1)*(PSC+1))=72M/(100*36)=20KHZ
/********** TIM2的通道3配置 **********/
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//PWM1模式
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //设置极性为高
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //CCR
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_Cmd(TIM2, ENABLE); //使能TIM2
}
/********** 占空比设置 **********/
void PWM_SetCompare3(int16_t Compare)
{
TIM_SetCompare3(TIM2, Compare);
}
烧录后电机即可转动。调节主函数中Motor_SetSpeed(50);数字大小即可调节转速,最大100,这是由于PWM的自动重装载值为100,Motor_SetSpeed传参到TIM_SetCompare3的最大值也就100。
标签:
stm32
本文转载自: https://blog.csdn.net/weixin_57105479/article/details/127332298
版权归原作者 明天要记得学习 所有, 如有侵权,请联系我们删除。
版权归原作者 明天要记得学习 所有, 如有侵权,请联系我们删除。