设为首页收藏本站

极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24330|回复: 34

菜鸟玩步进电机 与 TB6560 驱动频率的测试

[复制链接]
发表于 2015-2-9 09:58:46 | 显示全部楼层 |阅读模式
本帖最后由 hi55234 于 2015-2-17 16:23 编辑




作案工具如下:
1、2相42步进电机一个(57、39啥的也可以啊)
2、TB6560驱动板一块(别问我为啥选这个,我不会告诉你是因为接线很方便、我已经不喜欢动烙铁了)
3、杜邦线导线若干,面包板一块、2.54的排针若干
4、主角:arduino pro mini一块,当然了,用其他的也可以,推荐nano,免烙铁

一、步进电机接线图(别问我为啥选2相的,说多了都是泪,2相驱动器20多元,5相驱动器100+,是穷)
捕获.PNG

问:LZ你丫倒是好,有文档知道哪组是哪组,我这没文档的怎么破?
答:
图像 (1).jpg
通过上图可知,A,~A 是联通的,B 和~B 是联通。那么,A 和~A 是一组a,B 和~B 是一组b。
不管是两相四相,四相五线,四相六线步进电机。内部构造都是如此。至于究竟是四线,五线,还是六线。就要看A 和~A 之间,B 和B~之间有没有公共端com抽线。如果a 组和b 组各自有一个com 端,则该步进电机六线,如果a 和b 组的公共端连在一起,则是5线的。
所以,要弄清步进电机如何接线,只需把a 组和b 组分开。用万用表打。
四线:由于四线没有com 公共抽线,所以,a 和b 组是绝对绝缘的,不连通的。所以,用万用表测,不连通的是一组。
五线:由于五线中,a 和b 组的公共端是连接在一起的。用万用表测,当发现有一根线和其他几根线的电阻是相当的,那么,这根线就是公共com 端。对于驱动五线步进电机,公共com 端不连接也是可以驱动步进电机的。
六线:a 和b 组的公共抽线com 端是不连通的。同样,用万用表测电阻,发现其中一根线和其他两根线阻止是一样的,那么这根线是com 端,另2 根线就属于一组。对于驱动四相六线步进电机,两根公共com 端不接先也可以驱动该步进电机的。

问:A+/B+ 如何区分
答:A+/B+是自己定义的,只需要区分出两个绕组 则可 。起始方向反了,调换其中一个绕组的两根接线

二:TB6560接线图
说多了都是泪,当时没注意,用的共阴接法,EN+直接接了5V,一直在脱机,从来不转动,来回折腾了我2-3小时,尼玛啊
捕获1.PNG
捕获2.PNG
捕获3.PNG
捕获4.PNG
捕获5.PNG
回复

使用道具 举报

 楼主| 发表于 2015-2-9 09:59:28 | 显示全部楼层
本帖最后由 hi55234 于 2015-2-9 10:17 编辑

程序部分····················
先看一个失败的程序,原帖地址是
http://www.instructables.com/id/ ... driver/all/?lang=zh

别问我为啥要翻出这贴,我是菜鸟一个,怎么驱动都不知道,能不向前辈取经么?

失败的原因:

Connection to arduino
pin 9 (Step pin) to CLK+,
pin 8 (Dir pin) to CW+,
CLK- and CW- connect to GND arduino.
Do not connect EN+ and EN- to any ARDUINO PIN.

引脚9—— CLK+,
引脚8——CW +,
CLK——GND (Arduino)
CW -——GND (Arduino)
EN - 悬空,或者-——GND (Arduino)
EN + 悬空,或者-——GND (Arduino)【属于脱机控制引脚,高电平脱机,我的悲剧所在,低电频工作】

It only works for 1/8 step ( S3 and S4 on) and 1/16 step (S4 only on), half and full bridge does not work (for my case).
简单的讲,电机就是只能工作驱动器在1/8、1/16细分上(不是只有你,谁用你这个频率都这鸟样)

PS:理论计算,0.2ms就一个周期,一秒有5000个周期,一个周期1.8度(一般就这值),换言之这是要电机一秒转个25圈,尼玛哪个步进电机能转这么快?出问题不是明摆着的吗?

