0基础 | STM32 | TB6612电机驱动使用

news2025/5/11 16:42:34

TB6612介绍及使用

单片机通过驱动板连接至电机

原因:单品机I/O口输出电流I

驱动板:从外部引入高电压,控制电机驱动

电源部分

VM电机驱动电源输入,输入电压范围建议为3.712V

GND逻辑电源和电机驱动电源的公共地

VCC逻辑电源输入,输入电压为

2.7-5.5V

电机接口

A0 B0可以接两个电机

电机控制端口

PWMA  B分别为两个电机控制的使能端

(可使用PWM调速)

AIN1\AIN2BIN1\BIN2

STBY

使能引脚

IN1

IN2

PWM

STBY

O1

O2

H

H

H/L

H

L

L

制动

L

H

H

H

L

H

反转

L

H

L

H

L

L

制动

H

L

H

H

H

L

正转

H

L

L

H

L

L

制动

L

L

H

H

OFF

-

停止

H/L

H/L

H/L

L

OFF

-

待机

main.c

#include "stm32f10x.h"

#include "led.h"

#include "usart.h"

#include "delay.h"

#include "oled.h"

#include "Motor.h"

#include "key.h"

int key = 0;

int key_state = 0;

int main(void)

{ SystemInit();//系统时钟为72M  

      delay_init(72);

      LED_Init();

      LED_On();

      MOTOR_Init();

USART1_Config();//串口初始化

      Key_Init();

      OLED_Init();

      printf("Start \n");

      delay_ms(1000);

     

OLED_Clear();//显示电机转速

OLED_ShowChinese(0,0,0,16,1);

OLED_ShowChinese(16,0,1,16,1);

OLED_ShowChinese(32,0,2,16,1);

OLED_ShowChinese(48,0,3,16,1);

OLED_ShowChar(64,0,':',16,1);

  while (1)

  {key = Key_GetData();

           if(key)

                 key_state++;

           if(key_state%4==1)

           {Motor_SetSpeed(60);

OLED_ShowNum(56,24,1,1,16,1);

           }if(key_state%4==2)

           {Motor_SetSpeed(80);

OLED_ShowNum(56,24,2,1,16,1);}

           if(key_state%4==3)

           {Motor_SetSpeed(100);

OLED_ShowNum(56,24,3,1,16,1);}

           if(key_state%4==0)

           {Motor_SetSpeed(0); OLED_ShowNum(56,24,0,1,16,1);       //0}}}

Motor.c

#include "Motor.h"

void MOTOR_Init(void)

{

      GPIO_InitTypeDef GPIO_InitStructure;

      RCC_APB2PeriphClockCmd(MOTOR_CLK, ENABLE ); //配置时钟

      GPIO_InitStructure.GPIO_Pin = MOTOR_AIN1_GPIO_PIN;

      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

      GPIO_Init(MOTOR_AIN1_GPIO_PORT,&GPIO_InitStructure);

      GPIO_InitStructure.GPIO_Pin = MOTOR_AIN2_GPIO_PIN;

      GPIO_Init(MOTOR_AIN2_GPIO_PORT,&GPIO_InitStructure);

      PWM_Init();

}

void PWM_Init(void)

{

      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    //开启GPIOA的时钟

/*GPIO初始化*/

      GPIO_InitTypeDef GPIO_InitStructure;

      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

      GPIO_InitStructure.GPIO_Pin = MOTOR_PWMA_GPIO_PIN;

      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

      GPIO_Init(MOTOR_PWMA_GPIO_PORT, &GPIO_InitStructure);                             //PA1PA2引脚初始化为推挽输出

      TIM_InternalClockConfig(TIM2);//配置实际单元

      TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

      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);

      TIM_OCInitTypeDef TIM_OCInitStructure;

      TIM_OCStructInit(&TIM_OCInitStructure);        //给结构体赋予初值

      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_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);} 

void PWM_SetCompare3(uint16_t compare)

{TIM_SetCompare3(TIM2,compare);

}void Motor_SetSpeed(int8_t Speed)

{if(Speed >= 0)

      {

      GPIO_SetBits(MOTOR_AIN1_GPIO_PORT,MOTOR_AIN1_GPIO_PIN);

      GPIO_ResetBits(MOTOR_AIN2_GPIO_PORT,MOTOR_AIN2_GPIO_PIN);

      PWM_SetCompare3(Speed);

      }else{

      GPIO_ResetBits(MOTOR_AIN1_GPIO_PORT,MOTOR_AIN1_GPIO_PIN);

      GPIO_SetBits(MOTOR_AIN2_GPIO_PORT,MOTOR_AIN2_GPIO_PIN);

           PWM_SetCompare3(-Speed);}}

Motor.h

#ifndef __MOTOR_H

#define    __MOTOR_H

#include "stm32f10x.h"

#include "delay.h"

#include "sys.h"

/***************根据自己需求更改****************/

// TB6612FNG电机驱动模块 GPIO宏定义

#define    MOTOR_CLK                             RCC_APB2Periph_GPIOA

#define MOTOR_AIN1_GPIO_PIN                    GPIO_Pin_0

#define MOTOR_AIN2_GPIO_PIN                    GPIO_Pin_1

#define MOTOR_AIN1_GPIO_PORT                     GPIOA

#define MOTOR_AIN2_GPIO_PORT                     GPIOA

#define MOTOR_PWMA_GPIO_PIN                     GPIO_Pin_2

#define MOTOR_PWMA_GPIO_PORT                      GPIOA

/*********************END**********************/

void MOTOR_Init(void);

void PWM_Init(void);

void Motor_SetSpeed(int8_t Speed);

#endif

代码放在下述连接里面,通过网盘分享的文件:TB6612电机调速资料

链接: https://pan.baidu.com/s/1D_d506c3pwiRzHCaSq2_Aw?pwd=HHRR 提取码: HHRR

--来自百度网盘超级会员v5的分享

此外还有一种电机驱动,介绍如下

微型双路直流电机驱动基于TB6612FNG驱动IC设计,采用特殊逻辑控制方式,仅需4根管脚即可实现双路电机控制,相比纯芯片而言,减少了两个IO管脚,为Arduino等控制器节约了宝贵的IO资源,可以应用在更多领域中。
TB6612FNG是一块双路全桥驱动芯片,单通道最大连续驱动电流可达1.2A,峰值2A/3.2A(连续脉冲/单脉冲),可驱动一些微型直流电机。控制逻辑与L298N类似,代码上可直接兼容DFRobot L298N电机驱动。标准XH2.54排针可直插面包板,无论是DIY制作,还是新产品开发,都是非常理想的一个选择!

产品参数

  • 逻辑部分输入电压VCC3.3~5V
  • 驱动部分输入电压VM2.5~12V
  • 驱动电机路数:2通道
  • 单通道最大连续驱动电流:1.2A
  • 启动峰值:2A/3.2A(连续脉冲/单脉冲)
  • 接口方式:2.54mm间距排针

模块尺寸:20 × 19.5(mm)

细节说明

电机接口:M1M2 可接入两个电机,其中标注了“+”“-”表示两个电机的接线方向。

指示灯:正面指示灯:电源指示灯

电源部分

VCC:逻辑电源输入,输入电压为5V;

VM:电机驱动电源输入,输入电压范围建议为3.712V;

GND:逻辑电源和电机驱动电源的公共地。

电机控制端口

PWM1,PWM2:分别为两个电机控制的使能端(可使用PWM调速)

DIR1,DIR2:正反转控制信号输入端。比如,DIR1=1M1电机正转; DIR1=0M1电机反转。

引脚说明

管脚映射

标号

名称

功能描述

1

DIR1

电机M1的方向控制引脚

3

PWM2

电机M2的速度控制引脚

4

DIR2

电机M2的方向控制引脚

5

GND

逻辑部分电源负极

6

VCC

逻辑部分电源正极

7

M1+

M1路电机输出1

8

M1-

M1路电机输出2

9

M2+

M2路电机输出1

10

M2-

M2路电机输出2

11

GND

电机电源负极

12

VM(<12V)

电机电源正极

模块尺寸:20 × 19.5(m\

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2373261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】POSIX 线程信号量与互斥锁▲

代码要求&#xff1a;高内聚&#xff0c;低耦合 高内聚&#xff1a;元素之间具有很强的关联性&#xff0c;模块的功能单一且集中 低耦合&#xff1a;代码之间的依赖关系尽可能简单&#xff0c;相互之间的影响和交互尽可能少 线程安全问题&#xff1a;多线程访问共享数据&…

USR-M100采集数据并提交MQTT服务器

本文为记录备忘&#xff0c;不做过多解释。 模块自身带有2路数字量输入&#xff0c;2路模拟量输入&#xff0c;2路485接口 数字量接报警输入&#xff0c;模拟量接压力传感器&#xff0c;液位传感器&#xff0c;485接口分别接流量计&#xff0c;温湿度传感器。 正确接线&…

内网穿透系列三:开源本地服务公网映射工具 tunnelmole

以下是对 tunnelmole 简要介绍&#xff1a; tunnelmole 是一款开源的内网穿透工具&#xff0c;一行命令就能把本地http服务映射成公网可访问的链接提供公共免费的网络服务&#xff0c;直接下载运行命令即可使用&#xff0c;也支持自行配置搭建私有客户端、服务端参考开源地址&…

数据集-目标检测系列- 冥想 检测数据集 close_eye>> DataBall

数据集-目标检测系列- 冥想 检测数据集 close * 相关项目 1&#xff09;数据集可视化项目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2&#xff09;数据集训练、推理相关项目&#xff1a;GitHub - XIAN-HHappy/ultralytics-yolo-…

论文精读:YOLOE: Real-Time Seeing Anything

文章目录 前言1、背景2、方法2.1.重参Region-Text对齐模块2.2.VisualPrompt模块2.3.PromptFree 2.4.损失函数3、实验3.1.训练集3.2.实验结果 总结 前言 本文介绍一篇来自清华的开放词汇检测论文&#xff1a;YOLOE&#xff1b;源码链接。 1、背景 本文在yolo-world基础上&#x…

以影像为笔,劳润智在世界舞台上书写艺术之路

在光影交织中,摄影师劳润智的镜头仿佛能穿透喧嚣,捕捉人类情感最细腻的脉动。从疫情下洛杉矶裁缝日常的温馨瞬间,到象征自由与解脱的飞鸟影像,再到探索时间与空间交错的抽象作品,每一幅作品都展现了他对艺术的深度追求与对生活的温柔洞察。 劳润智的作品为他赢得了多个国际奖项…

LLMs之ChatGPT:《Connecting GitHub to ChatGPT deep research》翻译与解读

LLMs之ChatGPT&#xff1a;《Connecting GitHub to ChatGPT deep research》翻译与解读 导读&#xff1a;这篇OpenAI帮助文档全面介绍了将GitHub连接到ChatGPT进行深度代码研究的方法、优势和注意事项。通过连接GitHub&#xff0c;用户可以充分利用ChatGPT强大的代码理解和生成…

【桌面】【输入法】常见问题汇总

目录 一、麒麟桌面系统输入法概述 1、输入法介绍 2、输入法相关组件与服务 3、输入法调试相关命令 3.1、输入法诊断命令 3.2、输入法配置重新加载命令 3.3、启动fcitx输入法 3.4、查看输入法有哪些版本&#xff0c;并安装指定版本 3.5、重启输入法 3.6、查看fcitx进程…

QT的初始代码解读及其布局和弹簧

this指的是真正的当前正在显示的窗口 main函数&#xff1a; Widget w是生成了一个主窗口&#xff0c;QT Designer是在这个主窗口里塞组件 w.show()用来展示这个主窗口 头文件&#xff1a; namespace Ui{class Widget;}中的class Widget和下面的class Widget不是一个东西 Ui…

Profinet转CanOpen网关,打破协议壁垒的关键技术

在石油化工行业的生产现场&#xff0c;各类自动化设备如同精密运转的神经系统&#xff0c;而通信协议则是传递信号的"语言"。当不同厂商的设备采用Canopen与Profinet这两种主流工业协议时&#xff0c;就像两个使用不同方言的专家需要实时协作&#xff0c;此时开疆智能…

引用第三方自定义组件——微信小程序学习笔记

1. 使用 npm 安装第三方包 1.1 下载安装Node.js 工具 下载地址&#xff1a;Node.js — Download Node.js 1.2 安装 npm 包 在项目空白处右键弹出菜单&#xff0c;选择“在外部终端窗口打开”&#xff0c;打开命令行工具&#xff0c;输入以下指令&#xff1a; 1> 初始化:…

SpringAI实现AI应用-使用redis持久化聊天记忆

SpringAI实战链接 1.SpringAl实现AI应用-快速搭建-CSDN博客 2.SpringAI实现AI应用-搭建知识库-CSDN博客 3.SpringAI实现AI应用-内置顾问-CSDN博客 4.SpringAI实现AI应用-使用redis持久化聊天记忆-CSDN博客 5.SpringAI实现AI应用-自定义顾问&#xff08;Advisor&#xff09…

C#问题 加载格式不正确解决方法

出现上面问题 解决办法&#xff1a;C#问题 改成x86 不要选择anycpu

CentOS 7.9 安装详解:手动分区完全指南

CentOS 7.9 安装详解&#xff1a;手动分区完全指南 为什么需要手动分区&#xff1f;CentOS 7.9 基本分区说明1. /boot/efi 分区2. /boot 分区3. swap 交换分区4. / (根) 分区 可选分区&#xff08;进阶设置&#xff09;5. /home 分区6. /var 分区7. /tmp 分区 分区方案建议标准…

如何使用测试软件 Jmeter

第一步&#xff0c;点击 编辑 添加线程组 第二步&#xff0c;右键单击线程组&#xff0c;添加取样器 HTTP 请求 第三步&#xff0c;设置请求路径 第四步&#xff0c;添加 查看结果树 用于查看请求响应 最后点击绿色小三角启动即可

2025盘古石初赛WP

来不及做&#xff0c;还有n道题待填坑 文章目录 手机取证 Mobile Forensics分析安卓手机检材&#xff0c;手机的IMSI是&#xff1f; [答案格式&#xff1a;660336842291717]养鱼诈骗投资1000&#xff0c;五天后收益是&#xff1f; [答案格式&#xff1a;123]分析苹果手机检材&a…

系统分析与设计期末复习

第一章 系统的五个特性 整体性、目的性、相关性、环境适应性、层次性 软件系统的四个特性 复杂性、一致性、可变性、不可见性 第二章 系统规划 系统开发生命周期 系统规划->系统分析->系统设计->系统实施->系统运行维护->系统规划 诺兰阶段模型 阶段&a…

IBM BAW(原BPM升级版)使用教程第八讲

续前篇&#xff01; 一、流程开发功能模块使用逻辑和顺序 前面我们已经对 流程、用户界面、公开的自动化服务、服务、事件、团队、数据、性能、文件各个模块进行了详细讲解&#xff0c;现在统一进行全面统一讲解。 在 IBM Business Automation Workflow (BAW) 中&#xff0c;…

从电动化到智能化,法雷奥“猛攻”中国汽车市场

当前&#xff0c;全球汽车产业正在经历前所未有的变革&#xff0c;外资Tier1巨头开始向中国智能电动汽车市场发起新一轮“猛攻”。 在4月23日-5月2日上海国际车展期间&#xff0c;博世、采埃孚、大陆集团、法雷奥等全球百强零部件厂商纷纷发布战略新品与转型计划。在这其中&am…

鸿蒙开发——3.ArkTS声明式开发:构建第一个ArkTS应用

鸿蒙开发——3.ArkTS声明式开发:构建第一个ArkTS应用 一、创建ArkTS工程二、ArkTS工程目录结构&#xff08;Stage模型&#xff09;三、构建第一个页面四、构建第二个页面五、实现页面之间的跳转六、模拟器运行 一、创建ArkTS工程 1、若首次打开DevEco Studio&#xff0c;请点击…