极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 124518|回复: 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+,是穷)


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

通过上图可知,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小时,尼玛啊




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 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相,不细分,也可以相当的安静

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















==========================

测试程序

  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. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 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的噪音完全可以和环境噪音相媲美,简单的说就是拿到手上,几乎听不到声 ...

有試過調低工作電流對步進電機的影響嗎?
回复 支持 反对

使用道具 举报

 楼主| 发表于 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转也是可以的,至于目前圈数慢的问题,我认为还是失步太严重了,而归根到底应该控制频率有问题~~~







而我目前的数据:




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

=====================================================
  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




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2015-2-10 16:35:19 | 显示全部楼层
本帖最后由 hi55234 于 2015-2-10 17:54 编辑

PPS=Pulse Per Second 秒脉冲
7、电机的共振点:————整步共振(54—60r/min)
&#160;&#160;&#160;&#160;&#160; 步进电机均有固定的共振区域,二、四相感应子式步进电机的共振区一般在180-250pps之间(步距角1.8度)或在400pps左右(步距角为0.9度),电机驱动电压越高,电机电流越大,负载越轻,电机体积越小,则共振区向上偏移,反之亦然,为使电机输出电矩大,不失步和整个系统的噪音降低,一般工作点均应偏移共振区较多。


1、现象:电机低速时振动或失步,高速时正常:这是驱动电压过高引起。
2\电机低速时正常,高速时失步:这是驱动电压过低引起。
电机长时间低速运转无发热现象(电机正常工作时可高达70至80度)驱动电流过小时,
电机工作时过热:驱动电流过大的原因。

解决方法:调节驱动器电流、驱动电压或更换驱动器。

2、
现象:电机低速或高速时不转动或者失步;负载过大。
电机起动或停止时有失步或振动;电机出力过大。
解决方法:调节驱动器电流或更换电机。

1、脉冲信号的产生。
&#160;&#160;&#160;&#160;&#160; 脉冲信号一般由单片机或CPU产生,一般脉冲信号的占空比为0.3-0.4左右,电机转速越高,占空比则越大。

4、力矩与功率换算
&#160;&#160;&#160;&#160; 步进电机一般在较大范围内调速使用、其功率是变化的,一般只用力矩来衡量,力矩与功率换算如下:
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; P= Ω·M
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Ω=2π·n/60
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; P=2πnM/60
&#160;&#160;&#160; 其P为功率单位为瓦,Ω为每秒角速度,单位为弧度,n为每分钟转速,M为力矩单位为牛顿·米
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; P=2πfM/400(半步工作)
&#160;&#160;&#160;&#160; 其中f为每秒脉冲数(简称PPS)

(二)、应用中的注意点
&#160;&#160;&#160;&#160;&#160; 1、步进电机应用于低速场合---每分钟转速不超过1000转,(0.9度时6666PPS),最好在1000-3000PPS(0.9度)间使用,可通过减速装置使其在此间工作,此时电机工作效率高,噪音低。
&#160;&#160;&#160;&#160;&#160; 2、步进电机最好不使用整步状态,整步状态时振动大。

&#160; 5、电机在较高速或大惯量负载时,一般不在工作速度起动,而采用逐渐升频提速,一电机不失步,二可以减少噪音同时可以提高停止的定位精度。

7、电机不应在振动区内工作,如若必须可通过改变电压、电流或加一些阻尼的解决。
&#160;&#160;&#160;&#160;&#160; 8、电机在600PPS(0.9度)以下工作,应采用小电流、大电感、低电压来驱动。


