我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用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时钟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);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)=20KHZTIM_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时钟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);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)=20KHZTIM_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://blog.csdn.net/weixin_57105479/article/details/127332298

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录