<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> Arduino >> 瀏覽文章

        Arduino UNo 通過LM298n控制步進電機(2)

        作者:goingxu   來源:本站原創   點擊數:  更新時間:2014年04月21日   【字體:

        兩相8拍程序,也是對網上找的程序進行時序修改:

        //八拍,半步:(+A)(+B)--(+B)--(-A)(+B)--(-A)--(-A)(-B)--(-B)--(+A)(-B)--(+A)--
        int Pin0 = 8; //A
        int Pin1 = 9; //A'
        int Pin2 = 10;  //B
        int Pin3 = 11;  //B'
        int _step =0 ;
        boolean dir = true;//正反轉
        int stepperSpeed = 1500;//電機轉速,XX us一步, larger than 1500um
        int stepN =0;
        void setup()
        {
          pinMode(Pin0, OUTPUT);
          pinMode(Pin1, OUTPUT);
          pinMode(Pin2, OUTPUT);
          pinMode(Pin3, OUTPUT);
        }
         
        void loop()
        {
          switch(_step){
            case 0:
              digitalWrite(Pin0, HIGH);
              digitalWrite(Pin1, LOW);
              digitalWrite(Pin2, HIGH);
              digitalWrite(Pin3, LOW);
            break;
            case 1:
              digitalWrite(Pin0, LOW);
              digitalWrite(Pin1, LOW);
              digitalWrite(Pin2, HIGH);
              digitalWrite(Pin3, LOW);
            break;
            case 2:
              digitalWrite(Pin0, LOW);
              digitalWrite(Pin1, HIGH);
              digitalWrite(Pin2, HIGH);
              digitalWrite(Pin3, LOW);
            break;
            case 3:
              digitalWrite(Pin0, LOW);
              digitalWrite(Pin1, HIGH);
              digitalWrite(Pin2, LOW);
              digitalWrite(Pin3, LOW);
            break;
            case 4:
              digitalWrite(Pin0, LOW);
              digitalWrite(Pin1, HIGH);
              digitalWrite(Pin2, LOW);
              digitalWrite(Pin3, HIGH);
            break;
            case 5:
              digitalWrite(Pin0, LOW);
              digitalWrite(Pin1, LOW);
              digitalWrite(Pin2, LOW);
              digitalWrite(Pin3, HIGH);
            break;
              case 6:
              digitalWrite(Pin0, HIGH);
              digitalWrite(Pin1, LOW);
              digitalWrite(Pin2, LOW);
              digitalWrite(Pin3, HIGH);
            break;
            case 7:
              digitalWrite(Pin0, HIGH);
              digitalWrite(Pin1, LOW);
              digitalWrite(Pin2, LOW);
              digitalWrite(Pin3, LOW);
            break;
            default:
              digitalWrite(Pin0, LOW);
              digitalWrite(Pin1, LOW);
              digitalWrite(Pin2, LOW);
              digitalWrite(Pin3, LOW);
              delay(1000);
            break;
          }
          if(dir){
            _step++;
          }else{
            _step--;
          }
          if(_step>7){
            _step=0;
          }
          if(_step<0){
            _step=7;
          }
          delayMicroseconds(stepperSpeed);
         
        //delay(stepperSpeed);

          stepN++;
          if(stepN>=400)
          {
            dir = !dir;  //after turning 400 stepps, change direction.
            stepN =0;
            _step=10;//pause
          }
        }

        結論:

           兩段程序均可以運行良好,空轉時沒有丟步。但當時間間隔調小到一定程度后,電機無法轉動。四拍時為2000us,八拍時1500微秒。沒有細調,可能與負載有關。動力老男孩文章中寫的是1500us,但我的電機無法運動,是否和電機型號不同有關。 這個間隔決定了電機的轉速,因此這里的步進電機空載轉速在四拍時約為2.5轉每秒(rps),八拍時約1.67rps。注意:四拍時電機200個脈沖1圈,單步步距1.8度;八拍時400個脈沖1圈,單步步距0.9度。如何進行更高的細分?

           步進電機調速主要是調整脈沖頻率,所以lm298n的兩個pwm波接口EnA、EnB直接接5v。

           實驗了小角度擺動,擺角9度時,理論可達40*1.67=66.8Hz,以后可以嘗試測量是否達到。

           當電機不動時,如在loop()中用delay,電機使能,電流很大(超過1A),因此這里將電機停止運動時直接全部置低,電流就很小了(最大電流200ma),但停止時無法保持位置。這一矛盾應該采用閉環控制克服。
         

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