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

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.mzph.cn/web/78470.shtml

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

相关文章

【操作系统】死锁

1. 定义 死锁是指两个或多个进程&#xff08;或线程&#xff09;在执行过程中&#xff0c;因争夺资源而造成的一种僵局&#xff0c;每个进程都无限期地等待其他进程释放它们所持有的资源。在这种情况下&#xff0c;没有任何进程能够继续执行&#xff0c;除非有外部干预。 2. …

C++入门☞关于类的一些特殊知识点

涉及的关于类中的默认成员函数的知识点可以看我的这篇博客哦~ C入门必须知道的知识☞类的默认成员函数&#xff0c;一文讲透运用 目录 初始化列表 类型转换 static成员 友元 内部类 匿名对象 对象拷贝时的一些编译器的优化 初始化列表 我们知道类中的构造函数的任务是完…

只用Prettier进行格式化项目

1.下载Prettier插件&#xff0c;禁用ESlint 2.在项目根目录新建.prettierrc文件 {"singleQuote": true,"jsxSingleQuote": true,"printWidth": 100,"trailingComma": "none","tabWidth": 2,"semi": f…

XXL-TOOL v1.4.0 发布 | Java工具类库

Release Notes 1、【新增】JsonRpc模块&#xff1a;一个轻量级、跨语言远程过程调用实现&#xff0c;基于json、http实现&#xff08;从XXL-JOB底层通讯组件提炼抽象&#xff09;。2、【新增】Concurrent模块&#xff1a;一系列并发编程工具&#xff0c;具备良好的线程安全、高…

基于LVGL的登录界面设计

目录 一、演示 二、前言 三、部件知识 3.1 图片按钮部件 3.1.1 图片按钮部件的组成 3.1.2 图片的来源 3.1.3 添加/清除的状态 3.1.4 图片按钮部件 API 函数 3.2 键盘部件(lv_keyboard) 3.2.1 键盘部件的组成 3.2.2 键盘部件的相关知识 3.2.2.1 键盘部件模式 3.…

S3 跨账户复制:增强云中的灾难恢复计划

您准备好提升您的云和 DevOps 技能了吗&#xff1f; &#x1f425;《云原生devops》专门为您打造&#xff0c;我们精心打造的 30 篇文章库&#xff0c;这些文章涵盖了 Azure、AWS 和 DevOps 方法论的众多重要主题。无论您是希望精进专业知识的资深专业人士&#xff0c;还是渴望…

线程与进程深度解析:从fork行为到生产者-消费者模型

线程与进程深度解析&#xff1a;从fork行为到生产者-消费者模型 一、多线程环境下的fork行为与线程安全 1. 多线程程序中fork的特殊性 核心问题&#xff1a;fork后子进程的线程模型 当多线程程序中的某个线程调用fork时&#xff1a; 子进程仅包含调用fork的线程&#xff1…

Circular Plot系列(五): circle plot展示单细胞互作

这是我们circle系列的最后一节&#xff0c;我想常见的弦图是绕不开的&#xff0c;所以最后从前面介绍的circle plot思路&#xff0c;做一遍弦图。其实前面的内容如果消化了&#xff0c;plot互作弦图也就不成什么问题了。 效果如下&#xff1a; #cellchat提取互作结果&#xff…

(11)Vue-Router路由的详细使用

本系列教程目录&#xff1a;Vue3Element Plus全套学习笔记-目录大纲 文章目录 第2章 路由 Vue-Router2.1 Vue路由快速入门2.1.1 创建项目2.1.2 路由运行流程 2.2 传递参数-useRoute2.2.1 路径参数-params1&#xff09;普通传参2&#xff09;传递多个参数3&#xff09;对象方式传…

react + antd 实现后台管理系统

文章目录 完整路由搭建Layout 和 Aside组件引入 AntdAside组件实现 项目效果图 项目完整代码地址 https://gitee.com/lyh1999/react-back-management 项目完整代码地址 react依赖安装 最好采用yarn 安装 react-router 安装依赖 配置路由 history模式 / // src/router/…

基于AWS Marketplace的快速解决方案:从选型到部署实战

