TB6612与电机编码器



前言

本文将讲述关于电机的知识,内容包含电机驱动和电机编码器。电机驱动介绍TB6612FNG。


以下是本篇文章的正文内容

一、为什么要用电机驱动

一般电机接上电源就可以转了,正接正转,反接反转。
如果要用单片机的IO口控制电机就需要电机驱动,原因是IO口功率不够驱动不了电机,而且单片机可能会烧掉。

二、TB6612电机驱动

1.TB6612介绍

TB6612FNG可以驱动两个电机,TB6612FNG 模块相对于传统的 L298N 效率上提高很多,体积上也大幅度减少,在额定范围内,芯片基本不发热。PWM控制的频率可达100kHZ。

以下是TB6612FNG模块的原理图
图2.1.1
实际使用的就是下列引脚:

VM:电机驱动电压,一般为2.5~13.5V
VCC:芯片驱动电压,3.3V或5V
STBY:高电平(3.3V/5V)使能芯片,低电平进入待机状态
PWMA:电机A的PWM控制,接单片机
PWMB:电机B的PWM控制,接单片机
AIN1:电机A的逻辑输入,接单片机
AIN2:电机A的逻辑输入,接单片机
BIN1:电机B的逻辑输入,接单片机
BIN2:电机B的逻辑输入,接单片机
AO1:电机A的输出,接电机A
AO2:电机A的输出,接电机A
BO1:电机B的输出,接电机B
BO2:电机B的输出,接电机B

2.TB6612的使用

以一个直流电机为例,电机的两个供电引脚接到AO1和AO2。PWMA、AIN1、AIN2接到单片机的IO口上,PWMA可以接到定时器IO输出PWM。VCC接3.3V或者5V。VM是电机供电电压,根据电机额定电压来接,注意只能是2.5~13.5V。STBY跟VCC接到一起。

真值表

AIN1001
AIN2010
状态停止正转反转
BIN1001
BIN2010
状态停止正转反转

根据真值表控制IO口从而控制正反转。
PWMA输出不同脉宽从而控制转速。

三、电机编码器

1.为什么要用电机编码器

电机编码器分两种,光电编码器和霍尔编码器。光电编码器精度更高,价格也比较贵。电机编码器可以测量出电机的角度、速度、正反转。有了电机编码器就可以监控电机的状态从而更好的控制电机。

2.电机编码器的使用

电机编码器有AB两相,AB相输出两个脉冲,编码器的所有信息都融合在这两个脉冲。
一般编码器都有四根线,VCC、GND、A相、B相。AB相接到单片机IO口捕获脉冲。

理想的AB相波形图。
图3.2.1
(1)根据A相超前还是滞后B相来判断正反转。
(2)电机每转一圈的脉冲数目是相同的,所以测量的脉冲数目除上一圈的总数目就是电机当前角度了。如果采用四倍频计数,还要再除上4。
(3)如果每隔一段时间读脉冲数目然后把计数器清0,那么所读的数目除上时间就相当于电机转速。

如果使用STM32,可以用定时器输入捕获的编码器模式来计数。直接读取计数器数值就可以了,而且自带滤波。


结语

那么以上就是本篇文章的所有内容了。
本文如果有什么不对的或者需要改进的地方欢迎指出。

### TB6612 驱动编码器电机的使用方法 #### 控制接口说明 TB6612是一款双H桥直流电机驱动芯片,能够控制两个直流电机或步进电机。该模块具有STBY引脚用于待机模式控制,AIN1, AIN2以及PWMA用来调节第一个电机的速度和方向;BIN1, BIN2PWMB则对应第二个电机[^1]。 对于带有编码器反馈的电机来说,在利用TB6612进行速度调整的同时还需要读取编码器信号来实现闭环控制系统。通常情况下,编码器会提供两路相位差90度的脉冲波形给微控制器处理,通过计算单位时间内接收到的脉冲数量可以得知当前转速,并据此调整PWM占空比达到稳定运行的目的[^2]。 #### Python代码示例 (基于Raspberry Pi) ```python import RPi.GPIO as GPIO from time import sleep # 定义GPIO引脚编号 AIN1 = 18 AIN2 = 23 PWMA = 24 BIN1 = 17 BIN2 = 27 PWMB = 22 STBY = 4 ENCODER_PIN_A = 25 # 假设连接到编码器通道A ENCODER_PIN_B = 8 # 假设连接到编码器通道B def setup(): global p_a, p_b GPIO.setmode(GPIO.BCM) # 设置TB6612FNG输入端口 GPIO.setup([AIN1, AIN2, PWMA], GPIO.OUT) GPIO.setup([BIN1, BIN2, PWMB], GPIO.OUT) GPIO.setup(STBY, GPIO.OUT) # 初始化PWM对象并设置频率为1kHz p_a = GPIO.PWM(PWMA, 1000) p_b = GPIO.PWM(PWMB, 1000) def forward(speed=50): GPIO.output(AIN1, True) GPIO.output(AIN2, False) GPIO.output(BIN1, True) GPIO.output(BIN2, False) GPIO.output(STBY, True) p_a.start(speed) p_b.start(speed) def stop(): GPIO.output(STBY, False) p_a.stop() p_b.stop() if __name__ == '__main__': try: setup() while True: forward(75) # 启动电机向前移动,设定初始速度为75% # 这里应该加入编码器计数逻辑 sleep(2) # 维持此状态一段时间 except KeyboardInterrupt: pass finally: stop() # 清理资源前先停止所有动作 GPIO.cleanup() # 复原GPIO配置 ``` 上述程序展示了如何初始化TB6612驱动板并通过Python控制其带动一对轮子前进。然而为了完成完整的编码器功能集成,还需进一步编写针对具体硬件平台(如Arduino、STM32或其他MCU)上的中断服务程序去捕捉来自增量型旋转编码器AB相的变化情况,进而解析出实际转动角度或者线性位移信息[^3]。
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微光feng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值