STM32外设系列—TB6612FNG

本文涉及到定时器和串口的知识,详细内容可见博主STM32速成笔记专栏。

文章目录

  • 一、TB6612简介
  • 二、TB6612使用方法
    • 2.1 TB6612引脚连接
    • 2.2 控制逻辑
    • 2.3 电机调速
  • 三、实战项目
    • 3.1 项目简介
    • 3.2 初始化GPIO
    • 3.3 PWM初始化
    • 3.3 电机控制程序
    • 3.4 串口接收处理函数

一、TB6612简介

TB6612FNG是东芝半导体的一款驱动电机的IC。一个TB6612FNG可以驱动两个电机,每一个驱动都有两个逻辑输入引脚,一个输出引脚和一个PWM引脚。可以通过给两个逻辑输入引脚不同的电平来控制电机的运行状态,通过PWM输入引脚实现电机调速。TB6612FNG还具有以下特点

  • 电源电压最大可到15V
  • 输出电流最大可达3.2A
  • 内置热停机电路和低压检测电路
  • 有正转,反转,短制动和停止四种模式

TB6612FNG

二、TB6612使用方法

2.1 TB6612引脚连接

引脚连接
PWMAA通道的PWM输入
AIN2A通道逻辑输入2引脚
AIN1A通道逻辑输入1引脚
STBY待机引脚,接低电平处于待机模式,接高电平开始工作
BIN1B通道逻辑输入1引脚
BIN2B通道逻辑输入2引脚
PWMBB通道PWM输入引脚
GND
VM电源输入正极,最大接15V
VCC逻辑电源正极,接3.3V
AO1A通道输出1引脚
AO2A通道输出2引脚
BO2B通道输出2引脚
BO1B通道输出1引脚

使用时VM接电机电源的正极,GND接电机电源的负极。IN1和IN2接逻辑输入,PWM接PWM输出引脚。O1和O2接电机的正负极。

2.2 控制逻辑

IN1和IN2的高低电平状态对应不同的电机运行状态,二者的对应关系如下

IN1001
IN2010
电机运行状态停止正转反转

上述的正反转是AO1接电机正极,AO2接电机负极的对应关系。

2.3 电机调速

电机调速的远离比较简单,只需要给TB6612FNG的PWM输入引脚输入10KHz的PWM波。调节占空比即可调节转速。需要注意的是如果PWM配置的极性是低电平,那么设置占空比时的值越大,电机转速越低。相反,如果PWM配置的极性是高电平,那么设置占空比时的值越大,电机转速越高。

三、实战项目

3.1 项目简介

本项目比较简单,使用TB6612驱动一个12V减速电机。利用串口发送占空比,实现电机的调速。

3.2 初始化GPIO

初始化GPIO完成的工作是初始化逻辑控制引脚,程序如下

/**==============================================================================*函数名称:Drv_MotorGpio_Init*函数功能:初始化Motor的GPIO*输入参数:无*返回值:无*备  注:这里只初始化了逻辑控制IO,PWM的IO在定时器配置PWM时初始化*==============================================================================*/
void Drv_MotorGpio_Init (void)
{GPIO_InitTypeDef GPIO_InitStructure;   // 定义结构体// 开启时钟RCC_APB2PeriphClockCmd(MOTOR_GPIO_TIM,ENABLE);// 配置结构体GPIO_InitStructure.GPIO_Pin = MOTOR_GPIO_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // 推挽式输出GPIO_Init(MOTOR_GPIO, &GPIO_InitStructure);
}

宏定义如下

// 电机逻辑控制GPIO
#define MOTOR_GPIO_TIM   RCC_APB2Periph_GPIOC
#define MOTOR_GPIO   GPIOC
#define MOTOR_GPIO_PIN   GPIO_Pin_7 | GPIO_Pin_8

3.3 PWM初始化

PWM初始化程序如下

