当前位置: 首页>編程日記>正文

使用STM32与TB6612FNG驱动直流减速电机

使用STM32与TB6612FNG驱动直流减速电机

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;		//自动重装载值    ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;		//设置预分频值  PSCTIM_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;		//CCRTIM_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 headervoid 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;		//自动重装载值    ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;		//设置预分频值  PSCTIM_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;		//CCRTIM_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。

 


https://www.fengoutiyan.com/post/14974.html

相关文章:

  • pwm电机驱动芯片
  • 微型同步电机的MCU驱动控制器设计
  • 大功率直流减速电机24v
  • l298n电机驱动模块
  • 24v直流电机带减速机
  • 12v直流减速电机大全
  • 减速电机直流
  • 驱动电机工作原理
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機