所用控制板型号:MSP432P401r

今日终于得以继续我的电赛小车速通之路:

苏轼云   “  素面常嫌粉涴 , 洗妆不褪朱红。 ”

这告诫我们不能只注重在表面粉饰虚伪的自己,要像梅花一样,不断磨砺自己的内在~

后半句是 “   高晴已逐晓云空 ,不与梨花同梦  ”

这是希望我们有着深入的研究精神,不与做大学课设一样只浅浅研究了解就满足了~

本文最终使用MSP432P401r开发板尝试实践驱动TB6612与MG310电机做一些转动动作,正转、反转与停止,调速等功能。编码器测速放在之后的下篇文章,每篇都会附上实验测试视频与整体参考工程!

主要学习的有以下三个模块:TB6612带稳压电机驱动模块MG310电机的编程使用,霍尔编码器的基础知识,文章前部分会先介绍各个模块基础,后续实践并且会贴出驱动代码,不同学习进度的学习者可通过查阅以下目录进行适当地跳跃式阅读:

目录

(一)、TB6612带稳压驱动模块介绍:

一、TB6612 FNG芯片:

二、TB6612带稳压电机驱动模块实物图片:

三、TB6612模块控制信号输入引脚、电机A\B接口、编码器输出口:

(二)、十三线霍尔编码器基础知识:

一、 霍尔编码器的实物图:

二、霍尔编码器原理简介:

(三)、MG310电机参数:

(四)、线路连接:

模块连接详细电路图——————手绘草图:

TB6612与MSP432引脚连接详情:

实物连接图:

(五)、程序设计:

实验程序设计功能解读:

程序设计主要分为以下几部分:(此处建议快速浏览)

1.引脚位带定义与初始化函数的编写

2.PWM频率与占空比的计算

3.按键控制函数的编写:

整体程序代码:

TB6612.c:

TB6612.h:

(六)、演示视频:

(七)、整体测试工程下载链接:


(一)、TB6612带稳压驱动模块介绍:

因为单片机~~ IO 的带负载能力较弱,而直流电机是大电流感性负载,所以需要功率放大器件TB6612FNG来辅助驱动大电流直流电机。

一、TB6612 FNG芯片:

而我们TB6612带稳压模块中,用于驱动电机的芯片是TB6612 FNG,它的实物图如下:

这个最简模块芯片可以用来驱动俩个电机,它的引脚按照输入输出可以分为:

1.AINl/AIN2、BIN1/BIN2、PWMA/PWMB为控制信号输入端;

2. AO1/A02、B01/B02为2路电机控制输出端;

TB6612带稳压驱动模块就是带有这块芯片为主的一个模块,这里我们先不展开讲这个小芯片的每个输入输出引脚的作用,因为接下来在模块中会详细介绍!

二、TB6612带稳压电机驱动模块实物图片:

以上图就是TB6612带稳压驱动模块了,一块这样的TB6612驱动板子能够带动至多俩个MG310电机,并且还能稳压输出5V供电,如果你的小车设备有四个轮子,那就需要俩块这样的板子了。

(1) TB6612 是东芝半导体公司生产的的一款直流电机驱动器件,它具有大电 流的 MOSFET-H 桥结构,双通道电路输出,可同时驱动两个电机。如果我们需 要驱动两个电机,只需要一块 TB6612 芯片即可。
(2) 相比 L298N 的热耗性和外围二极管续流电路,它无需外加散热片,外围电路简单,只需要外接电源滤波电容就可以直接驱动电机,利于减小系统尺寸。
(3) 对于 PWM 信号输入频率范围,高达 100kHz 的频率更是足以满足我们大部 分的需求了。
(4) TB6612 的主要参数:
最大输入电压:VM = 15V
最大输出电流:Iout=1.2A(平均)或=3.2A(峰值)
具有正反转、短路刹车、停机功能模式
内置过热保护和低压检测电路

三、TB6612模块控制信号输入引脚、电机A\B接口、编码器输出口:

