这篇文章主要是个人的学习经验,想分享出来供大家提供思路,如果其中有不足之处请批评指正哈。
废话不多说直接开始主题,本人是基于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设计的,放心使用效果是一模一样,长得也一模一样。
数据手册里面写到本产品具有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