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

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

2015-2-9 09:36 上传
(57.11 KB)





问:LZ你丫倒是好,有文档知道哪组是哪组,我这没文档的怎么破?

答:

图像 (1).jpg

2015-2-9 09:44 上传
(102.22 KB)



通过上图可知,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

2015-2-9 09:56 上传
(79.25 KB)


捕获2.PNG

2015-2-9 09:56 上传
(93.55 KB)


捕获3.PNG

2015-2-9 09:56 上传
(92.23 KB)


捕获4.PNG

2015-2-9 09:56 上传
(236.43 KB)


捕获5.PNG

程序部分····················
先看一个失败的程序,原帖地址是
http://www.instructables.com/id/ARDUINO-UNO-TB6560-Stepper-motor-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圈完全是不成立的,所以表现出过载堵转,电机啸叫

且看程序如下:
ARDUINO 代码复制打印

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);
}
 
}

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

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

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

ARDUINO 代码复制打印

#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++;
 
 
}

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

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

1423657521598.jpg

1423657571891.jpg

1423657438579.jpg

捕获1.PNG

捕获2.PNG

捕获3.PNG

测试程序

ARDUINO 代码复制打印

#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++;
 
 
}


via - 极客工坊

标签: Arduino教程