PS:实际,因为arduino运行速度问题,16M,实际脉冲也就1500-1600的样子,换言之,一秒8圈完全是不成立的,所以表现出过载堵转,电机啸叫



且看程序如下:
int Distance = 0; // Record the number of steps we've taken 

void setup() {

pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(8, LOW);
digitalWrite(9, LOW);

}

void loop() {

digitalWrite(9, HIGH);
delayMicroseconds(100);
digitalWrite(9, LOW);
delayMicroseconds(100);
Distance = Distance + 1; 
// record this step 
// Check to see if we are at the end of our move
// two rotation for 1/8 bridge and 1 rotation for 1/6 bridge (for this code)


if (Distance == 3200) { // We are! Reverse direction (invert DIR signal)
if (digitalRead(8) == LOW) {
digitalWrite(8, HIGH); 
}else {
digitalWrite(8, LOW);
} 
// Reset our distance back to zero since we're 
// starting a new move
Distance = 0; // Now pause for half a second delay(500);
}

}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-9 09:59:49 | 显示全部楼层
本帖最后由 hi55234 于 2015-2-9 10:23 编辑

程序部分2·············
既然原程序,出问题出在频率过快,电机跟不上,那么新的程序,自然是要找到合适的脉冲频率
然后拿出传说中的分贝计,开始愉快的寻找最低噪音的运行期间吧

工具:
1、i2C 1602
2、ACS712 5A看总功耗


PS:脉冲时间不在长,经测,就算5us也是足够让他转了

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x26,16,2);  // I2C 1602转接板的地址


int ACS712PinPin=0;//A0读取ACS712Pin 5A的电压的针脚
int ACS712PinVal=0;//A0读取ACS712Pin 5A的电压值(0-1023)
float ACS712PinValx=0;//A0读取ACS712Pin 5A的电压(换算为mV)
int mySensVals [4];//四次取均值,待平均的值暂存数组中
int jsq1=0;//四次取均值,取到第几次的计数器
int maichongjiange=5;//脉冲间隔

unsigned long time1=millis();


int maichongpinlv = 0;//脉冲频率
float lilunquanshu=0;//理论圈数

boolean fangxiang=1;

void setup(){
Serial.begin(9600);

  lcd.init();    
  lcd.backlight();
 
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);

digitalWrite(8, LOW);
digitalWrite(9, LOW);
}


void loop(){
 
 //电流读取部分
ACS712PinVal=analogRead(ACS712PinPin);
mySensVals [jsq1]=ACS712PinVal;
jsq1++;

if(jsq1==4){
 jsq1=0;
ACS712PinValx=(mySensVals [0]+mySensVals [1]+mySensVals [2]+mySensVals [3])*0.25;
ACS712PinValx=(ACS712PinValx*4.8-2433)*1000/185;
}


//每隔2秒,变化一次脉冲间隔,
 if (millis() - time1 > 2000){
time1=millis();

lcd.setCursor(0, 0);
lcd.print(ACS712PinValx);
lcd.print("mA ");

if(maichongjiange<3000)maichongjiange=maichongjiange+10;
else maichongjiange=5;
lcd.println(maichongjiange);//


lcd.setCursor(0, 1);
lcd.print(maichongpinlv);
lcd.print(" Hz ");//
lilunquanshu=maichongpinlv/200;
lcd.print("V:");//
lcd.print(lilunquanshu);//
lcd.println(" ");//

maichongpinlv=0;

//fangxiang=!fangxiang;
//digitalWrite(8, fangxiang);
  }
 


//步进电机控制信号
digitalWrite(9, HIGH);
delayMicroseconds(maichongjiange);
digitalWrite(9, LOW);
delayMicroseconds(1000);
maichongpinlv++;


}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-9 10:26:27 | 显示全部楼层
本帖最后由 hi55234 于 2015-2-11 20:41 编辑

结论:日本的42电机可以很安静,47db的噪音完全可以和环境噪音相媲美,简单的说就是拿到手上,几乎听不到声音~~~关键是频率要适当,哪怕是2相,不细分,也可以相当的安静

==============================
作案工具:

1423657521598.jpg

1423657571891.jpg

1423657438579.jpg


捕获1.PNG


捕获2.PNG


捕获3.PNG
==========================