回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-14 15:38:31 | 显示全部楼层
  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. long ACS712PinValx=0;//A0读取ACS712Pin 5A的电压(换算为mV)
  7. int mySensVals[10];//四次取均值,待平均的值暂存数组中
  8. int jsq1=0;//四次取均值,取到第几次的计数器
  9. int maichongjiange=100;//脉冲间隔
  10. long pps=0;

  11. int maichongjsq=0;

  12. int jsq3=0;

  13. unsigned long time1=millis();
  14. unsigned long time2=micros();
  15. unsigned long time3=millis();
  16. long quantime=0;

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

  19. boolean fangxiang=1;

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

  22.   lcd.init();   
  23.   lcd.backlight();

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

  27. digitalWrite(7, LOW);
  28. digitalWrite(8, LOW);
  29. digitalWrite(9, LOW);
  30. }


  31. void loop(){

  32.   //电流读取部分
  33. ACS712PinVal=analogRead(ACS712PinPin);
  34. mySensVals[jsq1]=ACS712PinVal;
  35. jsq1++;


  36. if(jsq1==10){
  37. jsq1=0;
  38. time1=millis()-time1;
  39. ACS712PinValx=(mySensVals[0]+mySensVals[1]+mySensVals[2]+mySensVals[3]+mySensVals[4]+mySensVals[5]+mySensVals[6]+mySensVals[7]+mySensVals[8]+mySensVals[9])*0.1;
  40. ACS712PinValx=(ACS712PinValx-455)*4.69*1000/185;

  41.   Serial.println(ACS712PinValx);//-1234

  42. /*
  43. 1、497是acs712在不通电时的所取到的模拟值,每个值代表(vcc-GND)/1023 mv
  44. 2、4.69=(vcc-GND)/1023,因为实测只有4.88v的样子
  45. 3、acs712 5A ,是每185mv/A,所以每mv表示1000/185 mA
  46. */
  47.          //digitalWrite(7, HIGH);

  48.   }
  49.   

  50. /*  步进电机控制信号
  51. High-----------| Low-----------|  Low-----------|  Low-----------|
  52. maichongjiange | maichongjiange| maichongjiange | maichongjiange |

  53. */

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


  58. if(maichongjsq==0)digitalWrite(9, HIGH);
  59. else digitalWrite(9, LOW);

  60.   
  61.         time2= micros();
  62. }




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

使用道具 举报

 楼主| 发表于 2015-2-14 17:35:11 | 显示全部楼层
本帖最后由 hi55234 于 2015-2-14 17:37 编辑

慢速——保持3s——平滑加速——快速——保持3s  循环

PS:i2c 1602 打印速度慢,延迟会导致电机转速慢,且不顺畅(破坏了脉冲频率)


  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. if (micros()-time2 > maichongjiange){
  20.          
  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.   
  26.         time2= micros();
  27. }





  28. if(bianhua && baochi){
  29.          
  30.                 if(micros()-time1>300 && maichongjiange>100){
  31.                 maichongjiange--;
  32.                 time1=micros();
  33.                 }

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

  40. }


  41. if(maichongjiange==100 || maichongjiange==8000){
  42.          bianhua=!bianhua;
  43.          baochi=0;

  44. if(millis()-time3>3000){
  45.          
  46. baochi=1;
  47. time3=millis();
  48. }

  49. }




  50. }

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-16 15:36:26 | 显示全部楼层
本帖最后由 hi55234 于 2015-2-17 16:00 编辑

