步进电机归零回位零点如何更直观简洁?-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2505|回复: 2

[未解决] 步进电机归零回位零点如何更直观简洁?

[复制链接]
发表于 2021-8-17 19:54 | 显示全部楼层 |阅读模式
步进电机归零回位零点如何更直观简洁?



  1. /* 我想搞一个,步进电机开机归位归零,找了下资料太复杂,
  2. *我就搞了简易的, 就当做步进电机归零吧,我是新手见笑了,
  3. 通电后步进电机正转,碰到限位开关后,
  4. 就反转然后在正转,周而复始运行下去,我测试了下,可以成功运行,
  5. 不加归零这步骤是不行的,因为步进电机运行久了,位置就会发生偏移,来时好好的,回不去了,呵呵。
  6. 大师们。有没有更好办法让步进电机归零位,望指点,谢谢
  7. */



  8. int PUL=10; //定义脉冲引脚
  9. int DIR=9; //定义方向引脚
  10. int ENA=8; //定义使能引脚
  11. #define KEY 7 //定义限位引脚
  12. int A = 0;      //存放变量,
  13. int KEY_NUM = 0;      //按键键值存放变量,不等于1说明有按键按下
  14. void setup() {
  15. pinMode (PUL, OUTPUT);//定义为输出
  16. pinMode (DIR, OUTPUT);//定义为输出
  17. pinMode (ENA, OUTPUT);//定义为输出
  18. pinMode (KEY, INPUT_PULLUP);//定义为输入口内部上拉

  19.   }



  20. void ScanKey()            //按键扫描程序
  21. {
  22.   KEY_NUM = 0;              //清空变量
  23.   if(digitalRead(KEY) == LOW)     //有按键按下
  24.   {
  25.     delay(20);            //延时去抖动
  26.     if(digitalRead(KEY) == LOW)   //有按键按下
  27.     {
  28.       KEY_NUM = 1;        //变量设置为1
  29.       while(digitalRead(KEY) == LOW); //等待按键松手
  30.     }
  31.   }
  32. }

  33. void zhengzhuan()  //正转,不知道距离多长才能碰到限位开关,尽量设置长点25600也为何不可,甚至更长,
  34. {
  35. for (int i=0; i<6400; i++) //前进6400步,就是转多少圈
  36. {
  37. digitalWrite(DIR,LOW);//方向引脚输出低电平
  38. digitalWrite(ENA,HIGH);//使能引脚输出高电平
  39. digitalWrite(PUL,HIGH);//脉冲引脚输出高电平
  40. delayMicroseconds(200);//延时50微妙us, delay(50)是指延时50毫秒ms,增加时间转速越慢
  41. digitalWrite(PUL,LOW);//脉冲引脚输出低电平
  42. delayMicroseconds(200);//延时50微妙us,
  43. }
  44. }
  45. void fanzhuan() //反转
  46. {
  47. for (int i=0; i<3200; i++) //后退3200步
  48. {
  49. digitalWrite(DIR,HIGH);
  50. digitalWrite(ENA,HIGH);
  51. digitalWrite(PUL,HIGH);
  52. delayMicroseconds(200);
  53. digitalWrite(PUL,LOW);
  54. delayMicroseconds(200);
  55. }
  56. for (int i=0; i<3200; i++) //前进3200步
  57. {
  58. digitalWrite(DIR,LOW);//方向引脚输出低电平
  59. digitalWrite(ENA,HIGH);//使能引脚输出高电平
  60. digitalWrite(PUL,HIGH);//脉冲引脚输出高电平
  61. delayMicroseconds(200);//延时50微妙us, delay(50)是指延时50毫秒ms,增加时间转速越慢
  62. digitalWrite(PUL,LOW);//脉冲引脚输出低电平
  63. delayMicroseconds(200);//延时50微妙us,
  64. }
  65. }
  66. //
  67. void loop() {

  68. if(A == 0) //当做步进电机归零吧,只运行一次
  69. {   
  70.   zhengzhuan();  //正转

  71.   ScanKey();            //按键扫描程序,当按键按下时候,该子程序会修改KEY_NUM的值
  72.   if(KEY_NUM == 1)              //是否按键按下
  73.   {   
  74.     digitalWrite(ENA,HIGH);//使能引脚输出高电平;    //停止步进电机
  75.     delay(5000); //步进电机碰到限位开关在此停止5秒,设置更大时间你看见效果,
  76.    A=1;
  77.   }
  78. }

  79. if(A == 1) //一直会运行下面代码
  80. {   
  81.   fanzhuan();  //反转
  82. }
  83.   
  84.   
  85. }


复制代码

 楼主| 发表于 2021-8-17 20:07 | 显示全部楼层
这代码太低级臃肿,求简洁的代码
发表于 2021-8-18 01:00 | 显示全部楼层
使用步进电机库进行驱动。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-29 02:54 , Processed in 0.070248 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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