/**==============================================================================*函数名称:TIM2_CH1_PWM_Init*函数功能:初始化定时器2的PWM通道1*输入参数:per:自动重装载值;psc:预分频系数*返回值:无*备  注:无*==============================================================================*/
void TIM2_CH1_PWM_Init (u16 per,u16 psc)
{// 结构体定义TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;GPIO_InitTypeDef GPIO_InitStructure;// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);// 初始化GPIOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   // 复用推挽输出GPIO_Init(GPIOA,&GPIO_InitStructure);// 初始化定时器参数TIM_TimeBaseInitStructure.TIM_Period = per;   // 自动装载值TIM_TimeBaseInitStructure.TIM_Prescaler = psc;   // 分频系数TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;   // 设置向上计数模式TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);	// 初始化PWM参数TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;   // 比较输出模式TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   // 输出极性TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   // 输出使能TIM_OC1Init(TIM2,&TIM_OCInitStructure);   // 输出比较通道1初始化TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);   // 使能TIMx在 CCR1 上的预装载寄存器TIM_ARRPreloadConfig(TIM2,ENABLE);   // 使能预装载寄存器TIM_Cmd(TIM2,ENABLE);   // 使能定时器	
}

初始化时配置如下,配置为10KHz

	TIM2_CH1_PWM_Init(1000,71);   // 初始化PWM

3.3 电机控制程序

电机正反转和停止控制程序如下

/**==============================================================================*函数名称:Med_Motor_Go*函数功能:电机正转*输入参数:无*返回值:无*备  注:无*==============================================================================*/
void Med_Motor_Go (void)
{MOTOR_IN1 = 1;MOTOR_IN2 = 0;
}
/**==============================================================================*函数名称:Med_Motor_Stop*函数功能:电机停转*输入参数:无*返回值:无*备  注:无*==============================================================================*/
void Med_Motor_Stop (void)
{MOTOR_IN1 = 0;MOTOR_IN2 = 0;
}
/**==============================================================================*函数名称:Med_Motor_Reverse*函数功能:电机反转*输入参数:无*返回值:无*备  注:无*==============================================================================*/
void Med_Motor_Reverse (void)
{MOTOR_IN1 = 0;MOTOR_IN2 = 1;
}

宏定义如下

// 电机逻辑控制引脚
#define MOTOR_IN1   PCout(7)
#define MOTOR_IN2   PCout(8)

3.4 串口接收处理函数

串口需要根据接收到的占空比来配置输出PWM的占空比,配置占空比使用的库函数是

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)

串口只支持输入大于100小于1000的占空比,串口接收处理程序如下

/**==============================================================================*函数名称:USART1_IRQHandler*函数功能:USART1中断服务函数*输入参数:无*返回值:无*备  注:无*==============================================================================*/
u32 gReceCount = 0;   // 接收计数变量
u32 gClearCount = 0;   // 清空接收数组计数变量
u8 gReceFifo[1500];   // 接收数组
u8 gReceEndFlag = 0;   // 接收完成标志位 void USART1_IRQHandler(void)  
{if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)   //接收到一个字节  {gReceFifo[gReceCount++] = USART_ReceiveData(USART1);}else if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)   //接收到一帧数据{USART1->SR;   // 先读SRUSART1->DR;   // 再读DRgReceEndFlag = 1;   // 接收完成标志置1 } 
}
/**==============================================================================*函数名称:Uart_Rece_Pares*函数功能:解析串口接收内容*输入参数:无*返回值:无*备  注:无*==============================================================================*/
void Uart_Rece_Pares(void)   // 串口接收内容解析函数
{u16 pwmDuty = 0;   // 接收串口发送来的占空比if (gReceEndFlag  == 1)   // 如果接收完成{// 解析接收内容pwmDuty = (gReceFifo[0] - 48) * 100;pwmDuty = pwmDuty + (gReceFifo[1] - 48) * 10;pwmDuty = pwmDuty + (gReceFifo[2] - 48);if (pwmDuty <= 100){pwmDuty = 100;}if (pwmDuty >= 1000){pwmDuty = 1000;}printf ("duty=%d\r\n",pwmDuty);TIM_SetCompare1(TIM2,pwmDuty);// 清空接收数组for (gClearCount = 0;gClearCount < gReceCount;gClearCount ++){gReceFifo[gClearCount] = ' ';}gReceEndFlag = 0;   // 清除接收完成标志位gReceCount = 0;   // 清零接收计数变量}
}

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

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