针对9楼的接法,一个可变电阻+2个微动的程序




  1. //电机的高电平持续时间 us
  2. int maichongjiangeMax=8000;
  3. int maichongjiangeMin=100;
  4. long maichongjiangeSet;

  5. //电机的高电平持续时间的初始值 8000us
  6. int maichongjiange=8000;

  7. //脉冲的占空比为1/maichongzhankongbi
  8. int maichongzhankongbi=4;

  9. //加减速时速度每隔300us变化一次
  10. int jiajiansubianhuashijian=300;


  11. ////////////////////////////////////////////

  12. int Pinval;//存储IO口(Pin5、Pin6)高低电平的值

  13. boolean fangxiang=0;//电机转动方向标识
  14. int maichongjsq=0;//脉冲计数器


  15. unsigned long time1=micros();
  16. unsigned long time2=micros();


  17. void setup(){

  18. Serial.begin(9600);

  19. //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向) 输入状态,就读取值来确定电机的转动方向
  20. pinMode(5, INPUT);  
  21. pinMode(6, INPUT);  

  22. /*
  23. 暂定A0 analogRead(0)的值来确定转速
  24. 为方便演示,此处为使用1K 多圈精密可调电阻,A0就接在中间脚上
  25. 那么可见,其电压大致为0-5v之间,现在就电压区间进行分级
  26. 如果粗分为10档,就意味着每100个返回单位对应10%的速度
  27. */

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

  31. digitalWrite(7, LOW);//电机默认联机
  32. digitalWrite(8, LOW);//
  33. digitalWrite(9, LOW);
  34. }


  35. void loop(){




  36. //转速调节,通过可变电阻实现无极调速
  37.   
  38.   //可能是读取过于频繁,导致夹杂着无效数值,所以此处做个循环
  39.   do
  40.   {
  41. maichongjiangeSet = analogRead(0);//0-1023
  42. }while(maichongjiangeSet >1024);
  43.   
  44.   maichongjiangeSet = maichongjiangeSet*(maichongjiangeMax-maichongjiangeMin)/1024+maichongjiangeMin;//0-1023


  45. //加速过程
  46. while(maichongjiange>maichongjiangeSet){
  47.   jiasu();
  48.   maichongqudong();
  49.   }

  50.   //加减过程
  51. while(maichongjiange<maichongjiangeSet){
  52.   jiansu();
  53.   maichongqudong();
  54.   }

  55. //在脉冲频率无变化的时候驱动电机正常运行
  56. maichongqudong();


  57. fangxiangchange(); //转动方向的切换


  58. }






  59. void jiasu() //脉冲加速过程
  60. {

  61. if(micros()-time1>jiajiansubianhuashijian && maichongjiange>maichongjiangeMin){//加速过程,xxx us加速一次,加速到 yyy为止
  62. maichongjiange--;
  63. time1=micros();
  64. }

  65. }

  66. void jiansu()//脉冲减速过程
  67. {

  68. if(micros()-time1>jiajiansubianhuashijian && maichongjiange<maichongjiangeMax){
  69. maichongjiange++;
  70. time1=micros();
  71. }

  72. }


  73. void maichongqudong()//脉冲驱动
  74. {



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

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

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

  81.      time2= micros();
  82. }

  83. }


  84. void fangxiangchange() //转动方向的切换
  85. {



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

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

  96. Pinval = digitalRead(5);  //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向)

  97. if(Pinval==1 && fangxiang){ //有效高电平且现在电机转速与设置相反

  98. //1、把速度降到最低
  99. while(maichongjiange<maichongjiangeMax){
  100. jiansu();
  101. maichongqudong();
  102.     }
  103. //2、反方向
  104. digitalWrite(8, LOW);
  105. //3、记录新的方向
  106. fangxiang=0;
  107. //4、在把速度加到原来值
  108. while(maichongjiange<maichongjiangeSet){
  109. jiasu();
  110. maichongqudong();
  111.     }

  112. }

  113. Pinval = digitalRead(6);  //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向)

  114. if(Pinval==1 && !fangxiang){ //有效高电平且现在电机转速与设置相反

  115. //1、把速度降到最低
  116. while(maichongjiange<maichongjiangeMax){
  117. jiansu();
  118. maichongqudong();
  119.     }
  120. //2、反方向
  121. digitalWrite(8, HIGH);
  122. //3、记录新的方向
  123. fangxiang=1;
  124. //4、在把速度加到原来值
  125. while(maichongjiange<maichongjiangeSet){
  126. jiasu();
  127. maichongqudong();
  128.     }

  129. }




  130. }



复制代码




  maichongjiangeSet = maichongjiangeSet*(maichongjiangeMax-maichongjiangeMin)/1024+maichongjiangeMin
转速=1000000*1.8/maichongjiangeSet


在说一下这个程序的特色,即分压阻值与转速是幂函数,即转速=1/(a*R+b),

类似于下图:X轴是阻值,Y轴是转速