测试程序

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x26,16,2);  // I2C 1602转接板的地址
 
 
int ACS712PinPin=0;//A0读取ACS712Pin 5A的电压的针脚
int ACS712PinVal=0;//A0读取ACS712Pin 5A的电压值(0-1023)
float ACS712PinValx=0;//A0读取ACS712Pin 5A的电压(换算为mV)
int mySensVals [4];//四次取均值,待平均的值暂存数组中
int jsq1=0;//四次取均值,取到第几次的计数器
int maichongjiange=1500;//脉冲间隔
long pps=0;
 
unsigned long time1=millis();
long quantime=0;
 
long maichongpinlv = 0;//脉冲频率
float lilunquanshu=0;//理论圈数
 
boolean fangxiang=1;
 
void setup(){
Serial.begin(9600);
 
  lcd.init();    
  lcd.backlight();
 
pinMode(7, OUTPUT);// EN+,脱机,高电平有效
pinMode(8, OUTPUT);// CW+,方向
pinMode(9, OUTPUT);// CLK+,频率(转速)
 
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
 
 
void loop(){
 
 //电流读取部分
ACS712PinVal=analogRead(ACS712PinPin);
mySensVals [jsq1]=ACS712PinVal;
jsq1++;
 
if(jsq1==4){
 jsq1=0;
ACS712PinValx=(mySensVals [0]+mySensVals [1]+mySensVals [2]+mySensVals [3])*0.25;
ACS712PinValx=(ACS712PinValx*4.8-2433)*1000/185;
}
 
 
//每隔2秒,变化一次脉冲间隔,
 //if (millis() - time1 > 3000){

 if (maichongpinlv== 20000){ //跑100圈,计时
         
quantime=millis() - time1;
         //digitalWrite(7, HIGH);

 
lcd.setCursor(0, 0);
lcd.print(ACS712PinValx);
lcd.print("mA pps:");
pps=250000/maichongjiange;
lcd.println(pps);//每秒脉冲数
 lcd.println("      ");//
 
 
lcd.setCursor(0, 1);
lcd.print(quantime);//多少毫秒转一圈
lcd.print("ms/r ");//
pps=maichongjiange*4;
lcd.print(pps);//一个脉冲周期的毫秒数
lcd.print("ms");
 lcd.println("      ");//

 maichongpinlv=0;
//fangxiang=!fangxiang;
//digitalWrite(8, fangxiang);
delay(5000);

//digitalWrite(7, LOW);
if(maichongjiange>750)maichongjiange=750;
else if(maichongjiange>375)maichongjiange=375;
else if(maichongjiange>250)maichongjiange=250;
else if(maichongjiange>188)maichongjiange=188;
else  digitalWrite(7, HIGH);//脱机,高电平有效

time1=millis();
  }
 
 
 
//步进电机控制信号


digitalWrite(9, HIGH);
delayMicroseconds(maichongjiange);
digitalWrite(9, LOW);
delayMicroseconds(maichongjiange);
delayMicroseconds(maichongjiange);
delayMicroseconds(maichongjiange);
                
maichongpinlv++;
 
 
}
回复 支持 反对

使用道具 举报

发表于 2015-2-9 11:18:39 | 显示全部楼层
干得漂亮。数据详实。。。。。

点评

谢强哥  发表于 2015-2-9 22:58
回复 支持 反对

使用道具 举报

发表于 2015-2-9 14:21:24 | 显示全部楼层
这贴实在太精彩了,文风风趣,且易懂,详实实用,绝对要顶!!!

点评

谢chqiyi  发表于 2015-2-9 22:58
回复 支持 反对

使用道具 举报

发表于 2015-2-9 22:26:06 | 显示全部楼层
也买了4个TB6560,两个57步进电机(二手)!步进电机的最大转速的确的纠结!频率太高就堵转或啸叫!当时是在MCH3上调的!曾经在百度上搜的有人说步进电机转速可以1000+,不知如何达到的!
回复 支持 反对

使用道具 举报

发表于 2015-2-9 22:28:53 | 显示全部楼层
hi55234 发表于 2015-2-9 10:26
结论:日本的42电机可以很安静,47db的噪音完全可以和环境噪音相媲美,简单的说就是拿到手上,几乎听不到声 ...

有試過調低工作電流對步進電機的影響嗎?

点评

1.2A 噪音53dB,0.8A噪音48dB,目测就是噪音降低,扭矩减小  发表于 2015-2-10 10:41
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-10 10:25:27 | 显示全部楼层
本帖最后由 hi55234 于 2015-2-15 11:39 编辑
haichaofine 发表于 2015-2-9 22:26
也买了4个TB6560,两个57步进电机(二手)!步进电机的最大转速的确的纠结!频率太高就堵转或啸叫!当时是在 ...


你的脉冲频率与步进电机的移动是同步的吗?
以1.8度的为例,只要2k hz就能达到600转每分,所以厂商给的42步进资料别说1000转,就是2500转也是可以的,至于目前圈数慢的问题,我认为还是失步太严重了,而归根到底应该控制频率有问题~~~


捕获7.PNG


捕获6.PNG

而我目前的数据:

捕获8.PNG


我认为,是输入驱动器的频率有问题~~~即一个控制信号过去,还没操作完成,第二个控制信号就过去了~~~
直接导致了失步~~~

=====================================================
int maichongjiange=8000;//脉冲间隔us
 
boolean bianhua=1;
boolean baochi=0;
 
int maichongjsq=0;
 
 
unsigned long time1=micros();
unsigned long time2=micros();
unsigned long time3=millis();
 
 
boolean fangxiang=1;
 
void setup(){
Serial.begin(9600);
 
 
pinMode(7, OUTPUT);// EN+,脱机,高电平有效
pinMode(8, OUTPUT);// CW+,方向
pinMode(9, OUTPUT);// CLK+,频率(转速)
 
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
 
 
void loop(){
 
 
 //步进电机控制脉冲
 if (micros()-time2 > maichongjiange){

        maichongjsq++;//每过一个“脉冲间隔”时间段,则“脉冲计数器”自增1
        maichongjsq=maichongjsq%4;//对“脉冲计数器”取模,这个取摸结果实质就是对占空比的调节(占空比为1/模),以4为例,则“脉冲计数器”的变化为:0——1——2——3——0

        if(maichongjsq==0)digitalWrite(9, HIGH);//输出控制步进电机的电平
        else digitalWrite(9, LOW);

     time2= micros();
 }
 
 
//步进电机加减速的控制,加减速的实质,就是缩短了控制信号的周期,每次增减 取模数的整数倍us,在此为4us
//“baochi”确保在该加减时才加减
 
 if(bianhua && baochi){
 
                                if(micros()-time1>300 && maichongjiange>100){//加速过程,xxx us加速一次,加速到 yyy为止
                maichongjiange--;
                time1=micros();
                }
 
  }else if(baochi){
 
                 if(micros()-time1>300 && maichongjiange<8000){
                 maichongjiange++;
                 time1=micros();
                }
 
 }
 
 
 //保持既定的速度
 if(maichongjiange==100 || maichongjiange==8000){
         baochi=0;//达到既定速度后锁死,不再进行加减速
 
          if(millis()-time3>3000){ //在目标速度运行一段时间后,再解锁,并减速
                         
                         bianhua=!bianhua;
             baochi=1;
             time3=millis();
          }
 
 }
 
 
 //关于反向,虽然直接对引脚进行控制也是可以的,但加入一个,减速——取反——加速的过程应该更好
 /*本例中,
pin7, EN+,脱机,高电平有效
pin8, CW+,方向
pin9, CLK+,频率(转速)
已经用掉了,假设加减速、方向都由外部控制,那么很显然,就会出现2种控制方式:
A、模拟方式,即通过测量2个点电阻变化所导致的分压变化,即可实现强弱、方向的调节,具体类似于ACS712的读取,此方式可以类似于“无级变速”
B、数字方式,即通过摇杆或4个微动开关,来分别实现加减速、方向的切换

就实际操作而言,速度上测电阻分压,方向上用微动开关比较合适,即用2个数字口+1个PWM口实现具体控制
 */
 
 
}


========================此处用easydriver代替TB6560
捕获.PNG

捕获2.PNG

捕获3.PNG
回复 支持 反对

使用道具 举报

发表于 2015-2-10 11:09:46 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系我们|极客工坊 ( 浙ICP备09023225号  

GMT+8, 2017-3-31 02:44 , Processed in 0.232385 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表