相关文章

优化transformer

使用transformer而导致的时间长&#xff0c;可能会由于self-attention计算Query和key的值才导致的时间长&#xff0c;也可能会因为feed forward中的计算导致时间长。这里我们只针对第一种情况下进行优化。 第一种情况&#xff1a;有些问题&#xff0c;我们可能不需要看整个句子…

【问题总结】基于docker-compose实现nginx转发redis

目录&#xff1a; 文章目录 需求简介&#xff1a;Q1: nginx的http模块和http模块有什么不同Q2: 可以都使用stream模块进行配置吗 Docker环境下如何转发1 修改docker-compose2 修改nginx.conf3 测试连接 需求简介&#xff1a; 需要在192.168.3.11的ngnix上&#xff0c;转发192.…

前端 | ( 十)HTML5简介及相关新增属性 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 系列笔记&#xff1a; 【HTML4】&#xff08;一&#xff09;前端简介【HTML4】&#xff08;二&#xff09;各种各样的常用标签【HTML4】&#xff08;三&#xff09;表单及HTML4收尾…

MyBatis学习笔记——4

MyBatis学习笔记——4 一、MyBatis的高级映射及延迟加载1.1、多对一1.1.1、第一种方式&#xff1a;级联属性映射1.1.2、第二种方式&#xff1a;association1.1.3、第三种方式&#xff1a;分步查询 1.2、一对多1.2.1、第一种方式&#xff1a;collection1.2.1、第二种方式&#x…

Web后端开发总结

后端web开发大致流程 和对应的核心技术 对应技术的来源 springMVC可以理解为spring框架中的web开发框架 springMVCSpringMybatis就是我们熟知的ssm框架了

golang单元测试及mock总结

文章目录 一、前言1、单测的定位2、vscode中生成单测 二、构造测试case的注意事项1、项目初始化2、构造空interface{}3、构造结构体的time.Time类型4、构造json格式的test case 三、运行单测文件1、整体运行单测文件2、运行单个单测文件报错&#xff08;1&#xff09;command-l…

基于sklearn计算precision、recall等分类指标

文章目录 一、分类指标函数1.1 precision_score函数1.2 recall_score函数1.3 accuracy_score函数1.4 f1_score函数1.5 precision_recall_curve函数1.6 roc_curve函数1.7 roc_auc_score函数1.8 classification_report函数 二、二分类任务三、多分类任务3.1 Macro Average&#x…

怎样原生制作lis的CentOS容器镜像

本文介绍从一个空白的裸机CentOS自己构造检验允许的docker环境。来达到运行环境的高度定制&#xff0c;而不是只能依赖VS或者微软或者数据库厂商提供的镜像当做基础制作。更容易理解基础原理。最终输出产物为lisnew.tar&#xff0c;一个开箱即用的lis运行环境。 制作的整个过程…

os.environ[“CUDA_VISIBLE_DEVICES“]学习总结

今天发现一个很有意思的东西 import torch import os # Specify the GPU device os.environ["CUDA_VISIBLE_DEVICES"] "1" print(torch.cuda.is_available())但是如果修改下面的设置后&#xff0c;结果就变成了 import torch import os # Specify the…

Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)

目录 1. 返回静态页面 2. 返回非静态页面 2.1 ResponseBody 返回页面内容 2.2 RestController ResponseBody Controller 2.3 示例:实现简单计算的功能 3. 返回JSON对象 3.1 实现登录功能&#xff0c;返回 JSON 对象 4. 请求转发(forward)或请求重定向(redirect) 4.1 请…