这里因为相机拍出的图像不太清晰,我自己整了一个简笔画,凑合看看,我们首先看到它的电机A\B接口与控制信号输入引脚:

左侧绿框就是控制信号输入引脚,是要接在单片机GPIO上的:

PWMA 与PWMB 接到单片机的 PWM 引脚,一般 10Khz 的 PWM 即可,并通过改变占空比来调节电机的速度。

STBY置高模块才能正常工作

AIN1 AIN2BIN1 BIN2 分别控制电机 A 与 电机B 正转和反转

其中 AIN1 AIN2 与 BIN1 BIN2 真值表如下:

AIN1 AIN2与BIN1 BIN2真值表
停止 正转 反转
AIN1 0 1 0
AIN2 0 0 1
BIN1 0 1 0
BIN2 0 0 1

接下来介绍右边的电机编码器相关引脚:

E1A E1BE2A E2B分别连接的是电机A和B上对应的编码器的A B相输出线

A01  A02B01 B02 分别连接的是电机A和电机B

5V和GND就是分别给编码器供电用的

最后是编码器输出引脚:

E1A E1BE2A E2B就是编码器采集到了轴旋转的方向与位置的输出脚,接在单片机上进行采集

ADC脚用于电压检测,可以不进行连接。

(二)、霍尔编码器基础知识:

常见的编码器有两种,分别为霍尔编码器和GMR编码器。这里我只介绍霍尔编码器,关于GMR编码器,我们只需要知道它利用巨磁阻效应进行测速,一般是500线的,所以精度十分高

一、 霍尔编码器的实物图:

从以上示例图我们就可直到霍尔编码器是如何安装的了,它分为霍尔圆盘霍尔编码器磁环俩部分,磁环就是图中的黑色小圆环,它需要直接插合在电机尾部外露的轴上,并且会跟随着轴一起转动。

二、霍尔编码器原理简介:

霍尔编码器圆盘上分布有磁极,当圆盘随电机主轴转动时,会输出两路相位差90°的方波,用这两路方波可测出电机的转速和转向。

霍尔编码器一般是13线的,就是转一圈每项会输出13个脉冲,这个精度基本能够满足大部分使用场景的要求。

E1A和E1B是13线霍尔编码器的两个输出信号,用于输出轴旋转方向和位置信息。

E1A是正交方波信号,当轴逆时针旋转时,E1A会先于E1B产生信号变化,用于判断旋转方向。

E1B是正交方波信号,当轴顺时针旋转时,E1B会先于E1A产生信号变化,用于判断旋转方向。

两个信号数量相同,相位差90度,可以通过对信号的计数和相位差计算来确定轴的位置。

(三)、MG310电机参数:

由图可知,此电机带有的霍尔编码器是260线霍尔编码器。

(四)、线路连接:

模块连接详细电路图——————手绘草图:

TB6612与MSP432引脚连接详情:

AIN1___P2^4     PWMA___P7^6     BIN1___P2^6

AIN2___P2^5    PWMB___P7^7    BIN2___P2^7

PS:用到的是定时器TA1的通道2与通道1

PS:起初因为没注意到通道0是频率基准,误用通道0的引脚P8.0,已经改回为P7.6了

实物连接图:

(五)、程序设计:

注意:

本次实验使用定时器A1输出PWM,对输出的PWM有占空比调整方面的需求,所以不能使用通道0,因为通道0的寄存器CCR0的值是计时基准,不可被修改,因此我选用通道1和2。

实验程序设计功能解读:

1.通过矩阵按键控制电机A和B:

与电机A有关的控制:

S1控制正转 S2控制反转 S3控制加速(加占空比) S4控制减速(减占空比)S9控制停止

与电机B有关的控制:

S5控制正转 S6控制反转 S7控制加速(加占空比) S8控制减速(减占空比)S10控制停止

2.通过串口打印当前 PWM_DIVA 与 PWM_DIVB 的值,帮助计算占空比:

PWM_DIVA 与 PWM_DIVB 用于调整发送给电机A与B的占空比

当前A电机接收信号  占空比=PWM_DIVA/CCRO*100%

注:CCRO在后文会有计算得出,它等于99。

程序设计主要分为以下几部分:(此处建议快速浏览)

1.引脚位带定义与初始化函数的编写

// 位带操作
//定义引脚名称
#define AIN1   BITBAND_PERI(P2OUT,4)
#define AIN2   BITBAND_PERI(P2OUT,5)
#define BIN1   BITBAND_PERI(P2OUT,6)
#define BIN2   BITBAND_PERI(P2OUT,7)#define PWMA   BITBAND_PERI(P7OUT,6)
#define PWMB   BITBAND_PERI(P7OUT,7)
//初始化控制TB6612 的引脚,定时器,中断
void inint_TB6612(void)
{//初始化AIN BINMAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN4);MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN5);MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN6);MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN7);//初始化定时器TA1 通道2    //1.配置GPIO复用GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7,GPIO_PIN6,GPIO_PRIMARY_MODULE_FUNCTION);//2.配置结构体Timer_A_PWMConfig TimA1_PWMConfig1;                                                               //定义一个名为 TimA1_PWMConfig的结构体TimA1_PWMConfig1.clockSource=TIMER_A_CLOCKSOURCE_SMCLK;                     //时钟源TimA1_PWMConfig1.clockSourceDivider=CLKDIV;                                                        //时钟分频 范围1~64TimA1_PWMConfig1.timerPeriod=CCR0;                                                             //自动重载值TimA1_PWMConfig1.compareRegister=TIMER_A_CAPTURECOMPARE_REGISTER_2;//通道2(与引脚相关联)TimA1_PWMConfig1.compareOutputMode=TIMER_A_OUTPUTMODE_TOGGLE_SET;  //输出模式TimA1_PWMConfig1.dutyCycle=3;                                                                     //此处可调占空比//初始化定时器TA1 通道1//1.配置GPIO复用 GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7,GPIO_PIN7,GPIO_PRIMARY_MODULE_FUNCTION);//2.配置结构体Timer_A_PWMConfig TimA1_PWMConfig2;                                                              //定义一个名为 TimA1_PWMConfig的结构体TimA1_PWMConfig2.clockSource=TIMER_A_CLOCKSOURCE_SMCLK;                     //时钟源TimA1_PWMConfig2.clockSourceDivider=CLKDIV;                                                        //时钟分频 范围1~64TimA1_PWMConfig2.timerPeriod=CCR0;                                                             //自动重载值TimA1_PWMConfig2.compareRegister=TIMER_A_CAPTURECOMPARE_REGISTER_1;//通道1(与引脚相关联)TimA1_PWMConfig2.compareOutputMode=TIMER_A_OUTPUTMODE_TOGGLE_SET;  //输出模式TimA1_PWMConfig2.dutyCycle=3;                                                                     //此处可调占空比   //初始化定时器:Timer_A_generatePWM(TIMER_A1_BASE,&TimA1_PWMConfig2);Timer_A_generatePWM(TIMER_A1_BASE,&TimA1_PWMConfig1);AIN1=0;AIN2=0;BIN1=0;BIN2=0;  //初始化不转
}

2.PWM频率与占空比的计算

我们首先要知道需要10kHz的PWM来驱动电机,其次根据公式计算CCR0值:

- PWM频率  =  时钟源频率  /  (时钟源除数值“时钟分频”  *  (CCR0值“自动重载值” + 1))

因而列出算式:10000=48000000/(48*(CCR0+1))

计算得出CCR0=99;

此外定义好CCRO、CLKDIV用于结构体初始化定时器TA1

#define CCR1_MIN 3 与 #define CCR1_MAX 99 这俩句定义了占空比3%~100%

#define DIV_PWM 3 定义了PWM_DIVA 与 PWM_DIVB 每次加减的分度为3,因为在四个函数都有PWM_DIVA 与 PWM_DIVB 的加减,加减几是最佳,起初不能确定,所以定义了它,到时修改十分方便!

