入门到入魂:单片机如何利用TB6600高精度控制步进电机(42/57)


日常唠嗑

前阵子写了一篇FPGA:双线轨丝杠式升降台(及A4988与42步进电机原理)(同时包含51及32程序)里面用了A4988驱动模块作为驱动器,这个模块的优点是体积小,价格便宜,一个大概是两块钱左右,多用于打印机或者空间较小的作品上。 缺点是容易烧,电路保护能力差,细分精度较低,只能做到16细分。而使用TB6600的话,可以做到32细分,某宝的价格大概是一个30块钱。当然还有一种精度更高MC542E驱动器,这种的话价格较为昂贵,100左右一个。好了,废话不多说,每个驱动器的差异具体怎么样,后面再讲。

一、每次转动30°效果视频

51单片机使用TB6600精准控制步进电机转动度数

二、了解TB6600及电机接线

1.TB6600

TB6600是一款专业的两相步进电机驱动器,兼容Arduino和其他多种主控器,可实现电机正反转控制,旋转角度控制等功能。

什么是步进电机驱动器?为什么需要步进电机驱动器?

步进电机驱动是一种电子设备,通常作为桥梁来连接控制器、电源和步进电机。虽然控制器的处理性能很强大,但是它本身的输出能力(电流)却很弱小。它需要一个中间桥梁去连接电机和主控,并同时为电机提供足够的电源。就好比人类的大脑,脑组织本身非常脆弱,但它可以通过给肌肉下达命令来带动整个身体。驱动器就好比人类的肌肉,是负责整个系统运动的重要环节的一部分。

TB6600步进电机驱动器采用H桥双极恒相流驱动,可直接用9~42VDC供电,可选择7档细分控制(1、2/A、2/B、4、8、16、32),8档电流控制(0.5A、1A、1.5A、2A、2.5A、2.8A、3.0A、3.5A)。最高支持4A电流输出。信号端都有配有高速光电隔离,防止信号干扰,并且支持共阴、共阳两种信号输入方式。出于安全考虑,驱动器支持脱机保持功能,能够让用户在通电状态下调试。内置温度保护和过流保护,可适应更严苛的工作环境。

驱动器适合驱动57、42型两相、四相混合式步进电机,能达到低振动、低噪声、高速度的驱动效果。可以适用于机械人控制,3D打印等高精度应用领域中。
啰里吧嗦讲了这么多,我都看烦了。我就单纯想知道怎么用,能不能别废话?爬?
(我爬qwq)马上安排: 如何使用使用这款驱动器,主要有三个难点细分设置,电流设置,如何接线(这个是最关键的,线没接对,怎么调程序都没用)。后面我就根据这个图来讲一下TB6600该怎么配置。
TB6600驱动器

1.1细分设置(精度控制)

上图中的SW1,SW2,SW3三个开关就是用来设置细分的,细分设定直接看驱动器的(细分设定参考表)无需查资料。如何看这个表,打个比方:S1 on , S2 off , S3 off ,那么就是4细分(也叫800细分),将开关的1往下拨就行,其他两个往上拨(开关往下拨就是on)。细分设置完,接下来就是如何利用细分控制转动的角度: 42及57步进电机,步距角基本都是1.8°,这个1.8°什么意思呢?就是一个脉冲走1.8°,好那么问题来了,有些朋友可能会问,什么叫一个脉冲?一个高电平一个低电平合起来就叫一个脉冲(上图中:PUL这个引脚,你让他1000us翻转一次,他就构成一个脉冲)。步进电机一个脉冲1.8°,那我们要让他转动一圈360°,就需要给他200个脉冲。 体现在程序里就是:

for( x = 0; x <=200; x++) {
    
     //一圈200个脉冲    两个pul为一个脉冲    16个脉冲就是28.8°距离30°是1.2°
     pul=1; 
     Delay1000us();                 //修改微秒值可以调速
     pul=0;
     Delay1000us();              
  }