Rust之泛型、特性和生命期(四):验证有生存期的引用

开发环境 Windows 10Rust 1.71.0 VS Code 1.80.1 项目工程 这里继续沿用上次工程rust-demo 验证具有生存期的引用 生存期是我们已经在使用的另一种泛型。生存期不是确保一个类型具有我们想要的行为&#xff0c;而是确保引用在我们需要时有效。 我们在第4章“引用和借用”一…

<Java物联网> 从主动到被动:Java中的BACnet设备属性查询

目录 BACnet 使用软件 资源 模拟器 使用Java主动查 引入maven 创建网络对象 获取远程设备 获取设备属性 使用DeviceEventAdapter订阅 初始化本地BACnet设备和IP网络配置&#xff1a; 启动本地设备和添加监听器&#xff1a; 搜寻远程设备&#xff1a; 发送订阅COV报…

python try/except/finally

稍微总结一下&#xff0c;否则总是忘。 x abc def fetcher(obj, index): return obj[index] fetcher(x, 4) 输出&#xff1a; File "test.py", line 6, in <module> fetcher(x, 4) File "test.py", line 4, in fetcher return obj[index] …

zookeeper的应用

Zookeeper的配置文件解析: Zookeeper内部原理: 选举机制 半数机制:在集群环境中半数以上的机器存活,这个集群可用,所以在设计Zookeeper集群系统时&#xff0c;通常会选择 奇数台服务器来搭建Zookeeper的集群 虽然在配置文件中并没有指定Master和Slave。但是&#xff0c;Zookeep…

第三十二章:MySQL事务日志

第三十二章&#xff1a;MySQL事务日志 32.1&#xff1a;概述 事物有4种特性&#xff1a;原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢&#xff1f; 事物的隔离性有锁机制实现。而事物的原子性、一致性和持久性由事物的redo日志和undo日志来…

Redis入门基础命令

文章目录 一、redis1.1 redis概述1.2 redis安装 二、string2.1 基础命令2.2 存储结构2.3 应用 三、list3.1 基础命令3.2 应用 四、hash4.1 基础命令4.2 存储结构4.3 应用 五、set5.1 基础命令5.2 存储结构5.3 应用 六、zset6.1 基础命令6.2 存储结构6.3 应用 一、redis 1.1 re…

【C#】MVC页面常见的重定向方式和场景

本篇文章主要简单讲讲&#xff0c;C# MVC 页面常见跳转或者重定向的方式和场景。 在实际项目开发中&#xff0c;在一些特定场景肯定会用到重定向&#xff0c;比如&#xff1a;不同角色跳转到不同视图地址 目录 一、种常见重定向方式1.1、RedirectToAction1.2、RedirectToRoute1…

Java中的队列

队列的理解 队列&#xff08;Queue&#xff09;是一种特殊的线性表&#xff0c;它只允许在表的前端进行删除操作&#xff0c;而在表的后端进行插入操作。 LinkedList类实现了Queue接口&#xff0c;因此我们可以把LinkedList当成Queue来用。 常用方法 实例 import java.util…

Stable Diffusion服务环境搭建(远程服务版)

Stable Diffusion服务环境搭建&#xff08;远程服务版&#xff09; Stable Diffusion是什么 Stable diffusion是一个基于Latent Diffusion Models&#xff08;潜在扩散模型&#xff0c;LDMs&#xff09;的文图生成&#xff08;text-to-image&#xff09;模型。具体来说&#…

C# IO FileStream流(一)使用整理

一、C# IO 文件流&#xff0c;常用操作整理 来自其他开发者的整理&#xff1a; 文件操作常用相关类 1)Directory //操作目录&#xff08;文件夹&#xff09;&#xff0c;静态类。2)Path//静态类&#xff0c;对文件或目录的路径进行操作&#xff08;很方便&#xff09;【字符…