|
步进电机归零回位零点如何更直观简洁?
- /* 我想搞一个,步进电机开机归位归零,找了下资料太复杂,
- *我就搞了简易的, 就当做步进电机归零吧,我是新手见笑了,
- 通电后步进电机正转,碰到限位开关后,
- 就反转然后在正转,周而复始运行下去,我测试了下,可以成功运行,
- 不加归零这步骤是不行的,因为步进电机运行久了,位置就会发生偏移,来时好好的,回不去了,呵呵。
- 大师们。有没有更好办法让步进电机归零位,望指点,谢谢
- */
- int PUL=10; //定义脉冲引脚
- int DIR=9; //定义方向引脚
- int ENA=8; //定义使能引脚
- #define KEY 7 //定义限位引脚
- int A = 0; //存放变量,
- int KEY_NUM = 0; //按键键值存放变量,不等于1说明有按键按下
- void setup() {
- pinMode (PUL, OUTPUT);//定义为输出
- pinMode (DIR, OUTPUT);//定义为输出
- pinMode (ENA, OUTPUT);//定义为输出
- pinMode (KEY, INPUT_PULLUP);//定义为输入口内部上拉
- }
- void ScanKey() //按键扫描程序
- {
- KEY_NUM = 0; //清空变量
- if(digitalRead(KEY) == LOW) //有按键按下
- {
- delay(20); //延时去抖动
- if(digitalRead(KEY) == LOW) //有按键按下
- {
- KEY_NUM = 1; //变量设置为1
- while(digitalRead(KEY) == LOW); //等待按键松手
- }
- }
- }
- void zhengzhuan() //正转,不知道距离多长才能碰到限位开关,尽量设置长点25600也为何不可,甚至更长,
- {
- for (int i=0; i<6400; i++) //前进6400步,就是转多少圈
- {
- digitalWrite(DIR,LOW);//方向引脚输出低电平
- digitalWrite(ENA,HIGH);//使能引脚输出高电平
- digitalWrite(PUL,HIGH);//脉冲引脚输出高电平
- delayMicroseconds(200);//延时50微妙us, delay(50)是指延时50毫秒ms,增加时间转速越慢
- digitalWrite(PUL,LOW);//脉冲引脚输出低电平
- delayMicroseconds(200);//延时50微妙us,
- }
- }
- void fanzhuan() //反转
- {
- for (int i=0; i<3200; i++) //后退3200步
- {
- digitalWrite(DIR,HIGH);
- digitalWrite(ENA,HIGH);
- digitalWrite(PUL,HIGH);
- delayMicroseconds(200);
- digitalWrite(PUL,LOW);
- delayMicroseconds(200);
- }
- for (int i=0; i<3200; i++) //前进3200步
- {
- digitalWrite(DIR,LOW);//方向引脚输出低电平
- digitalWrite(ENA,HIGH);//使能引脚输出高电平
- digitalWrite(PUL,HIGH);//脉冲引脚输出高电平
- delayMicroseconds(200);//延时50微妙us, delay(50)是指延时50毫秒ms,增加时间转速越慢
- digitalWrite(PUL,LOW);//脉冲引脚输出低电平
- delayMicroseconds(200);//延时50微妙us,
- }
- }
- //
- void loop() {
- if(A == 0) //当做步进电机归零吧,只运行一次
- {
- zhengzhuan(); //正转
- ScanKey(); //按键扫描程序,当按键按下时候,该子程序会修改KEY_NUM的值
- if(KEY_NUM == 1) //是否按键按下
- {
- digitalWrite(ENA,HIGH);//使能引脚输出高电平; //停止步进电机
- delay(5000); //步进电机碰到限位开关在此停止5秒,设置更大时间你看见效果,
- A=1;
- }
- }
- if(A == 1) //一直会运行下面代码
- {
- fanzhuan(); //反转
- }
-
-
- }
复制代码
|
|