赞
踩
所用控制板型号:MSP432P401r
今日终于得以继续我的电赛小车速通之路:
苏轼云 “ 素面常嫌粉涴 , 洗妆不褪朱红。 ”
这告诫我们不能只注重在表面粉饰虚伪的自己,要像梅花一样,不断磨砺自己的内在~
后半句是 “ 高晴已逐晓云空 ,不与梨花同梦 ”
这是希望我们有着深入的研究精神,不与做大学课设一样只浅浅研究了解就满足了~
本文最终使用MSP432P401r开发板尝试实践驱动TB6612与MG310电机做一些转动动作,正转、反转与停止,调速等功能。编码器测速放在之后的下篇文章,每篇都会附上实验测试视频与整体参考工程!
主要学习的有以下三个模块:TB6612带稳压电机驱动模块、MG310电机的编程使用,霍尔编码器的基础知识,文章前部分会先介绍各个模块基础,后续实践并且会贴出驱动代码,不同学习进度的学习者可通过查阅以下目录进行适当地跳跃式阅读:
目录
三、TB6612模块控制信号输入引脚、电机A\B接口、编码器输出口:
因为单片机~~ IO 的带负载能力较弱,而直流电机是大电流感性负载,所以需要功率放大器件TB6612FNG来辅助驱动大电流直流电机。
而我们TB6612带稳压模块中,用于驱动电机的芯片是TB6612 FNG,它的实物图如下:
这个最简模块芯片可以用来驱动俩个电机,它的引脚按照输入输出可以分为:
1.AINl/AIN2、BIN1/BIN2、PWMA/PWMB为控制信号输入端;
2. AO1/A02、B01/B02为2路电机控制输出端;
TB6612带稳压驱动模块就是带有这块芯片为主的一个模块,这里我们先不展开讲这个小芯片的每个输入输出引脚的作用,因为接下来在模块中会详细介绍!
以上图就是TB6612带稳压驱动模块了,一块这样的TB6612驱动板子能够带动至多俩个MG310电机,并且还能稳压输出5V供电,如果你的小车设备有四个轮子,那就需要俩块这样的板子了。
这里因为相机拍出的图像不太清晰,我自己整了一个简笔画,凑合看看,我们首先看到它的电机A\B接口与控制信号输入引脚:
左侧绿框就是控制信号输入引脚,是要接在单片机GPIO上的:
PWMA 与PWMB 接到单片机的 PWM 引脚,一般 10Khz 的 PWM 即可,并通过改变占空比来调节电机的速度。
STBY置高模块才能正常工作
AIN1 AIN2 与 BIN1 BIN2 分别控制电机 A 与 电机B 正转和反转
其中 AIN1 AIN2 与 BIN1 BIN2 真值表如下:
停止 | 正转 | 反转 | |
AIN1 | 0 | 1 | 0 |
AIN2 | 0 | 0 | 1 |
BIN1 | 0 | 1 | 0 |
BIN2 | 0 | 0 | 1 |
接下来介绍右边的电机编码器相关引脚:
E1A E1B 与E2A E2B分别连接的是电机A和B上对应的编码器的A B相输出线
A01 A02 与B01 B02 分别连接的是电机A和电机B
5V和GND就是分别给编码器供电用的
最后是编码器输出引脚:
E1A E1B 和 E2A E2B就是编码器采集到了轴旋转的方向与位置的输出脚,接在单片机上进行采集
ADC脚用于电压检测,可以不进行连接。
常见的编码器有两种,分别为霍尔编码器和GMR编码器。这里我只介绍霍尔编码器,关于GMR编码器,我们只需要知道它利用巨磁阻效应进行测速,一般是500线的,所以精度十分高
从以上示例图我们就可直到霍尔编码器是如何安装的了,它分为霍尔圆盘和霍尔编码器磁环俩部分,磁环就是图中的黑色小圆环,它需要直接插合在电机尾部外露的轴上,并且会跟随着轴一起转动。
霍尔编码器圆盘上分布有磁极,当圆盘随电机主轴转动时,会输出两路相位差90°的方波,用这两路方波可测出电机的转速和转向。
霍尔编码器一般是13线的,就是转一圈每项会输出13个脉冲,这个精度基本能够满足大部分使用场景的要求。
E1A和E1B是13线霍尔编码器的两个输出信号,用于输出轴旋转方向和位置信息。
E1A是正交方波信号,当轴逆时针旋转时,E1A会先于E1B产生信号变化,用于判断旋转方向。
E1B是正交方波信号,当轴顺时针旋转时,E1B会先于E1A产生信号变化,用于判断旋转方向。
两个信号数量相同,相位差90度,可以通过对信号的计数和相位差计算来确定轴的位置。
由图可知,此电机带有的霍尔编码器是260线霍尔编码器。
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。
- // 位带操作
- //定义引脚名称
- #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 BIN
- MAP_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~64
- TimA1_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~64
- TimA1_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; //初始化不转
- }
我们首先要知道需要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
- 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电机
-
- }
- #include "TB6612.h"
-
- uint16_t PWM_DIVA;
- uint16_t PWM_DIVB;
-
- //初始化控制TB6612 的引脚,定时器,中断
- void inint_TB6612(void)
- {
- //初始化AIN BIN
- MAP_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~64
- TimA1_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~64
- TimA1_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;
- }
- }
- #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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。