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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

36

帖子

141

积分

QQ群用户

积分
141
11#
 楼主| 发表于 2015-2-18 12:54:23 | 只看该作者
为了控制的迁移,串口控制是必须的:

当然,还是有待完善的地方,那就是对于串口字符串的检验




  1. /*
  2. djc3 无极调速 + 串口控制
  3. 规定Pin4口为一个判断点,
  4. 低电平则为串口控制,高电平为按键控制


  5. */


  6. //电机的高电平持续时间 us
  7. int maichongjiangeMax=1260;
  8. int maichongjiangeMin=120;
  9. long maichongjiangeSet;

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

  12. //脉冲的占空比为1/maichongzhankongbi
  13. int maichongzhankongbi=4;

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


  16. ////////////////////////////////////////////
  17. int kongzhifangshi;//控制方式,低电平则为串口控制,高电平为按键控制
  18. int jsq1=0;
  19. char kongzhimingling[4];
  20. boolean testxinxi=0;

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

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


  24. unsigned long time1=micros();
  25. unsigned long time2=micros();


  26. void setup(){

  27. Serial.begin(9600);

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

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

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

  40. digitalWrite(7, LOW);//电机默认联机
  41. digitalWrite(8, LOW);//
  42. digitalWrite(9, LOW);
  43. }


  44. void loop(){

  45. kongzhifangshi = digitalRead(4);

  46. if(kongzhifangshi==1){

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

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

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

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

  57. }else{


  58.           while (Serial.available() > 0) {

  59.                   //格式:方向(1位),速度百分比(2位) 如012
  60.         kongzhimingling[jsq1]= Serial.read();


  61. delayMicroseconds(1200);
  62. jsq1++;
  63. if(jsq1==3) jsq1=0;

  64. testxinxi=1;
  65.   }

  66.   if(testxinxi){
  67.           testxinxi=0;
  68.           jsq1=0;
  69.           Serial.print("get:");
  70.       Serial.println(kongzhimingling);  
  71.           //速度调节


  72.           maichongjiangeSet = 625/(0.5+4.5*((kongzhimingling[1]-48)*10+kongzhimingling[2]-48)/100);//0-1023

  73.           Serial.print("maichongjiangeSet:");
  74.       Serial.println(maichongjiangeSet);  

  75.           //方向调节

  76.                 if(kongzhimingling[0]-48 != fangxiang){ //有效高电平且现在电机转速与设置相反

  77.                           Serial.print("bian");


  78.                 //1、把速度降到最低
  79.                 while(maichongjiange<maichongjiangeMax){
  80.                 jiansu();
  81.                 maichongqudong();
  82.                 }

  83.                 Serial.println("jiansuOK");

  84.                 //2、记录新的方向
  85.                 fangxiang=!fangxiang;

  86.                 //3、反方向
  87.                 digitalWrite(8, fangxiang);

  88.                 //4、在把速度加到原来值
  89.                 while(maichongjiange<maichongjiangeSet){
  90.                 jiasu();
  91.                 maichongqudong();
  92.                 }

  93.                 Serial.println("jiasuOK");

  94.                 }else  Serial.print("baochi");


  95.         }




  96. }



  97. //加速过程
  98. while(maichongjiange>maichongjiangeSet){
  99.   jiasu();
  100.   maichongqudong();
  101.   }

  102.   //加减过程
  103. while(maichongjiange<maichongjiangeSet){
  104.   jiansu();
  105.   maichongqudong();
  106.   }

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





  109. }






  110. void jiasu() //脉冲加速过程
  111. {

  112. if(micros()-time1>jiajiansubianhuashijian && maichongjiange>maichongjiangeMin){//加速过程,xxx us加速一次,加速到 yyy为止
  113. maichongjiange--;
  114. time1=micros();
  115. }

  116. }

  117. void jiansu()//脉冲减速过程
  118. {

  119. if(micros()-time1>jiajiansubianhuashijian && maichongjiange<maichongjiangeMax){
  120. maichongjiange++;
  121. time1=micros();
  122. }

  123. }


  124. void maichongqudong()//脉冲驱动
  125. {



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

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

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

  132.      time2= micros();
  133. }

  134. }


  135. void fangxiangchange() //转动方向的切换
  136. {



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

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

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

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

  149. //1、把速度降到最低
  150. while(maichongjiange<maichongjiangeMax){
  151. jiansu();
  152. maichongqudong();
  153.     }
  154. //2、反方向
  155. digitalWrite(8, LOW);
  156. //3、记录新的方向
  157. fangxiang=0;
  158. //4、在把速度加到原来值
  159. while(maichongjiange<maichongjiangeSet){
  160. jiasu();
  161. maichongqudong();
  162.     }

  163. }

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

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

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

  180. }




  181. }
