(四)STM32F407 cubemx定时器PWM驱动tb6612

(四)STM32F407 cubemx定时器PWM驱动tb6612

这篇文章主要是个人的学习经验,想分享出来供大家提供思路,如果其中有不足之处请批评指正哈。

废话不多说直接开始主题,本人是基于STM32F407VET6芯片,但是意在你看懂这篇文章后,不管是F1,F4,H7等一系列系统定时器PWM配置都能明白如何通过参考手册去学习配置。而不是Ctrl c,Ctrl v。
本人参考引用了这位大佬的文章推荐大家去看看:http://t.csdnimg.cn/AuJlR
有必要文字大概讲述一下定时器PWM的工作原理,一定是看过那位大佬的客观讲解(不然不会明白我在说什么的),我会用我精简的话的带大家理解。
为什么PWM一般和定时器绑在一起,首先要明白PWM就是一个单位周期内高电平或者低电平所占的比例。
在这里插入图片描述如图,假设单位周期为10ms,高电平T1所占时间比例为50%,低电平T2所占时间比例为50%,即高电平的时间为10ms50%=5ms,若100%占空比的电压为12V,则此时刻输出的电压为12V50%=6V(是高电平占比)。由此得出可以通过调节占空比0-100%从而调节0-12V的电压。
这就好比水坝,上游通过疯狂开关水闸(现实不可能),一个湍急的河流被你控制了流速,在没有瀑布的情况下流速再快也不能快于河流的流速(明白意思就行,别怼我了)
PWM还有一个关键,单位周期的产生,最好最便捷的方式之一就是定时器固定时间周期。
在这里插入图片描述定时器这几个重要的点需要好好说一说。
1.Prescaler预分频器,在哪见过呢?

在这里插入图片描述
预分频的作用就是将定时器的时钟频率分频,比如F407APB1上的定时器时钟频率为84Mhz。在这里插入图片描述

当预分频配置为84时,我的定时器所用的频率就仅仅是84MHZ/84=1MHZ

2.Counter Period (AutoReload Register)
在这里插入图片描述
ARR也就是周期频率,在你分频后1MHZ的基础之上,10^6/100=10KHZ这才是设置的工作频率,单位周期也就是T=1/f。你是在这个单位周期的基础上调节占空比。比如12V想要输出6V,占空比为50%,高电平所占的时间为t=1/10KHZ*50%=0.00005s=0.05ms。整个周期长也可以表示成100(计数次数为100)乘以10的负6次方=10负4次方所以你的占空比CRR不要超过ARR的数值,此情况也就是100。0-100对应的占空比就是0%-100%也就是0-12V.
明白了定时器相关内容之后开始讲解TB6612。

TB6612

在这里插入图片描述本人的TB6612是参考数据手册,和常用的红色款TB6612设计的,放心使用效果是一模一样,长得也一模一样。
数据手册里面写到本产品具有MOS结构,对静电放电敏感。操作本产品时,请使用接地带、导电垫和电离器防止静电放电。确保环境温度和相对湿度保持在合理的水平。所以尽量不要直接收触碰,特别是芯片贴片时本人打电赛时焊坏了3块贴片现在才知道为什么。
芯片驱动电机使用的是mos管得好好讲讲。
场效应管(MOS管)
在这里插入图片描述mos管特性,栅极易被静电击穿。因为栅极输入阻抗高,感应电荷很难释放,产生的高压易把绝缘层击穿,使MOS管永久损坏。失去了绝缘层,形成了栅极和源极电流
在这里插入图片描述可以看出,无论是N沟道还是P沟道,寄生二极管的方向总是跟箭头的方向是一致的。

通常是将衬底(基板)与源极S接在一起。根据导电方式的不同,MOSFET又分增强型、耗尽型。在一般使用中,更多是使用N沟道增强型或者P沟道增强型MOS管,耗尽型的管子比较少使用到。

增强型是指:当V_{GS}=0时管子是呈截止状态,加上正确的VGS后,多数载流子被吸引到栅极,从而“增强”了该区域的载流子,形成导电沟道。

耗尽型是指:当V_{GS}=0时即形成沟道,加上正确的VGS时,能使多数载流子流出沟道,因而“耗尽”了载流子,使管子转向截止。

借鉴大佬图片链接:
原文链接:https://blog.csdn.net/weixin_44914259/article/details/124051231
在这里插入图片描述TB6612每个引脚的功能以及任务参考数据手册进行讲解。
在这里插入图片描述首先接线图,STBY,AIN1,AIN2,BIN1,BIN2和STM32数字输出引脚连接,PWMA,PWMB是连接MCU的定时器PWM功能引脚。A01,A02,B01,B02和电机连接,此处画了两根线也是想告诉你此处电流较大,需要较宽的走线。VCC是连接2.7V-3.3V电源,VM1是直接连接4.5V-13.5V的外部电源。