//定义定时器中断需要的初始化变量
//定义调整占空比的变量
#define CLKDIV 48
#define CCR0 99
#define CCR1_MIN 3
#define CCR1_MAX 99#define DIV_PWM 3

3.按键控制函数的编写:

uint8_t key_value;       key_value = KEY4x4_Scan(0);switch(key_value){case 1:set_A(1);break; //A电机正转case 2:set_A(2);break; //A电机反转case 3:speedup_A();printf("PWM_DIVA=%d\r\n",PWM_DIVA);break; //A电机加速case 4:speeddown_A();printf("PWM_DIVA=%d\r\n",PWM_DIVA);break; //A电机减速         case 5:set_B(1);break; //B电机正转case 6:set_B(2);break; //B电机反转case 7:speedup_B();printf("PWM_DIVB=%d\r\n",PWM_DIVB);break; //B电机加速case 8:speeddown_B();printf("PWM_DIVB=%d\r\n",PWM_DIVB);break;//B电机减速           case 9:set_A(0);break; //关闭A电机case 10:set_B(0);break; //关闭B电机           }

整体程序代码:

TB6612.c:

#include "TB6612.h"uint16_t PWM_DIVA;
uint16_t PWM_DIVB;//初始化控制TB6612 的引脚,定时器,中断
void inint_TB6612(void)
{//初始化AIN BINMAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN4);MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN5);MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN6);MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN7);//初始化定时器TA1 通道2    //1.配置GPIO复用GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7,GPIO_PIN6,GPIO_PRIMARY_MODULE_FUNCTION);//2.配置结构体Timer_A_PWMConfig TimA1_PWMConfig1;                                                               //定义一个名为 TimA1_PWMConfig的结构体TimA1_PWMConfig1.clockSource=TIMER_A_CLOCKSOURCE_SMCLK;                     //时钟源TimA1_PWMConfig1.clockSourceDivider=CLKDIV;                                                        //时钟分频 范围1~64TimA1_PWMConfig1.timerPeriod=CCR0;                                                             //自动重载值TimA1_PWMConfig1.compareRegister=TIMER_A_CAPTURECOMPARE_REGISTER_2;//通道2(与引脚相关联)TimA1_PWMConfig1.compareOutputMode=TIMER_A_OUTPUTMODE_TOGGLE_SET;  //输出模式TimA1_PWMConfig1.dutyCycle=3;                                                                     //此处可调占空比//初始化定时器TA1 通道1//1.配置GPIO复用 GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7,GPIO_PIN7,GPIO_PRIMARY_MODULE_FUNCTION);//2.配置结构体Timer_A_PWMConfig TimA1_PWMConfig2;                                                              //定义一个名为 TimA1_PWMConfig的结构体TimA1_PWMConfig2.clockSource=TIMER_A_CLOCKSOURCE_SMCLK;                     //时钟源TimA1_PWMConfig2.clockSourceDivider=CLKDIV;                                                        //时钟分频 范围1~64TimA1_PWMConfig2.timerPeriod=CCR0;                                                             //自动重载值TimA1_PWMConfig2.compareRegister=TIMER_A_CAPTURECOMPARE_REGISTER_1;//通道1(与引脚相关联)TimA1_PWMConfig2.compareOutputMode=TIMER_A_OUTPUTMODE_TOGGLE_SET;  //输出模式TimA1_PWMConfig2.dutyCycle=3;                                                                     //此处可调占空比   //初始化定时器:Timer_A_generatePWM(TIMER_A1_BASE,&TimA1_PWMConfig2);Timer_A_generatePWM(TIMER_A1_BASE,&TimA1_PWMConfig1);AIN1=0;AIN2=0;BIN1=0;BIN2=0;  //初始化不转
}//A电机加速
void speedup_A(void)
{PWM_DIVA+=DIV_PWM;if(PWM_DIVA>=99) {PWM_DIVA=CCR1_MAX;}MAP_Timer_A_setCompareValue(TIMER_A1_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_2,PWM_DIVA);
}
//B电机加速
void speedup_B(void)
{PWM_DIVB+=DIV_PWM;if(PWM_DIVB>=99) {PWM_DIVB=CCR1_MAX;} MAP_Timer_A_setCompareValue(TIMER_A1_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,PWM_DIVB);
}   //A电机减速
void speeddown_A(void)
{PWM_DIVA-=DIV_PWM;if(PWM_DIVA<=3) {PWM_DIVA=CCR1_MIN;}MAP_Timer_A_setCompareValue(TIMER_A1_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_2,PWM_DIVA);
}
//B电机减速
void speeddown_B(void)
{PWM_DIVB-=DIV_PWM;if(PWM_DIVB<=3) {PWM_DIVB=CCR1_MIN;}MAP_Timer_A_setCompareValue(TIMER_A1_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,PWM_DIVB);
}   //设置A电机正反转  0停转 1正 2反
void set_A(uint16_t i)
{switch(i){case 0:AIN1=0;AIN2=0;break;case 1:AIN1=1;AIN2=0;break;case 2:AIN1=0;AIN2=1;break;        }
}//设置B电机正反转 0停转 1正 2反
void set_B(uint16_t i)
{switch(i){case 0:BIN1=0;BIN2=0;break;case 1:BIN1=1;BIN2=0;break;case 2:BIN1=0;BIN2=1;break;        }
}

TB6612.h:

#ifndef _TB6612_h_
#define _TB6612_h_ #include <ti/devices/msp432p4xx/driverlib/driverlib.h>//定义定时器中断需要的初始化变量
//定义调整占空比的变量
#define CLKDIV 48
#define CCR0 99
#define CCR1_MIN 3
#define CCR1_MAX 99#define DIV_PWM 3// 位带操作
//定义引脚名称
#define AIN1   BITBAND_PERI(P2OUT,4)
#define AIN2   BITBAND_PERI(P2OUT,5)
#define BIN1   BITBAND_PERI(P2OUT,6)
#define BIN2   BITBAND_PERI(P2OUT,7)#define PWMA   BITBAND_PERI(P7OUT,6)
#define PWMB   BITBAND_PERI(P7OUT,7)extern uint16_t PWM_DIVA;
extern uint16_t PWM_DIVB;void inint_TB6612(void);void speedup_A(void);
void speedup_B(void);void speeddown_A(void);
void speeddown_B(void);void set_A(uint16_t i);
void set_B(uint16_t i);#endif

(六)、演示视频:

TB6612驱动MG310电机

(七)、整体测试工程下载链接:

链接无效尝试搜名称:MSP432驱动TB6612与D电机.rar

https://download.csdn.net/download/qq_64257614/87907150

【MSP432电机驱动学习—上篇】TB6612带稳压电机驱动模块、MG310电机、霍尔编码器相关推荐

  1. 电路学习(3)——稳压电路(78L05)

    前言:本次学习的电路是利用78L05设计的一个24V转5V的稳压电路. 目录 78L05简介 稳压电路 稳压电路中的电阻.电容和二极管的作用 78L05简介 78L05属于78系列的一款集成的线性稳压 ...

  2. 硬件学习之路-改善稳压电路的动态响应

    改善稳压电源电路的动态响应 又来了,上周在调试公司项目板子的时候有遇到一个问题:我们项目上有一个通信模组,通信模组在2G扩展频段工作时,发射网络数据的时候瞬间电流达到2A,导致电源电压被瞬间拉到3V3 ...

  3. 【MSP432电机驱动设计—下篇】霍尔编码器测车轮运行距离与M/T综合公式法测速概念

    开发板型号为MSP432P401r 今日得以继续我的MSP432电赛速通之路,本篇使用MSP432编程学习霍尔编码器M/T公式法测速概念,最终实现用外部中断方式测得小车行走路程,文章学习讲解原理.附上 ...

  4. 霍尔编码器电机与TB6612电机驱动相关学习

    简单粗暴的说下,电机-电机驱动-单片机该怎么连线. 先简单认识一下霍尔编码器电机 以上选用的平衡小车之家的,市面上基本都跟这个差不了多少. 电机线-+这两个引脚 与电机驱动相连接 来控制电机的正反转( ...

  5. 电源学习总结(三)——线性稳压的参数

    前文提到了一些线性稳压的主要特点,本文作者将结合NXP智能车大赛实际案例,说一下电源设计容易踩的坑和线性稳压选型过程. 文章目录 主要参数 输出电压 输入电压 热阻 基准电压 压降 最大电流 输入电容 ...

  6. 电源学习总结(二)——线性稳压主要特点及原理

    文章目录 主要特点 内部结构 常见的三端线性稳压:AMS1117 主要特点 线性稳压最为突出的优点主要有成本低,噪声低,体积小.由于线性稳压结构简单,生产相对容易,因此其生产成本可以很低,同时其需要的 ...

  7. 智能型水泵控制器,双路排污、稳压控制、带BA接口

    智能型水泵控制器GYXF330-2LP-B,双路排污.稳压控制.带BA接口,是应市场需求推出的一款高性能产品,主要用于排污泵.稳压泵.给水泵等控制.本装置用于水泵控制设备中的逻辑运算.自动远程信号处理 ...

  8. AUTOCAD学习笔记8:单相桥式整流滤波稳压电路的绘制

    本文介绍使用AutoCAD绘制单相桥式整流滤波稳压电路的方法与步骤. 1.根据前面教程所述的方法与步骤绘制电路图,如下图所示. 2.绘制稳压电路 3.稳压后波形曲线 4.完整电路图

  9. 南京微盟计算机,南京微盟 ME6118A50B3G ME6119A33PG ME6119A50PG 稳压IC

    南京微盟 ME6118A50B3G ME6119A33PG ME6119A50PG 稳压IC  本信息的网址是:http://mall.cntrades.com/show-7146097.html M ...

最新文章

  1. soj 4539 贪心+优先队列
  2. linux sed错误sed: -e expression #1, unknown option to `s'解决办法
  3. 大连海事大学计算机调剂,大连海事大学2017年考研调剂信息
  4. 网络规划设计师考试说明
  5. 共享内存:mmap函数实现
  6. 南京宝坚电子,招聘图像算法工程师
  7. python入门教程傻瓜版_毫无基础的人如何入门 Python ?Python入门教程拿走不谢啦!...
  8. oracle null的解析
  9. 开发申请评分卡的第一步要做什么
  10. 大快HanLP自然语言处理技术介绍
  11. python pip安装+easy_install
  12. 用python做数据分析教程_Python运用于数据分析的简单教程
  13. eggjs 项目实践
  14. 【递归,Java从入门到精通第五版pdf百度云
  15. TIA WinCC Professional入门经典(1) 组态第一个WinCC Professional项目
  16. 计算机如何连接网络共享文件,电脑之间如何共享文件?
  17. android 如何启动apk,Android JS启动APK
  18. 学大伟业:2019年生物竞赛学习方法
  19. MySQL创建用户并授权、删除用户(密码规则)
  20. PHP经典高级工程师面试题

热门文章

  1. 如何安装python安装包
  2. java 右shift键_【已解决】Eclipse中Ctrl+Shift+右箭头无法实现一次性选择整个单词(Ctrl+右箭头无法实现整个单词级别的移动)...
  3. Angular 2.0 入门-架构总览
  4. 把一棵树转换为二叉树后,这棵二叉树的形态是( )
  5. 微信支付 CertificateDownloader 证书下载
  6. 10位世界级投资大师100金句
  7. Mac下安装 PlantUML 插件画时序图、UML类图
  8. URLEncoder转换字符串问题
  9. Node.js:浅析高并发与分布式集群
  10. suricata之linux编译