复制代码


5

主题

36

帖子

141

积分

QQ群用户

积分
141
12#
 楼主| 发表于 2015-2-18 14:07:59 | 只看该作者
  1. /*
  2. djc3 无极调速 + 串口控制
  3. 规定Pin4口为一个判断点,
  4. 低电平则为串口控制,高电平为按键控制
  5. 对串口的输入做限制,必须为数字

  6. */


  7. //电机的高电平持续时间 us
  8. int maichongjiangeMax=1260;
  9. int maichongjiangeMin=120;
  10. long maichongjiangeSet;

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

  13. //脉冲的占空比为1/maichongzhankongbi
  14. int maichongzhankongbi=4;

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


  17. ////////////////////////////////////////////
  18. int kongzhifangshi;//控制方式,低电平则为串口控制,高电平为按键控制
  19. int jsq1=0;
  20. int tempint;
  21. char kongzhimingling[4];
  22. boolean testxinxi=0;

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

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


  26. unsigned long time1=micros();
  27. unsigned long time2=micros();


  28. void setup(){

  29. Serial.begin(9600);

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

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

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

  42. digitalWrite(7, LOW);//电机默认联机
  43. digitalWrite(8, LOW);//
  44. digitalWrite(9, LOW);
  45. }


  46. void loop(){

  47. kongzhifangshi = digitalRead(4);

  48. if(kongzhifangshi==1){

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

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

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

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

  59. }else{


  60.    while (Serial.available() > 0) {
  61.    
  62.     //格式:方向(1位),速度百分比(2位) 如012
  63. //kongzhimingling[jsq1]= Serial.read();
  64. if(jsq1==0){         
  65.   tempint=Serial.read();
  66.   if(tempint==48 || tempint==49)kongzhimingling[0]= tempint;         
  67. }else{
  68.   tempint=Serial.read();
  69.   if(tempint>47 && tempint<58)kongzhimingling[jsq1]= tempint;       
  70.   
  71. }

  72. delayMicroseconds(1200);
  73. jsq1++;
  74. if(jsq1==3) jsq1=0;

  75. testxinxi=1;
  76.   }
  77.   
  78.   if(testxinxi){
  79.    testxinxi=0;
  80.    jsq1=0;
  81.    Serial.print("get:");
  82.       Serial.println(kongzhimingling);  
  83.    //速度调节

  84.    
  85.    maichongjiangeSet = 625/(0.5+4.5*((kongzhimingling[1]-48)*10+kongzhimingling[2]-48)/100);//0-1023
  86.    
  87.    Serial.print("maichongjiangeSet:");
  88.       Serial.println(maichongjiangeSet);  
  89.    
  90.    //方向调节
  91.    
  92.   if(kongzhimingling[0]-48 != fangxiang){ //有效高电平且现在电机转速与设置相反

  93.      Serial.print("bian");

  94.    
  95.   //1、把速度降到最低
  96.   while(maichongjiange<maichongjiangeMax){
  97.   jiansu();
  98.   maichongqudong();
  99.   }
  100.   
  101.   Serial.println("jiansuOK");
  102.   
  103.   //2、记录新的方向
  104.   fangxiang=!fangxiang;
  105.   
  106.   //3、反方向
  107.   digitalWrite(8, fangxiang);

  108.   //4、在把速度加到原来值
  109.   while(maichongjiange<maichongjiangeSet){
  110.   jiasu();
  111.   maichongqudong();
  112.   }
  113.   
  114.   Serial.println("jiasuOK");

  115.   }else  Serial.print("baochi");

  116.   
  117. }




  118. }



  119. //加速过程
  120. while(maichongjiange>maichongjiangeSet){
  121.   jiasu();
  122.   maichongqudong();
  123.   }

  124.   //加减过程
  125. while(maichongjiange<maichongjiangeSet){
  126.   jiansu();
  127.   maichongqudong();
  128.   }

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





  131. }






  132. void jiasu() //脉冲加速过程
  133. {

  134. if(micros()-time1>jiajiansubianhuashijian && maichongjiange>maichongjiangeMin){//加速过程,xxx us加速一次,加速到 yyy为止
  135. maichongjiange--;
  136. time1=micros();
  137. }

  138. }

  139. void jiansu()//脉冲减速过程
  140. {

  141. if(micros()-time1>jiajiansubianhuashijian && maichongjiange<maichongjiangeMax){
  142. maichongjiange++;
  143. time1=micros();
  144. }

  145. }


  146. void maichongqudong()//脉冲驱动
  147. {



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

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

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

  154.      time2= micros();
  155. }

  156. }


  157. void fangxiangchange() //转动方向的切换
  158. {



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

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

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

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

  171. //1、把速度降到最低
  172. while(maichongjiange<maichongjiangeMax){
  173. jiansu();
  174. maichongqudong();
  175.     }
  176. //2、反方向
  177. digitalWrite(8, LOW);
  178. //3、记录新的方向
  179. fangxiang=0;
  180. //4、在把速度加到原来值
  181. while(maichongjiange<maichongjiangeSet){
  182. jiasu();
  183. maichongqudong();
  184.     }

  185. }

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

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

  188. //1、把速度降到最低
  189. while(maichongjiange<maichongjiangeMax){
  190. jiansu();
  191. maichongqudong();
  192.     }
  193. //2、反方向
  194. digitalWrite(8, HIGH);
  195. //3、记录新的方向
  196. fangxiang=1;
  197. //4、在把速度加到原来值
  198. while(maichongjiange<maichongjiangeSet){
  199. jiasu();
  200. maichongqudong();
  201.     }

  202. }




  203. }

