极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 32618|回复: 35

菜鸟玩步进电机 与 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圈完全是不成立的,所以表现出过载堵转,电机啸叫



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

  2. void setup() {

  3. pinMode(8, OUTPUT);
  4. pinMode(9, OUTPUT);
  5. digitalWrite(8, LOW);
  6. digitalWrite(9, LOW);

  7. }

  8. void loop() {

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


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

  27. }
复制代码
回复 支持 反对

使用道具 举报

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

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

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


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

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


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

  10. unsigned long time1=millis();


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

  13. boolean fangxiang=1;

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

  16.   lcd.init();   
  17.   lcd.backlight();

  18. pinMode(8, OUTPUT);
  19. pinMode(9, OUTPUT);

  20. digitalWrite(8, LOW);
  21. digitalWrite(9, LOW);
  22. }


  23. void loop(){

  24. //电流读取部分
  25. ACS712PinVal=analogRead(ACS712PinPin);
  26. mySensVals [jsq1]=ACS712PinVal;
  27. jsq1++;

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


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

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

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


  42. lcd.setCursor(0, 1);
  43. lcd.print(maichongpinlv);
  44. lcd.print(" Hz ");//
  45. lilunquanshu=maichongpinlv/200;
  46. lcd.print("V:");//
  47. lcd.print(lilunquanshu);//
  48. lcd.println(" ");//

  49. maichongpinlv=0;

  50. //fangxiang=!fangxiang;
  51. //digitalWrite(8, fangxiang);
  52.   }



  53. //步进电机控制信号
  54. digitalWrite(9, HIGH);
  55. delayMicroseconds(maichongjiange);
  56. digitalWrite(9, LOW);
  57. delayMicroseconds(1000);
  58. maichongpinlv++;


  59. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
==========================

测试程序

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


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

  11. unsigned long time1=millis();
  12. long quantime=0;

  13. long maichongpinlv = 0;//脉冲频率
  14. float lilunquanshu=0;//理论圈数

  15. boolean fangxiang=1;

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

  18.   lcd.init();   
  19.   lcd.backlight();

  20. pinMode(7, OUTPUT);// EN+,脱机,高电平有效
  21. pinMode(8, OUTPUT);// CW+,方向
  22. pinMode(9, OUTPUT);// CLK+,频率(转速)

  23. digitalWrite(7, LOW);
  24. digitalWrite(8, LOW);
  25. digitalWrite(9, LOW);
  26. }


  27. void loop(){

  28. //电流读取部分
  29. ACS712PinVal=analogRead(ACS712PinPin);
  30. mySensVals [jsq1]=ACS712PinVal;
  31. jsq1++;

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


  37. //每隔2秒,变化一次脉冲间隔,
  38. //if (millis() - time1 > 3000){

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


  43. lcd.setCursor(0, 0);
  44. lcd.print(ACS712PinValx);
  45. lcd.print("mA pps:");
  46. pps=250000/maichongjiange;
  47. lcd.println(pps);//每秒脉冲数
  48. lcd.println("      ");//


  49. lcd.setCursor(0, 1);
  50. lcd.print(quantime);//多少毫秒转一圈
  51. lcd.print("ms/r ");//
  52. pps=maichongjiange*4;
  53. lcd.print(pps);//一个脉冲周期的毫秒数
  54. lcd.print("ms");
  55. lcd.println("      ");//

  56. maichongpinlv=0;
  57. //fangxiang=!fangxiang;
  58. //digitalWrite(8, fangxiang);
  59. delay(5000);

  60. //digitalWrite(7, LOW);
  61. if(maichongjiange>750)maichongjiange=750;
  62. else if(maichongjiange>375)maichongjiange=375;
  63. else if(maichongjiange>250)maichongjiange=250;
  64. else if(maichongjiange>188)maichongjiange=188;
  65. else  digitalWrite(7, HIGH);//脱机,高电平有效

  66. time1=millis();
  67.   }



  68. //步进电机控制信号


  69. digitalWrite(9, HIGH);
  70. delayMicroseconds(maichongjiange);
  71. digitalWrite(9, LOW);
  72. delayMicroseconds(maichongjiange);
  73. delayMicroseconds(maichongjiange);
  74. delayMicroseconds(maichongjiange);
  75.                
  76. maichongpinlv++;


  77. }
复制代码
回复 支持 反对

使用道具 举报

发表于 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


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

=====================================================
  1. int maichongjiange=8000;//脉冲间隔us

  2. boolean bianhua=1;
  3. boolean baochi=0;

  4. int maichongjsq=0;


  5. unsigned long time1=micros();
  6. unsigned long time2=micros();
  7. unsigned long time3=millis();


  8. boolean fangxiang=1;

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


  11. pinMode(7, OUTPUT);// EN+,脱机,高电平有效
  12. pinMode(8, OUTPUT);// CW+,方向
  13. pinMode(9, OUTPUT);// CLK+,频率(转速)

  14. digitalWrite(7, LOW);
  15. digitalWrite(8, LOW);
  16. digitalWrite(9, LOW);
  17. }


  18. void loop(){


  19. //步进电机控制脉冲
  20. if (micros()-time2 > maichongjiange){

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

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

  25.      time2= micros();
  26. }


  27. //步进电机加减速的控制,加减速的实质,就是缩短了控制信号的周期,每次增减 取模数的整数倍us,在此为4us
  28. //“baochi”确保在该加减时才加减

  29. if(bianhua && baochi){

  30.                                 if(micros()-time1>300 && maichongjiange>100){//加速过程,xxx us加速一次,加速到 yyy为止
  31.                 maichongjiange--;
  32.                 time1=micros();
  33.                 }

  34.   }else if(baochi){

  35.                  if(micros()-time1>300 && maichongjiange<8000){
  36.                  maichongjiange++;
  37.                  time1=micros();
  38.                 }

  39. }


  40. //保持既定的速度
  41. if(maichongjiange==100 || maichongjiange==8000){
  42.          baochi=0;//达到既定速度后锁死,不再进行加减速

  43.           if(millis()-time3>3000){ //在目标速度运行一段时间后,再解锁,并减速
  44.                          
  45.                          bianhua=!bianhua;
  46.              baochi=1;
  47.              time3=millis();
  48.           }

  49. }


  50. //关于反向,虽然直接对引脚进行控制也是可以的,但加入一个,减速——取反——加速的过程应该更好
  51. /*本例中,
  52. pin7, EN+,脱机,高电平有效
  53. pin8, CW+,方向
  54. pin9, CLK+,频率(转速)
  55. 已经用掉了,假设加减速、方向都由外部控制,那么很显然,就会出现2种控制方式:
  56. A、模拟方式,即通过测量2个点电阻变化所导致的分压变化,即可实现强弱、方向的调节,具体类似于ACS712的读取,此方式可以类似于“无级变速”
  57. B、数字方式,即通过摇杆或4个微动开关,来分别实现加减速、方向的切换

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


  60. }
复制代码


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

捕获2.PNG

捕获3.PNG
回复 支持 反对

使用道具 举报

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

使用道具 举报

高级模式  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2017-12-12 16:11 , Processed in 0.051076 second(s), 8 queries , File On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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