文章目录
- 1 前言
- 2 分析电机安装板
- 3 介绍电机驱动板
- 3.1 电机驱动板原理图
- 3.2 电机驱动板PCB图
- 3.3 电机驱动板3D效果图
- 3.4 TB6612芯片分析
- 4 相关程序介绍
1 前言
为了更好的对JGB37-520这款电机有个了解,这里直接上图应该会清晰些。这款电机带有霍尔编码器,方便对车轮的转速进行采集。咱们在使用的时候,需要关注六根端子线即可。颜色依次为红(电机电源+)、黑(编码器电源-)、黄(信号线)、绿(信号线)、蓝(编码器电源+)、白(电机电源-)。
另外,还有选型的问题,当时我去某鱼买的时候,店家问我需要哪一种型号的,当时直接蒙住了。原来JGB37-520电机还有不同的配置。这是一个大图,咱们只需要关注额定电压为12V的电机即可。我选择的是减速比30,空载转速200RPM的电机。我也是折中选择了一个不快也不慢的电机。
2 分析电机安装板
我花了巨资买了两个电机,但是得想办法将他们固定起来吧。等等,这不是买电机送的电机底座嘛。这个孔应该是M3的,那只需要测量出四个孔之间的距离即可。经过一顿猛如虎的操作后,最终得到距离。如果将四个孔的中心连在一起,他是一个长方形,那我们可以使用价格低廉的亚克力板来制作我们的电机安装板。咱们只需要给亚克力板厂提供CAD文件,即可以制作出属于我们自己独一无二的安装板了。
为了更换好的设计安装板,咱们先去看看其他人是怎么设计的,找找灵感。经过简短的分析,目前心里有数了,接着我们用CAD软件来制作吧。这里插一句,CAD软件和之后可能用到的solidworks软件,是电子爱好者的两大利器,做出的作品如果没有一个好看的外壳,是不是感觉缺少了点灵魂。
下面是我自己绘制的安装板。
3 介绍电机驱动板
之前我画了一块TB6612电机驱动板,目前已经焊接完成了,下面给大家介绍下。有人或许会问,你干啥要额外绘制一块电机驱动验证板呢,因为有时候,我觉得在开发一个系统的时候,我们考虑问题有时候不全面,这样设计一块板子后发现会出现各种各样的问题,做一块验证板就显得尤为必要。再比如,面对一个不太熟悉的芯片,比如一块flash芯片,如果直接根据datasheet绘制原理图直接接入系统中,不一样能保证一次成功。
此外,从成本考虑,做小小的验证板成本很便宜,这样可以大大的减少一个完整项目的开销。
3.1 电机驱动板原理图
3.2 电机驱动板PCB图
3.3 电机驱动板3D效果图
当我画出驱动验证板后,就发现了一个问题。在绘制验证板的时候,电机接口选择的是XH2.54mm-LI-6P
。
线则是买的与之匹配的XH2.54 6P
,显然这两个期间均考虑出错,还好咱们只是制作的测试板,方便我们进行修改。
但是经过询问后得知,电机的接口是PH2.0
接口。
3.4 TB6612芯片分析
TB6612芯片用于驱动电机使用,快速了解一个芯片的最好的办法就是查看数据手册。
咱们从半导小芯下载电机驱动芯片手册。
可见VM最大输入电压为15V。
芯片每个脚的功能见下图所示。
下图所示的引脚电压输入容忍值也需要大家关注。一旦高于这个电压有风险损伤芯片。对于下图所示的VIN,本次是使用的stm32单片机,单片机引脚输出的高电平电压为3.3V,低电平电压为0V,符合要求。
输入引脚和输出引脚的内部图见下图,可以看出使用最多的是二极管和MOS管。
下图咱们主要了解电机正转和反转即可。下图其实对于OUT1和OUT2来说,L通常是代表0V,但是H的具体代表多少需要根据PWM波的占空比来进行确定,一般来说占空比越小,H表示的电压也就越小(0V),占空比越大,H表示的电压也就越大(极限值等于VM)。
我们一般让STBY引脚接入3.3V即可。
参考电路如下图所示。
通过原理图发现自己设计的测试板少了4个电容,之后设计中可以考虑加上。有人说下图的LM1084那边不是有电容可以拿来直接使用吗,其实那些电容都是需要紧紧靠着LM1084芯片的,如果想要TB6612芯片输入电压更加稳定,就需要在其附近放上电容即可。
4 相关程序介绍
main.c
文件。
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "pwm.h"
int main(void)
{
//-------------------------------------------------------------------------//
RCC->APB2ENR |= (uint32_t)0x00000010;//打开GPIOC时钟
GPIOC->CRH &= (uint32_t)0xFF0FFFFF;//使用前清零
GPIOC->CRH |= (uint32_t)0x00300000;//配置PC13为推挽输出,最大速度50MHz
//-------------------------------------------------------------------------//
RCC->APB2ENR |= (uint32_t)0x00000004;//打开GPIOA时钟
//PA4-5
GPIOA->CRL &= (uint32_t)0xFF00FFFF;//使用前清零
GPIOA->CRL |= (uint32_t)0x00330000;//配置PA4-5为推挽输出,最大速度50MHz
GPIOA->BSRR = (uint32_t)0x00000010;//PA4引脚输出高电平
GPIOA->BRR = (uint32_t)0x00000020;//PA5引脚输出低电平
//GPIOA->BSRR = (uint32_t)0x00000020;//PA5引脚输出高电平
//GPIOA->BRR = (uint32_t)0x00000010;//PA4引脚输出低电平
PWM_Init(899,0); //(7199+1)*(0+1)/72000000hz = 0.0001s 换成频率为10khz
TIM_SetCompare1(TIM3,450);//设置PWM占空比
//-------------------------------------------------------------------------//
while(1)
{
GPIOC->BSRR = (uint32_t)0x00002000;//PC13引脚输出高电平
Delay_ms(1800); //延时1800ms
GPIOC->BRR = (uint16_t)0x2000; //PC13引脚输出低电平
Delay_ms(1800); //延时1800ms
}
}
pwm.c
文件。
#include "stm32f10x.h"
#include "pwm.h"
void PWM_Init(uint16_t per,uint16_t psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//定义定时器的结构体
GPIO_InitTypeDef GPIO_InitStruct; //定义GPIO的结构体
TIM_OCInitTypeDef TIM_OCInitStruct; //定义输出比较结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//打开GPIOA的时钟、复用时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//打开定时器3时钟
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6; //PA6
GPIO_InitStruct.GPIO_Speed =GPIO_Speed_50MHz;//速度为50mhz
GPIO_Init(GPIOA, &GPIO_InitStruct);//对PA6引脚进行初始化
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//1分频
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInitStruct.TIM_Period = per; //自动装载值
TIM_TimeBaseInitStruct.TIM_Prescaler = psc;//预分频值
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);//对TIM3进行初始化
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //PWM1模式
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCNPolarity_Low;//输出比较极性低
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//输出状态使能
TIM_OCInitStruct.TIM_Pulse = 0;//初始化占空比为0
TIM_OC1Init(TIM3, &TIM_OCInitStruct);//输出比较初始化
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//输出比较1预装载寄存器使能
TIM_Cmd(TIM3,ENABLE);//TIM3使能
}
main.h
文件。
#ifndef __PWM_H
#define __PWM_H
#include "stm32f10x.h"
void PWM_Init(uint16_t per,uint16_t psc);
#endif