复制代码


5

主题

36

帖子

141

积分

QQ群用户

积分
141
13#
 楼主| 发表于 2015-2-19 14:41:33 | 只看该作者
本帖最后由 囧囧-科技大神粉 于 2015-2-19 14:49 编辑




TNND 土豆的流畅完全不能看,算了@百度盘,原始视频


http://pan.baidu.com/s/1kTHv6T5




84

主题

143

帖子

725

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
725
QQ
14#
发表于 2015-2-19 18:11:44 | 只看该作者
囧囧大神威武
天理路上甚宽,稍游心,胸中便觉广大宏朗;
人欲路上甚窄,才寄迹,眼前俱是荆棘泥涂。

5

主题

36

帖子

141

积分

QQ群用户

积分
141
15#
 楼主| 发表于 2015-2-19 21:41:17 | 只看该作者

上程序,蓝牙的
控制上
正:1
反:0
速度上:axx,a其实是占位符

  1. /*
  2. djc3 无极调速 + 串口控制
  3. 规定Pin4口为一个判断点,
  4. 低电平则为串口控制,高电平为按键控制
  5. 对串口的输入做限制,必须为数字

  6. */


  7. //电机的高电平持续时间 us
  8. int maichongjiangeMax=1260;
  9. int maichongjiangeMin=120;
  10. long maichongjiangeSet;

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

  13. //脉冲的占空比为1/maichongzhankongbi
  14. int maichongzhankongbi=4;

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


  17. ////////////////////////////////////////////
  18. int kongzhifangshi;//控制方式,低电平则为串口控制,高电平为按键控制
  19. int jsq1=0;
  20. int tempint;
  21. char kongzhimingling[4];



  22. boolean testxinxi=0;

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

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


  26. unsigned long time1=micros();
  27. unsigned long time2=micros();


  28. void setup(){

  29. //为防止意外,先行定义为20%的运行速度
  30. kongzhimingling[0]=fangxiang+48;
  31. kongzhimingling[1]=49;
  32. kongzhimingling[2]=48;


  33. Serial.begin(9600);

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

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

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

  46. digitalWrite(7, LOW);//电机默认联机
  47. digitalWrite(8, LOW);//
  48. digitalWrite(9, LOW);

  49. }


  50. void loop(){

  51. kongzhifangshi = digitalRead(4);

  52. if(kongzhifangshi==1){

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

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

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

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

  63. }else{


  64.    while (Serial.available() > 0) {

  65.     //格式:方向(1位),速度百分比(2位) 如012
  66. //kongzhimingling[jsq1]= Serial.read();
  67. if(jsq1==0){        
  68.   tempint=Serial.read();
  69.   if(tempint==48 || tempint==49)kongzhimingling[0]= tempint;        
  70. }else{
  71.   tempint=Serial.read();
  72.   if(tempint>47 && tempint<58)kongzhimingling[jsq1]= tempint;        

  73. }

  74. delayMicroseconds(1200);
  75. jsq1++;
  76. if(jsq1==3) jsq1=0;

  77. testxinxi=1;
  78.   }

  79.   if(testxinxi){
  80.    testxinxi=0;
  81.    jsq1=0;
  82.    Serial.print("get:");
  83.       Serial.println(kongzhimingling);  
  84.    //速度调节


  85.    maichongjiangeSet = 625/(0.5+4.5*((kongzhimingling[1]-48)*10+kongzhimingling[2]-48)/100);//0-1023

  86.    Serial.print("maichongjiangeSet:");
  87.       Serial.println(maichongjiangeSet);  

  88.    //方向调节

  89.   if(kongzhimingling[0]-48 != fangxiang){ //有效高电平且现在电机转速与设置相反

  90.      Serial.println("change");


  91.   //1、把速度降到最低
  92.   while(maichongjiange<maichongjiangeMax){
  93.   jiansu();
  94.   maichongqudong();
  95.   }

  96. // Serial.println("jiansuOK");

  97.   //2、记录新的方向
  98.   fangxiang=!fangxiang;

  99.   //3、反方向
  100.   digitalWrite(8, fangxiang);

  101.   //4、在把速度加到原来值
  102.   while(maichongjiange<maichongjiangeSet){
  103.   jiasu();
  104.   maichongqudong();
  105.   }

  106.   //Serial.println("jiasuOK");

  107.   }else  Serial.println("keep");


  108. }




  109. }



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

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

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





  122. }






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

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

  129. }

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

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

  136. }


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



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

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

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

  145.      time2= micros();
  146. }

  147. }


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



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

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

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

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

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

  176. }

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

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

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

  193. }




  194. }
