狗趴(GodPub),开源硬件学习与实践

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
12
返回列表 发新帖
打印 上一主题 下一主题

蛋疼的机翻 AccelStepper Class Reference 【步进电机库】

[复制链接]

5

主题

36

帖子

141

积分

QQ群用户

积分
141
10#
 楼主| 发表于 2015-2-17 23:27:14 | 只看该作者
本帖最后由 囧囧-科技大神粉 于 2015-2-17 23:34 编辑
囧囧-科技大神粉 发表于 2015-2-16 15:38
maichongjiangeSet = maichongjiangeSet*(maichongjiangeMax-maichongjiangeMin)/1024+maichongjiang ...


尼玛只要把电阻分压对应到圈/每秒上,就能实现感官上的无极调速
我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——步进电机的分贝数



5

主题

36

帖子

141

积分

QQ群用户

积分
141
9#
 楼主| 发表于 2015-2-16 16:47:10 | 只看该作者
本帖最后由 囧囧-科技大神粉 于 2015-2-16 17:04 编辑

现在,如果用摇杆代替微动按钮与电位器
则所需端口由2个数字口加一个模拟口,变成了2个模拟口

而程序的相应变化则在于


a,速度调节方式,若源用原程序不变,则会导致

1,速度一开始就是中位数,初始速度是否过快
2,一旦放手,则在自回复的情况下,速度又会回到原速


b,转动方向上,必须分段以应对,即电压低于某区间
则为方向1,高于某电压则为方向2,一次解决摇杆
初始状态不在中间的问题
,,,,,,,,分割线,,,,,,,,,

具体做法,现定义a0接y轴控制速度,a1接x轴控制

方向


//a0

maichongjiangeSet = analogRead(0)*(maichongjiangeMax-maichongjiangeMin)/1000+maichongjiangeMin;//0-1023


//a1  大致思想就这样,当然还缺乏平滑处理
int  pinval2=analogRead(1);
if(pinval2>700)fangxiang=0;
else  if(pinval2<300)fangxiang=1;



5

主题

36

帖子

141

积分

QQ群用户

积分
141
8#
 楼主| 发表于 2015-2-16 15:38:20 | 只看该作者
本帖最后由 囧囧-科技大神粉 于 2015-2-17 18:03 编辑
囧囧-科技大神粉 发表于 2015-2-14 23:36
囧囧-科技大神粉========================此处用easydriver代替TB6560


  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、多圈的精密电阻,却是太难调节了

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

5

主题

36

帖子

141

积分

QQ群用户

积分
141
7#
 楼主| 发表于 2015-2-14 23:36:28 | 只看该作者
本帖最后由 囧囧-科技大神粉 于 2015-2-15 11:43 编辑
  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






5

主题

36

帖子

141

积分

QQ群用户

积分
141
6#
 楼主| 发表于 2015-2-14 18:14:27 | 只看该作者
慢速——保持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.         maichongjsq++;//每过一个“脉冲间隔”时间段,则“脉冲计数器”自增1
  21.         maichongjsq=maichongjsq%4;//对“脉冲计数器”取模,这个取摸结果实质就是对占空比的调节(占空比为1/模),以4为例,则“脉冲计数器”的变化为:0——1——2——3——0


  22. if(maichongjsq==0)digitalWrite(9, HIGH);
  23. else digitalWrite(9, LOW);


  24.          time2= micros();
  25. }





  26. if(bianhua && baochi){

  27.                 if(micros()-time1>300 && maichongjiange>100){
  28.                 maichongjiange--;
  29.                 time1=micros();
  30.                 }

  31.   }else if(baochi){

  32.                  if(micros()-time1>300 && maichongjiange<8000){
  33.   maichongjiange++;
  34.   time1=micros();
  35.         }

  36. }


  37. if(maichongjiange==100 || maichongjiange==8000){
  38.          bianhua=!bianhua;
  39.          baochi=0;

  40. if(millis()-time3>3000){

  41. baochi=1;
  42. time3=millis();
  43. }

  44. }




  45. }
复制代码


5

主题

36

帖子

141

积分

QQ群用户

积分
141
5#
 楼主| 发表于 2015-2-13 21:40:43 | 只看该作者
卓泰科技 发表于 2015-2-13 20:33
翻译的还不错,基本可以看懂。

第一个我翻译完后,发现没具体例子,根本就不会用,悲剧啊!~~~

5

主题

36

帖子

141

积分

QQ群用户