1. 引言&#xff1a;为什么选择AWS Marketplace&#xff1f; 在数字化转型的背景下&#xff0c;企业需要快速获取成熟的软件工具和服务以降低开发成本。AWS Marketplace 作为亚马逊云科技的官方应用商店&#xff0c;提供超过万款预配置的第三方和AWS原生解决方案&#xff0c;涵…

2021年第十二届蓝桥杯省赛B组C++题解

2021年第十二届蓝桥杯省赛B组C题解 关键词&#xff1a;蓝桥杯、省赛、题解、C、算法 一、个人见解 第十二届蓝桥杯省赛B组共有10道题目&#xff0c;包含5道填空题&#xff08;T1-T5&#xff09;和5道编程题&#xff08;T6-T10&#xff09;&#xff0c;总分150分。比赛时长4小…

日语学习-日语知识点小记-进阶-JLPT-N1阶段(1):语法单词

日语学习-日语知识点小记-进阶-JLPT-N1阶段&#xff08;1&#xff09;&#xff1a;语法单词 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师的信仰&#xff08;3&#xff09;高级语法N1语法和难点一、N1语法学习内容&#xff08;高级语法&#xff…

Python|Pyppeteer实现自动登录小红书(32)

前言 本文是该专栏的第32篇,结合优质项目案例持续分享Pyppeteer的干货知识,记得关注。 本文中,笔者以小红书为例,基于Pyppeteer实现自动登录“小红书”。 需要注意的是,对Pyppeteer不太熟悉的同学,可往前翻阅本专栏前面介绍的Pyppeteer知识点,本专栏将带你了解并熟练使…

【翻译、转载】【转载】LLM 的函数调用与 MCP

来源&#xff1a; https://www.dailydoseofds.com/p/function-calling-mcp-for-llms/ 【代码以图像显示的是原文内容&#xff0c;以代码形式显示的是大模型给出的参考】 LLM 的函数调用与 MCP 在 MCP 变得像现在这样主流&#xff08;或流行&#xff09;之前&#xff0c;大多…

【QT】QT中http协议和json数据的解析-http获取天气预报

QT中http协议和json数据的解析 1.http协议的原理2.QT中http协议的通信流程2.1 方法步骤 3.使用http协议&#xff08;通过http下载图片和获取天气预报信息&#xff09;3.1 http下载网络上的图片(下载小文件)3.1.1 示例代码3.1.2 现象 3.2 获取网络上天气预报3.2.1 免费的天气预报…

hot100:链表倒数k个节点- 力扣(LeetCode)

题目&#xff1a; 实现一种算法&#xff0c;找出单向链表中倒数第 k 个节点。返回该链表中倒数第k个节点。 示例一&#xff1a; 输入&#xff1a;{1,2,3,4,5},2 返回值&#xff1a;{4,5} 说明&#xff1a;返回倒数第2个节点4&#xff0c;系统会打印后面所有的节点来比较。 …

Spring AI 实战:第十一章、Spring AI Agent之知行合一

引言:智能体的知行辩证法 “知为行之始,行为知之成”,王阳明的哲学智慧在AI时代焕发光彩。智能体(LLM Agent)的进化之路,正是"认知-决策-执行"这一闭环的完美诠释: 知明理:融合大语言模型的推理能力与知识图谱的结构化认知行致用:基于ReAct模式的动态工具调…

365打卡第R6周: LSTM实现糖尿病探索与预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 &#x1f3e1; 我的环境&#xff1a; 语言环境&#xff1a;Python3.10 编译器&#xff1a;Jupyter Lab 深度学习环境&#xff1a;torch2.5.1 torchvision0…

W-TinyLFU缓存驱逐算法解析

文章目录 1. 背景与概述1.1 什么是缓存驱逐算法1.2 W-TinyLFU 的定义与价值 2. 核心思想与设计理念2.1 时间局部性与频率局部性的结合2.2 高效的频率统计2.3 窗口机制的引入 3. 架构设计与组件3.1 整体架构3.2 窗口缓存&#xff08;Window Cache&#xff09;3.3 主缓存&#xf…