复制代码





5

主题

36

帖子

141

积分

QQ群用户

积分
141
16#
 楼主| 发表于 2015-2-24 15:31:21 | 只看该作者
djc5-3 反向时减速在加速的过程太快,导致噪音,所以直接去掉


/*
纯串口控制
  加入脱机控制
*/


//电机的高电平持续时间 us
int maichongjiangeMax=1260;
int maichongjiangeMin=120;
long maichongjiangeSet=600;

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

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

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


////////////////////////////////////////////
int kongzhifangshi;//控制方式,低电平则为串口控制,高电平为按键控制
int jsq1=0;
int tempint;
char kongzhimingling[5];

boolean testxinxi=0;


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


unsigned long time1=micros();
unsigned long time2=micros();


void setup(){

//为防止意外,先行定义为20%的运行速度
kongzhimingling[0]=fangxiang+48;
kongzhimingling[1]=49;
kongzhimingling[2]=48;
kongzhimingling[3]=79;//ascII 79=O ON

Serial.begin(9600);


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

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

digitalWrite(7, HIGH);//电机默认脱机
digitalWrite(8, LOW);//
digitalWrite(9, LOW);

}


void loop(){




   while (Serial.available() > 0) {

    //格式:方向(1位),速度百分比(2位),脱机(1位) 如012O / 012F
//kongzhimingling[jsq1]= Serial.read();
   tempint=Serial.read();

if(jsq1==0){   

  if(tempint==48 || tempint==49)kongzhimingling[0]= tempint;        

  }else if(jsq1==1 || jsq1==2){
          
  if(tempint>47 && tempint<58)kongzhimingling[jsq1]= tempint;        

}else if(jsq1==3){

   if(tempint==79 || tempint==70) kongzhimingling[3]= tempint;
}

if(jsq1<3)delayMicroseconds(1200);
jsq1++;


testxinxi=1;
  }

  if(testxinxi){
   testxinxi=0;
   jsq1=0;
   Serial.print("get:");
      Serial.println(kongzhimingling);  

//脱机
if(kongzhimingling[3]==79)digitalWrite(7, LOW);
else if(kongzhimingling[3]==70){
  digitalWrite(7, HIGH);
  Serial.println("off-line");
}

   //速度调节

   maichongjiangeSet = 625/(0.5+4.5*((kongzhimingling[1]-48)*10+kongzhimingling[2]-48)/100);//0-1023

   Serial.print("maichongjiangeSet:");
      Serial.println(maichongjiangeSet);  

   //方向调节

  if(kongzhimingling[0]-48 != fangxiang){ //有效高电平且现在电机转速与设置相反

     Serial.println("change");


  //2、记录新的方向
  fangxiang=!fangxiang;

  //3、反方向
  digitalWrite(8, fangxiang);



  }else  Serial.println("keep");


}






//加速过程
while(maichongjiange>maichongjiangeSet){
  jiasu();
  maichongqudong();
  }

  //加减过程
while(maichongjiange<maichongjiangeSet){
  jiansu();
  maichongqudong();
  }

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





}






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

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

}

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

if(micros()-time1>jiajiansubianhuashijian && maichongjiange<maichongjiangeMax){
maichongjiange++;
time1=micros();
}

}