积分
141
地板
 楼主| 发表于 2015-2-13 21:39:33 | 只看该作者
  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. long quantime=0;

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

  12. /////////////////////////////////////

  13. #include <AccelStepper.h>

  14. AccelStepper Xaxis(1, 9, 8); // pin 9 = step, pin 8 = direction
  15. int pps=200;
  16. unsigned long time1=millis();

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

  19.   lcd.init();   
  20.   lcd.backlight();
  21.   //////////////////////////////////////
  22.   Xaxis.setMaxSpeed(2200);
  23.   Xaxis.setSpeed(pps);

  24. }

  25. void loop() {  
  26.    //电流读取部分
  27. ACS712PinVal=analogRead(ACS712PinPin);
  28. mySensVals [jsq1]=ACS712PinVal;
  29. jsq1++;

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

  37.    if (millis() - time1 > 1000 && pps<2000){


  38. lcd.setCursor(0, 0);
  39. lcd.print(ACS712PinValx);
  40. lcd.print("mA p:");
  41. lcd.println(pps);//每秒脉冲数
  42. lcd.println("      ");//
  43.      ////////////////////////
  44.      pps=pps+30;
  45.      Xaxis.setSpeed(pps);
  46.      time1=millis();
  47.    }
  48. }
复制代码


1、恒定速度的切换,另外,ACS712 可以在没接通电机前测试一下精度,185mV/A,精度大概是1/37 A,约正负27ma的样子

84

主题

143

帖子

725

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
725
QQ
板凳
发表于 2015-2-13 20:33:24 | 只看该作者
翻译的还不错,基本可以看懂。
天理路上甚宽,稍游心,胸中便觉广大宏朗;
人欲路上甚窄,才寄迹,眼前俱是荆棘泥涂。

5

主题

36

帖子

141

积分

QQ群用户

积分
141
沙发
 楼主| 发表于 2015-2-13 20:23:41 | 只看该作者
Basic Usage

You can create multiple AccelStepper objects, giving a unique name to each motor. AccelStepper can manage any number of motors, as long as you repetitively call their "run" functions.

您可以创建多个AccelStepper对象,每个电机提供一个唯一的名称。 AccelStepper可以管理任何数量的电动机,只要你反复地叫他们“跑”的功能。
Defining & Configuring Motors

定义和配置电动机

AccelStepper mystepper(1, pinStep, pinDirection);
A stepper motor controlled by a dedicated driver board.
由专门的驱动板控制的步进电机。

AccelStepper mystepper(2, pinA, pinB);
A bipolar stepper motor controlled by an H-Bridge circuit.
由H桥circuit.n控制的双极步进电机。

AccelStepper mystepper(4, pinA1, pinA2, pinB1, pinB2);
A unipolar stepper motor, controlled by 4 transistors.
单极步进电机,由4个晶体管控制。

mystepper.setMaxSpeed(stepsPerSecond);
Sets the maximum speed. The default is very slow, so this must be configured. When controlled by setting position, the stepper will accelerate to move at this maximum speed, and decelerate as it reaches the destination.
设置的最大速度。缺省值是很慢的,因此必须进行配置。当通过设定位置控制时,步进将加快移动至在该最大速度,减速,因为它到达目的地。

mystepper.setAcceleration(stepsPerSecondSquared);
Sets the acceleration to be used, in steps per second per second.
设置要使用的加速,在每秒每第二步骤。

========================================================
Position Based Control
基于位置控制

mystepper.moveTo(targetPosition);
Move the motor to a new absolute position. This returns immediately. Actual movement is caused by the run() function.
移动电机到一个新的绝对位置。这立即返回。实际运动由run()函数引起的。


mystepper.move(distance);
Move the motor (either positive or negative) relative to its current position. This returns immediately. Actual movement is caused by the run() function.
动马达(或正或负)相对于它的当前位置。这立即返回。实际运动由run()函数引起的。


mystepper.currentPosition();
Read the motor's current absolution position.
读取电机的绝对位置。


mystepper.distanceToGo();
Read the distance the motor is from its destination position. This can be used to check if the motor has reached its final position.
读取距离电机从目标位置。可如果电机已到达其最终位置用来检查。


mystepper.run();
Update the motor. This must be called repetitively to make the motor move.
更新电机。这必须调用反复,使电机的举动。


mystepper.runToPosition();
Update the motor, and wait for it to reach its destination. This function does not return until the motor is stopped, so it is only useful if no other motors are moving.
更新电机,并等待它到达目的地。此函数不返回,直到电机停止,所以它是只有在没有其他电机正在有用。

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

Speed Based Control
基于速度控制

mystepper.setSpeed(stepsPerSecond);
Set the speed, in steps per second. This function returns immediately. Actual motion is caused by called runSpeed().
设定速度,以每秒的步骤。该函数立即返回。实际运动是由称为runSpeed()。

mystepper.runSpeed();
Update the motor. This must be called repetitively to make the motor move.
更新电机。这必须调用反复,使电机的举动。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|狗趴(GodPub) Arduino&Raspberry Pi开源硬件学习与实践[QQ群:20085629]  

GMT+8, 2024-7-1 21:31 , Processed in 0.064907 second(s), 31 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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