那么我们如何让他每次只转动30°呢?只需要改变脉冲个数即可,比如我们把程序改成:

for( x = 0; x <=16; x++) {
    
     //一圈200个脉冲    两个pul为一个脉冲    16个脉冲就是28.8°距离30°是1.2°
     pul=1; 
     Delay1000us();                 //修改微秒值可以调速
     pul=0;
     Delay1000us();              
  }

那么,他每次就是转28.8°,但是这样的话,还是没办法做到30°,这个时候,我们可以通过调节细分来提高精度。比如我们设置4细分,那么一个脉冲就是走 1.8÷4=0.45°。这个时候如果我们每次给他66个脉冲,那么他每次就能转29.7°,相比于28.8°就更接近30°了。

1.2电流设置

上图中的SW34,SW5,SW6主要就是用来设置输出电流的,这个如何设置主要根据电机来拨动了开关。像42电机,他的额定电流是1.5A,那么我们就需要根据电流设定表,给他设定成 SW4 ON ,SW5 ON ,SW6 OFF。
在这里插入图片描述

1.3如何接线(重点)

有时候你接线接错了,程序调一个通宵都不知道怎么回事!!!!!会出现什么情况:电机不会转。会转的话抖动跟声音特别大。

1.3.1步进电机与驱动器的接线

42及57步进电机怎么接线,我自己画了张图,你们可以参考一下。
在这里插入图片描述
实物接线如下:
在这里插入图片描述
如果你们还是怕接错,教一个看你有没有接对的方法:拿万用表,转到蜂鸣器那里,测一下电机的引脚,会响的两个引脚就是同相的(A+ A-为一相,B+,B-为另一相)。这也是两相步进电机名字的由来。
57接线:
在这里插入图片描述
在这里我要举个反面教材:这篇博客的接线就是错误的!!!程序写完,电机疯狂抖动,怎么调都无济于事,花了我两个小时在那里看程序qwq!!!!
在这里插入图片描述

1.3.2驱动器与主控板的接线

驱动器与主控板的接线方式主要有两种:共阳极与共阴极。这里借一下网友两张图。第一个是共阳极,第二个是共阴极。
在这里插入图片描述
在这里插入图片描述
在这里推荐第一种接法(共阳极),因为我们单片机io口的驱动能力比较有限,所以采用共阳极会比较好,用共阴极的话,有时候会出现电机不会动的情况。EN- , DIR - ,PUL -接主控板io口,EN+ ,DIR+,PUL用串在一起,然后接到单片机的5V就行了。

三、C程序(51)

#include"reg52.h"
#include <intrins.h>  //微秒(_nop_)头文件
sbit dir=P1^0;
sbit pul=P1^1;
sbit ena=P1^5;
#define uint  unsigned int
void Delay_xms(uint x);

void Delay1000us()		//@11.0592MHz
{
    
    
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
    
    
		while (--j);
	} while (--i);
}
void Delay_xms(uint x)
{
    
    
 uint i,j;
 for(i=0;i<x;i++)
  for(j=0;j<112;j++);
}

void main()
{
    
    
	uint x,y;
	dir=1;       //dir为1时正转,dir为0时反转
	ena=1;
//for( y = 0; y<5; y++) {             //正转4圈,修改Y值,可以改变圈数
	 for( x = 0; x <=133; x++) {
    
            //一圈200个脉冲      两个pul为一个脉冲    16个脉冲就是28.8°距离30°是1.2°,如果改成17个脉冲就是30.6°
     pul=1; 
     Delay1000us();                 //修改微秒值可以调速
     pul=0;
     Delay1000us();              
  }
//}	
Delay_xms(1000);                   //1.5秒转一次     如果想把这个程序作为子程序,加入主程序,只需要将这个延时注释掉即可
}

猜你喜欢

转载自blog.csdn.net/weixin_46423500/article/details/109894854