void maichongqudong()//脉冲驱动
{



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

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

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

     time2= micros();
}

}




5

主题

36

帖子

141

积分

QQ群用户

积分
141
17#
 楼主| 发表于 2015-2-24 16:32:56 | 只看该作者
大材小用,泪流满面的arduino
对于步进电机驱动器的控制要点在于,输出脉冲的尽量稳定。这就要求,充当控制器的单片机要专注,尽量减少其他无关的事情
比如串口通信,在9600下,哪怕4个字节的接收,也会带来3.6ms的延迟,在400us为周期下,这就是9个脉冲周期了
所以,如果字节数太多,就必然影响脉冲,所以,单字节控制,依靠ASCII码进行定义的控制方式就出现了~~~

  1. /*
  2. 纯串口控制
  3.   加入脱机控制
  4. */


  5. //电机的高电平持续时间 us
  6. int maichongjiangeMax=1260;
  7. int maichongjiangeMin=120;
  8. long maichongjiangeSet=600;

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

  11. //脉冲的占空比为1/maichongzhankongbi
  12. int maichongzhankongbi=4;

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


  15. ////////////////////////////////////////////
  16. int kongzhifangshi;//控制方式,低电平则为串口控制,高电平为按键控制
  17. int jsq1=0;
  18. int tempint;
  19. char kongzhimingling[5];

  20. boolean testxinxi=0;


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


  23. unsigned long time1=micros();
  24. unsigned long time2=micros();


  25. void setup(){

  26. //为防止意外,先行定义为20%的运行速度
  27. kongzhimingling[0]=fangxiang+48;
  28. kongzhimingling[1]=49;
  29. kongzhimingling[2]=48;
  30. kongzhimingling[3]=79;//ascII 79=O ON

  31. Serial.begin(9600);


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

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

  41. digitalWrite(7, HIGH);//电机默认脱机
  42. digitalWrite(8, LOW);//
  43. digitalWrite(9, LOW);

  44. }


  45. void loop(){




  46.    while (Serial.available() > 0) {

  47.     //丧心病狂的1位控制,0延迟,纯ASCII分拆
  48.         //定义1 0-9表示转速,每一个表示10%
  49.         //定义2 A正转、B反转
  50.         //定义3 C联机、D脱机
  51.        
  52.    tempint=Serial.read();
  53.    
  54.    //调速度
  55.    if(tempint>47 && tempint< 58) maichongjiangeSet = 625/(0.5+4.5*(tempint-48)/10);//0-1023
  56.    //调方向
  57.    if(tempint==65)digitalWrite(8, 0);
  58.    if(tempint==66)digitalWrite(8, 1);
  59.     //脱机
  60.    if(tempint==67)digitalWrite(7, 0);
  61.    if(tempint==68)digitalWrite(7, 1);
  62.    
  63.    tempint=0;

  64. }






  65. //加速过程
  66. while(maichongjiange>maichongjiangeSet){
  67.   jiasu();
  68.   maichongqudong();
  69.   }

  70.   //加减过程
  71. while(maichongjiange<maichongjiangeSet){
  72.   jiansu();
  73.   maichongqudong();
  74.   }

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





  77. }






  78. void jiasu() //脉冲加速过程
  79. {

  80. if(micros()-time1>jiajiansubianhuashijian && maichongjiange>maichongjiangeMin){//加速过程,xxx us加速一次,加速到 yyy为止
  81. maichongjiange--;
  82. time1=micros();
  83. }

  84. }

  85. void jiansu()//脉冲减速过程
  86. {

  87. if(micros()-time1>jiajiansubianhuashijian && maichongjiange<maichongjiangeMax){
  88. maichongjiange++;
  89. time1=micros();
  90. }

  91. }


  92. void maichongqudong()//脉冲驱动
  93. {



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

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

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

  100.      time2= micros();
  101. }

  102. }


复制代码


84

主题

143

帖子

725

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
725
QQ
18#
发表于 2015-2-24 18:03:00 | 只看该作者
想要精确输出脉冲,试试定时器
天理路上甚宽,稍游心,胸中便觉广大宏朗;
人欲路上甚窄,才寄迹,眼前俱是荆棘泥涂。

5

主题

36

帖子

141

积分

QQ群用户

积分
141
19#
 楼主| 发表于 2015-2-24 19:35:38 | 只看该作者
卓泰科技 发表于 2015-2-24 18:03
想要精确输出脉冲,试试定时器

外部定时器 + arduino的外部中断?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-4-28 14:34 , Processed in 0.037546 second(s), 31 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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