简单来说,就是虽然阻值的变化是线性的,但速度的增加却是指数型的
具体来说就是,开始的时候,速度变化很快,而后变化越发的不明显
这个对手动调节来说,恐怕不是很舒服,所以解决方式为:
1、对阻值与速度进行手工映射
2、修改速度与阻值的对应关系



  1. //电机的高电平持续时间 us
  2. int maichongjiangeMax=3584;
  3. int maichongjiangeMin=207;
  4. long maichongjiangeSet;

  5. //电机的高电平持续时间的初始值 8000us
  6. int maichongjiange=8000;

  7. //脉冲的占空比为1/maichongzhankongbi
  8. int maichongzhankongbi=4;

  9. //加减速时速度每隔300us变化一次
  10. int jiajiansubianhuashijian=100;


  11. ////////////////////////////////////////////

  12. int Pinval;//存储IO口(Pin5、Pin6)高低电平的值

  13. boolean fangxiang=0;//电机转动方向标识
  14. int maichongjsq=0;//脉冲计数器


  15. unsigned long time1=micros();
  16. unsigned long time2=micros();


  17. void setup(){

  18. Serial.begin(9600);

  19. //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向) 输入状态,就读取值来确定电机的转动方向
  20. pinMode(5, INPUT);  
  21. pinMode(6, INPUT);  

  22. /*
  23. 暂定A0 analogRead(0)的值来确定转速
  24. 为方便演示,此处为使用1K 多圈精密可调电阻,A0就接在中间脚上
  25. 那么可见,其电压大致为0-5v之间,现在就电压区间进行分级
  26. 如果粗分为10档,就意味着每100个返回单位对应10%的速度
  27. */

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

  31. digitalWrite(7, LOW);//电机默认联机
  32. digitalWrite(8, LOW);//
  33. digitalWrite(9, LOW);
  34. }


  35. void loop(){




  36. //转速调节,通过可变电阻实现无极调速
  37.   
  38.   //可能是读取过于频繁,导致夹杂着无效数值,所以此处做个循环
  39.   do
  40.   {
  41. maichongjiangeSet = analogRead(0);//0-1023
  42. }while(maichongjiangeSet >1024);
  43.   
  44. //被注释掉的,其起转速随测试点的电压降低而成指数增加,简单的说就是不好控制,开始太慢,之后激增
  45. // maichongjiangeSet = maichongjiangeSet*(maichongjiangeMax-maichongjiangeMin)/1024+maichongjiangeMin;//0-1023
  46. //映射表 28段
  47. /*
  48. 1/2细分                                                        对应分压
  49. R/min        步/s        us/步 占空比25%        序号        1024
  50. 180         1200         833         208         1        922
  51. 162         1080         926         231         2        829
  52. 146         972         1029         257         3        746
  53. 131         875         1143         286         4        672
  54. 118         787         1270         318         5        605
  55. 106         709         1411         353         6        544
  56. 96                 638         1568         392         7        490
  57. 86                 574         1742         436         8        441
  58. 77                 517         1936         484         9        397
  59. 70                 465         2151         538         10        357
  60. 63                 418         2390         597         11        321
  61. 56                 377         2656         664         12        289
  62. 51                 339         2951         738         13        260
  63. 46                 305         3278         820         14        234
  64. 41                 275         3643         911         15        211
  65. 37                 247         4047         1012         16        190
  66. 33                 222         4497         1124         17        171
  67. 30                 200         4997         1249         18        154
  68. 27                 180         5552         1388         19        138
  69. 24                 162         6169         1542         20        124
  70. 22                 146         6854         1714         21        112
  71. 20                 131         7616         1904         22        101
  72. 18                 118         8462         2116         23        91
  73. 16                 106         9402         2351         24        82
  74. 14                 96                 10447         2612         25        74
  75. 13                 86                 11608         2902         26        66
  76. 12                 78                 12898         3224         27        60
  77. 10                 70                 14331         3583         28        54

  78. */
  79. if(maichongjiangeSet>922)maichongjiangeSet=208;
  80. else if(maichongjiangeSet>829)maichongjiangeSet=231;
  81. else if(maichongjiangeSet>746)maichongjiangeSet=257;
  82. else if(maichongjiangeSet>672)maichongjiangeSet=282;
  83. else if(maichongjiangeSet>605)maichongjiangeSet=318;
  84. else if(maichongjiangeSet>544)maichongjiangeSet=353;
  85. else if(maichongjiangeSet>490)maichongjiangeSet=392;
  86. else if(maichongjiangeSet>441)maichongjiangeSet=436;
  87.   else if(maichongjiangeSet>397)maichongjiangeSet=484;
  88.   else if(maichongjiangeSet>357)maichongjiangeSet=538;
  89.   else if(maichongjiangeSet>321)maichongjiangeSet=597;
  90.   else if(maichongjiangeSet>289)maichongjiangeSet=664;
  91.   else if(maichongjiangeSet>260)maichongjiangeSet=738;
  92.   else if(maichongjiangeSet>234)maichongjiangeSet=820;
  93.    else if(maichongjiangeSet>211)maichongjiangeSet=911;
  94.    else if(maichongjiangeSet>190)maichongjiangeSet=1012;
  95.     else if(maichongjiangeSet>171)maichongjiangeSet=1124;
  96.         else if(maichongjiangeSet>154)maichongjiangeSet=1249;
  97.         else if(maichongjiangeSet>138)maichongjiangeSet=1388;
  98.         else if(maichongjiangeSet>124)maichongjiangeSet=1542;
  99.         else if(maichongjiangeSet>112)maichongjiangeSet=1714;
  100.         else if(maichongjiangeSet>101)maichongjiangeSet=1904;
  101.         else if(maichongjiangeSet>91)maichongjiangeSet=2116;
  102.         else if(maichongjiangeSet>82)maichongjiangeSet=2351;
  103.         else if(maichongjiangeSet>74)maichongjiangeSet=2612;
  104.         else if(maichongjiangeSet>66)maichongjiangeSet=2902;
  105.         else if(maichongjiangeSet>60)maichongjiangeSet=3224;
  106.         else maichongjiangeSet=3583;
  107. //min







  108. //加速过程
  109. while(maichongjiange>maichongjiangeSet){
  110.   jiasu();
  111.   maichongqudong();
  112.   }

  113.   //加减过程
  114. while(maichongjiange<maichongjiangeSet){
  115.   jiansu();
  116.   maichongqudong();
  117.   }

  118. //在脉冲频率无变化的时候驱动电机正常运行
  119. maichongqudong();


  120. fangxiangchange(); //转动方向的切换


  121. }






  122. void jiasu() //脉冲加速过程
  123. {

  124. if(micros()-time1>jiajiansubianhuashijian && maichongjiange>maichongjiangeMin){//加速过程,xxx us加速一次,加速到 yyy为止
  125. maichongjiange--;
  126. time1=micros();
  127. }

  128. }

  129. void jiansu()//脉冲减速过程
  130. {

  131. if(micros()-time1>jiajiansubianhuashijian && maichongjiange<maichongjiangeMax){
  132. maichongjiange++;
  133. time1=micros();
  134. }

  135. }


  136. void maichongqudong()//脉冲驱动
  137. {



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

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

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

  144.      time2= micros();
  145. }

  146. }


  147. void fangxiangchange() //转动方向的切换
  148. {



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

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

  159. Pinval = digitalRead(5);  //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向)

  160. if(Pinval==1 && fangxiang){ //有效高电平且现在电机转速与设置相反

  161. //1、把速度降到最低
  162. while(maichongjiange<maichongjiangeMax){
  163. jiansu();
  164. maichongqudong();
  165.     }
  166. //2、反方向
  167. digitalWrite(8, LOW);
  168. //3、记录新的方向
  169. fangxiang=0;
  170. //4、在把速度加到原来值
  171. while(maichongjiange<maichongjiangeSet){
  172. jiasu();
  173. maichongqudong();
  174.     }

  175. }

  176. Pinval = digitalRead(6);  //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向)

  177. if(Pinval==1 && !fangxiang){ //有效高电平且现在电机转速与设置相反

  178. //1、把速度降到最低
  179. while(maichongjiange<maichongjiangeMax){
  180. jiansu();
  181. maichongqudong();
  182.     }
  183. //2、反方向
  184. digitalWrite(8, HIGH);
  185. //3、记录新的方向
  186. fangxiang=1;
  187. //4、在把速度加到原来值
  188. while(maichongjiange<maichongjiangeSet){
  189. jiasu();
  190. maichongqudong();
  191.     }

  192. }




  193. }



