菜鸟玩步进电机 与 TB6560 驱动频率的测试 作者: ncnynl 时间: March 18, 2016 分类: Arduino教程 想法: 我要评论,建议,讨论 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+,是穷) 2015-2-9 09:36 上传 (57.11 KB) 问:LZ你丫倒是好,有文档知道哪组是哪组,我这没文档的怎么破? 答: 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小时,尼玛啊 2015-2-9 09:56 上传 (79.25 KB) 2015-2-9 09:56 上传 (93.55 KB) 2015-2-9 09:56 上传 (92.23 KB) 2015-2-9 09:56 上传 (236.43 KB) 程序部分···················· 先看一个失败的程序,原帖地址是 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相,不细分,也可以相当的安静 ============================== 作案工具: 测试程序 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教程