极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11152|回复: 1

求助 我的步进电机不转

[复制链接]
发表于 2015-8-4 09:43:33 | 显示全部楼层 |阅读模式
我用Arduino2560连接步进电机驱动M420B控制步进电机滑台,用位移传感器检测位置。可是我编好程序步进电机只运行一步。我哪里出错了。

  1. const int PUL = 13;
  2. const int DIR = 12;
  3. const int ENA = 11;
  4. long delta;
  5. long dt1;
  6. long dt; float vol; float t,t_1;
  7. volatile float v = 0, v_1, v_11;
  8. unsigned long lasttime;
  9. long unsigned mm;
  10. int i = 2000;
  11. int temp;
  12. float ss;
  13. int target_position; float old_position;float current_position;
  14. int s_acc, s_dec;
  15. boolean flag;
  16. void setup()
  17. {
  18.   pinMode(PUL, OUTPUT);
  19.   pinMode(DIR, OUTPUT);
  20.   pinMode(ENA, OUTPUT);
  21.   Serial.begin(9600);
  22.   lasttime = 0;
  23.    //**************************理想速度曲线**************************//
  24.   if (current_position < -200) {
  25.     t_1 = 400; v_1 = 2500;
  26.   }
  27.   if (current_position > 200) {
  28.     t_1 = -400; v_1 = -2500;
  29.   }
  30.   else {
  31.     t_1 = -80000/current_position; v_1 = -12.5*current_position;
  32.   }
  33.   /********************************************************************/
  34. }
  35. void loop() {
  36.   //**************************检测位置**************************//
  37.   int V1 = analogRead(A0);
  38.   vol = V1 * (5.0 / 1023.0) * 1000;
  39.   current_position = 270 * vol / 4690;
  40.   current_position -= 120;
  41.   current_position = round(current_position / 0.3);
  42.   //  if (current_position == ss) {
  43.   //    ss = current_position;
  44.   //  }
  45.   //  else {
  46.   //    Serial.println(current_position);
  47.   //    ss = current_position;
  48.   //  }
  49. /********************************************************************/
  50.   
  51.   v_1 = -12.5*(current_position + sgn(v)); //下一拍的理想速度

  52.   int f = sgn(v-v_1); float new_position = round(-v/12.5);
  53.   v_11 = -12.5 * (new_position + f);//下一拍的期望速度

  54.   if ((v_11-v_1) * (v-v_1) < 0) {
  55.     mm = micros();
  56.     v = v_1;
  57.     dt = round(1000000/v);
  58.     dt1 = round(dt/2);
  59.     digitalWrite(DIR, LOW);
  60.     digitalWrite(ENA, HIGH);
  61.    
  62.     delta = mm - lasttime;
  63.     if (delta < dt1) {
  64.       digitalWrite(PUL, LOW);
  65.     }
  66.     else if (delta < dt) {
  67.       digitalWrite(PUL, HIGH);
  68.     }
  69.     else {
  70.       lasttime = mm;
  71.       
  72.     }
  73.   }
  74.   else if (v_11 * v < 0) {
  75.     v = 0;
  76.     //    digitalWrite(ENA, LOW);
  77.   }
  78.   else {
  79.     mm = micros();
  80.     v = v_11;
  81.     dt = round(1000000/v);
  82.     dt1 = round(dt / 2);
  83.     digitalWrite(DIR, LOW);
  84.     digitalWrite(ENA, HIGH);
  85.    
  86.     delta = mm - lasttime;
  87.     if (delta < dt1) {
  88.       digitalWrite(PUL, LOW);
  89.     }
  90.     else if (delta < dt) {
  91.       digitalWrite(PUL, HIGH);
  92.     }
  93.     else {
  94.       lasttime = mm;
  95.       
  96.     }
  97.   }
  98. }
  99. int sgn(float x) {
  100.   if (x > 0) return 1;
  101.   else if (x < 0) return -1;
  102.   else return 0;
  103. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2015-8-5 13:57:43 | 显示全部楼层
求大神
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 18:30 , Processed in 0.034094 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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