复制代码



但映射版也有问题:
1、就实际感知而言,初期确实有点慢,人的感官也远不数字精确,依旧觉得前期慢,后期快
2、多圈的精密电阻,却是太难调节了

所以,具体的映射恐怕还要修改

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-18 12:45:14 | 显示全部楼层
尼玛只要把电阻分压对应到圈/每秒上,就能实现感官上的无极调速
我TM前面的程序怎么写成对应周期长度了

  1. //电机的高电平持续时间 us
  2. int maichongjiangeMax=1260;
  3. int maichongjiangeMin=120;
  4. long maichongjiangeSet;

  5. //电机的高电平持续时间的初始值 0us
  6. int maichongjiange=0;

  7. //脉冲的占空比为1/maichongzhankongbi
  8. int maichongzhankongbi=4;

  9. //加减速时速度每隔300us变化一次
  10. int jiajiansubianhuashijian=300;


  11. ////////////////////////////////////////////

  12. int Pinval;//存储IO口(Pin5、Pin6)高低电平的值

  13. boolean fangxiang=0;//电机转动方向标识
  14. int maichongjsq=0;//脉冲计数器


  15. unsigned long time1=micros();
  16. unsigned long time2=micros();


  17. void setup(){

  18. Serial.begin(9600);

  19. //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向) 输入状态,就读取值来确定电机的转动方向
  20. pinMode(5, INPUT);
  21. pinMode(6, INPUT);

  22. /*
  23. 暂定A0 analogRead(0)的值来确定转速
  24. 为方便演示,此处为使用1K 多圈精密可调电阻,A0就接在中间脚上
  25. 那么可见,其电压大致为0-5v之间,现在就电压区间进行分级
  26. 如果粗分为10档,就意味着每100个返回单位对应10%的速度
  27. */

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

  31. digitalWrite(7, LOW);//电机默认联机
  32. digitalWrite(8, LOW);//
  33. digitalWrite(9, LOW);
  34. }


  35. void loop(){




  36. //转速调节,通过可变电阻实现无极调速

  37. //可能是读取过于频繁,导致夹杂着无效数值,所以此处做个循环
  38. do
  39. {
  40. maichongjiangeSet = analogRead(0);//0-1023
  41. }while(maichongjiangeSet >1024);

  42. // 25% us =1000,000/(圈/每秒*400*4)=625/(0.5【min】+4.5×analogRead(0)/1024)
  43. //即把电压线性到转速上
  44. maichongjiangeSet = 625/(0.5+4.5*maichongjiangeSet/1024);//0-1023


  45. //加速过程
  46. while(maichongjiange>maichongjiangeSet){
  47. jiasu();
  48. maichongqudong();
  49. }

  50. //加减过程
  51. while(maichongjiange<maichongjiangeSet){
  52. jiansu();
  53. maichongqudong();
  54. }

  55. //在脉冲频率无变化的时候驱动电机正常运行
  56. maichongqudong();


  57. fangxiangchange(); //转动方向的切换


  58. }






  59. void jiasu() //脉冲加速过程
  60. {

  61. if(micros()-time1>jiajiansubianhuashijian && maichongjiange>maichongjiangeMin){//加速过程,xxx us加速一次,加速到 yyy为止
  62. maichongjiange--;
  63. time1=micros();
  64. }

  65. }

  66. void jiansu()//脉冲减速过程
  67. {

  68. if(micros()-time1>jiajiansubianhuashijian && maichongjiange<maichongjiangeMax){
  69. maichongjiange++;
  70. time1=micros();
  71. }

  72. }


  73. void maichongqudong()//脉冲驱动
  74. {



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

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

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

  81. time2= micros();
  82. }

  83. }


  84. void fangxiangchange() //转动方向的切换
  85. {



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

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

  96. Pinval = digitalRead(5); //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向)

  97. if(Pinval==1 && fangxiang){ //有效高电平且现在电机转速与设置相反

  98. //1、把速度降到最低
  99. while(maichongjiange<maichongjiangeMax){
  100. jiansu();
  101. maichongqudong();
  102. }
  103. //2、反方向
  104. digitalWrite(8, LOW);
  105. //3、记录新的方向
  106. fangxiang=0;
  107. //4、在把速度加到原来值
  108. while(maichongjiange<maichongjiangeSet){
  109. jiasu();
  110. maichongqudong();
  111. }

  112. }

  113. Pinval = digitalRead(6); //pin5(High pin8 输出 LOW 默认)、pin6(High pin8 输出 High 方向)

  114. if(Pinval==1 && !fangxiang){ //有效高电平且现在电机转速与设置相反

  115. //1、把速度降到最低
  116. while(maichongjiange<maichongjiangeMax){
  117. jiansu();
  118. maichongqudong();
  119. }
  120. //2、反方向
  121. digitalWrite(8, HIGH);
  122. //3、记录新的方向
  123. fangxiang=1;
  124. //4、在把速度加到原来值
  125. while(maichongjiange<maichongjiangeSet){
  126. jiasu();
  127. maichongqudong();
  128. }

  129. }




  130. }


复制代码


25% 周期长度us——步进电机的分贝数

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-18 11:09 , Processed in 0.049200 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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