AIN1,AIN2,BIN1,BIN2
引脚信号输入口,控制电机正反转的引脚。
当输入信号为1时在这里插入图片描述上侧Pmos管导通,内部电流连接VCC,高电平状态。
当输入信号为0时
在这里插入图片描述

下侧Nmos管导通,内部电流连接GND,低电平状态。
AO1,AO2,BO1,BO2
输出引脚直接与电机连接,控制电机正反转的引脚。
在这里插入图片描述
同侧的MOS管是连接在一起同时连接input信号引脚的(见上图),当AIN1为1,AIN2为0时,VM电压12V,电流走向为红色箭头方向。

在这里插入图片描述
当AIN1为0,AIN2为1时,VM电压,电流走向为红色箭头方向。还有几个停的我就不讲了,就是电压差为0.
以上就是电机正反转的工作原理俗称H桥电路。
在这里插入图片描述工作状态最重要的是上面几种情况你会发现STBY一般情况都是高电平,所以你既可以用一个引脚高电平输出驱动,也可以直接接VCC,本人采用的是第二种情况。

在这里插入图片描述注意一下PWM波的工作频率不要超过100KHZ就行(99.9KHZ,10HZ都行,但是101KHZ不行),本人使用的10KHZ没问题。
讲完理论方面开始CUBEMX配置。
最基础的配置我就不讲了,直接上重点。
定时器配置
在这里插入图片描述输出引脚配置
在这里插入图片描述主函数代码示例

#include "tb6612.h"
int main(void)
{
   
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&TB6612_TIMX,TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&TB6612_TIMX,TIM_CHANNEL_2);
	IN1_1;IN2_0;
	IN3_1;IN4_0;
	__HAL_TIM_SET_COMPARE(&TB6612_TIMX,TIM_CHANNEL_1,100);//右轮
	__HAL_TIM_SET_COMPARE(&TB6612_TIMX,TIM_CHANNEL_2,100);//左轮
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
   
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

TB6612.h

#ifndef __TB6612_H__
#define __TB6612_H__

#include "main.h"
#include "tim.h"
#include "gpio.h"

#define IN1_0    HAL_GPIO_WritePin(GPIOA,AIN1_1_Pin,GPIO_PIN_RESET)    //车轮
#define IN1_1    HAL_GPIO_WritePin(GPIOA,AIN1_1_Pin,GPIO_PIN_SET)
#define IN2_0    HAL_GPIO_WritePin(GPIOA,AIN2_1_Pin,GPIO_PIN_RESET)
#define IN2_1    HAL_GPIO_WritePin(GPIOA,AIN2_1_Pin,GPIO_PIN_SET)
#define IN3_0    HAL_GPIO_WritePin(GPIOD,BIN1_1_Pin,GPIO_PIN_RESET)
#define IN3_1    HAL_GPIO_WritePin(GPIOD,BIN1_1_Pin,GPIO_PIN_SET)
#define IN4_0    HAL_GPIO_WritePin(GPIOD,BIN2_1_Pin,GPIO_PIN_RESET)
#define IN4_1    HAL_GPIO_WritePin(GPIOD,BIN2_1_Pin,GPIO_PIN_SET)

#define SPEED_MAX     90
#define SPEED_MINI   0
#define TB6612_TIMX htim2

实现图片
在这里插入图片描述本人电池只有10V了一半刚好5V。

程序即参考资料链接:
链接:https://pan.baidu.com/s/1ByQX3bYszb35eLHMvk4okw?pwd=diic
提取码:diic

相关推荐

  1. stm32学习探究:利用TB6612驱动直流电机

    2024-01-06 20:08:03       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-06 20:08:03       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-06 20:08:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-06 20:08:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-06 20:08:03       18 阅读

热门阅读

  1. kafka重平衡经验总结

    2024-01-06 20:08:03       38 阅读
  2. Nestjs 微服务实战 - 动态微服务创建链接

    2024-01-06 20:08:03       35 阅读
  3. 通过data恢复postgresql

    2024-01-06 20:08:03       40 阅读
  4. 【sed学习】sed -i和sed -i -e有什么区别

    2024-01-06 20:08:03       26 阅读
  5. docker安装dcm4chee

    2024-01-06 20:08:03       38 阅读
  6. C语言-蓝桥杯2023年第十四届省赛真题-砍树

    2024-01-06 20:08:03       31 阅读