极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8005|回复: 4

电机控制及码盘测速

[复制链接]
发表于 2016-8-26 11:10:43 | 显示全部楼层 |阅读模式
啦啦啦 要来发布测试视频啦~~~~
但仍然存在一些缺陷:1.测速精度低 2.使用时经常会出现停止测速的情况(即Processing上的测速示数停在某个值不动)如下视频所示



正常情况


电机视频


Arduino code

  1. [code]
  2. #include <FlexiTimer2.h>
  3. #define IN1 3
  4. #define IN2 4
  5. #define IN3 5
  6. #define IN4 6
  7. String comdata = "";
  8. int numdata[2] = {0}, mark = 0,dirdata[2]={0};
  9. int PWMPin[2] = {8,9};
  10. //编码器部分
  11. const int interruptA = 0,interruptB = 5;
  12. //int CLK1 = 22,CLK2 = 23;
  13. //int DT1 = 6,DT2 = 7;
  14. int COUNT1 = 0,COUNT2 = 0;
  15. float lastt, currentt, Speed1,Speed2;

  16. void setup()
  17. {   Serial.begin(9600);
  18.     pinMode(IN1, OUTPUT);
  19.     pinMode(IN2, OUTPUT);
  20.     pinMode(IN3, OUTPUT);
  21.     pinMode(IN4, OUTPUT);
  22.     pinMode(PWMPin[0],OUTPUT);
  23.     pinMode(PWMPin[1],OUTPUT);
  24.     //编码器部分
  25.     attachInterrupt(interruptA, RoteStateChanged1, FALLING);
  26.     attachInterrupt(interruptB, RoteStateChanged2, FALLING);      
  27. //    FlexiTimer2::set(1000, flash); // 500ms period
  28. //motor1
  29. //    pinMode(CLK1, INPUT);
  30. //    digitalWrite (CLK1, HIGH);
  31. //    pinMode(DT1, INPUT);
  32. //    digitalWrite (DT1, HIGH);
  33. //motor2
  34. //    pinMode(CLK2, INPUT);
  35. //    digitalWrite (CLK2, HIGH);
  36. //    pinMode(DT2, INPUT);
  37. //    digitalWrite (DT2, HIGH);
  38.    
  39.     lastt =  millis();
  40. }

  41. //void flash()
  42. //{
  43. //  Speed1 = 4*PI*PI*COUNT1*67/1560;
  44. //  Speed2 = 4*PI*PI*COUNT2*67/1560;
  45. //  Serial.print('h');
  46. //  Serial.print(',');
  47. //  Serial.print(Speed1);
  48. //  Serial.print(',');
  49. //  Serial.print(Speed2);
  50. //  Serial.print('\n');
  51. //  COUNT1 = 0;
  52. //  COUNT2 = 0;
  53. //  }

  54.   
  55. void loop ()
  56. {   
  57.    
  58.     int j = 0;
  59.     while (Serial.available() > 0)
  60.     {

  61.          comdata += char (Serial.read());
  62.          delay (2);
  63.          mark = 1;
  64.       }

  65. //              FlexiTimer2::start();
  66. //              delay(1000);
  67. //              FlexiTimer2::stop();
  68.     if (mark == 1)
  69.     {
  70.             dirdata[0] = comdata[0];
  71.             dirdata[1] = comdata[2];
  72.             if (dirdata[0] == 1)
  73.             {
  74.                 digitalWrite (IN1, HIGH);
  75.                 digitalWrite (IN2, LOW);
  76.             }
  77.             else
  78.             {
  79.                 digitalWrite (IN1, LOW);
  80.                 digitalWrite (IN2, HIGH);
  81.             }
  82.             if (dirdata[1] == 1)
  83.             {
  84.                 digitalWrite (IN3, HIGH);
  85.                 digitalWrite (IN4, LOW);
  86.             }
  87.             else
  88.             {
  89.                 digitalWrite (IN3, LOW);
  90.                 digitalWrite (IN4, HIGH);
  91.             }
  92.             
  93.             for(int i = 4; i < comdata.length(); i++)
  94.             {
  95.                if (comdata [i] == ',')
  96.                {
  97.                  j++;
  98.                }
  99.                else
  100.                {
  101.                 numdata[j] = numdata[j]*10 + (comdata[i] - '0');
  102.                }
  103.             }
  104.                comdata = String("");
  105.                for (int i = 0; i < 2; i++)
  106.                {
  107.                    analogWrite (PWMPin[i], numdata[i]);
  108.                    numdata[i] = 0;
  109.                }
  110.                mark = 0;
  111.               }
  112.        currentt =  millis();
  113.      if ((currentt - lastt) == 500)
  114.      {
  115.         detachInterrupt(interruptA);
  116.         detachInterrupt(interruptB);
  117.         Speed1 = 4*PI*PI*COUNT1*67/1560;
  118.         Speed2 = 4*PI*PI*COUNT2*67/1560;
  119.         Serial.print('h');
  120.         Serial.print(',');
  121.         Serial.print(Speed1);
  122.         Serial.print(',');
  123.         Serial.print(Speed2);
  124.         Serial.print('\n');
  125.         COUNT1 = 0;
  126.         COUNT2 = 0;
  127.         lastt =  millis();
  128.         attachInterrupt(interruptA, RoteStateChanged1, FALLING);
  129.         attachInterrupt(interruptB, RoteStateChanged2, FALLING);     
  130.      }
  131.          
  132. }

  133. void RoteStateChanged1()
  134. {
  135.    
  136. //     if (digitalRead(DT1))
  137. //    {
  138.         COUNT1++;
  139. //    }   
  140.    
  141. }

  142. void RoteStateChanged2()
  143. {

  144. //     if (digitalRead(DT2))
  145. //    {
  146.         COUNT2++;
  147. //    }   

  148. }
复制代码
[/code]




Processing code
  1. class Button
  2. {
  3.      int x, y, r;
  4.      int dir = 1;
  5.       Button(int xp, int yp, int rp)
  6.      {
  7.             x = xp;
  8.             y = yp;
  9.             r = rp;
  10.          
  11.      }
  12.      void display()
  13.      {   
  14.          
  15.          fill(255);
  16.          rect(x,y,r,r);
  17.          if (dir == 1)
  18.          {
  19.              text("Foward",x-90,y+10);
  20.          }
  21.          else
  22.          {
  23.              text("Back",x-90,y+10);
  24.          }
  25.      }
  26.      void press(int mx, int my)
  27.      {
  28.       
  29.          if ((mx > (x))&&(mx < (x + r))&&(my > (y))&&(my < (y + r)))
  30.          {
  31.             
  32.              dir = -dir;
  33.          }
  34.       
  35.      }
  36.      int Output()
  37.      {
  38.         return dir;
  39.      }
  40. }
  41. class Scrollbar
  42. {
  43.      int x, y;
  44.      float Scrollbar_Width, Scrollbar_Height;
  45.      float pos;
  46.      float position_Min, position_Max;
  47.      boolean rollover;
  48.      boolean locked;
  49.      float minVal, maxVal;
  50.      Scrollbar (int xp, int yp, int w ,int h, float miv, float mav)
  51.      {
  52.               x = xp;
  53.               y = yp;
  54.               Scrollbar_Width = w;
  55.               Scrollbar_Height = h;
  56.               minVal = miv;
  57.               maxVal = mav;
  58.               pos = x;
  59.               position_Min = x;
  60.               position_Max = x + Scrollbar_Width - Scrollbar_Height;   
  61.      }
  62.      void update (int mx, int my)
  63.      {
  64.          if (over (mx, my) == true)
  65.          {
  66.            rollover = true;
  67.          }
  68.          else
  69.          {
  70.            rollover = false;
  71.          }
  72.          if (locked == true)
  73.          {
  74.            pos = constrain(mx-Scrollbar_Height/2,position_Min,position_Max);
  75.          }
  76.      }
  77.      void press(int mx, int my)
  78.      {
  79.          if (rollover == true)
  80.          {
  81.           locked = true;
  82.          }
  83.          else
  84.          {
  85.            locked = false;
  86.          }
  87.      }
  88.      void release()
  89.      {
  90.          locked = false;
  91.      }
  92.      boolean over (int mx, int my)
  93.      {
  94.             if ((mx > x)&&(mx < x+Scrollbar_Width)&&(my > y)&&(my < y + Scrollbar_Height))
  95.             {
  96.                 return true;
  97.             }
  98.             else
  99.             {
  100.                 return false;
  101.             }
  102.             
  103.             
  104.      }
  105.      void display()
  106.      {
  107.          fill(255);
  108.          rect(x,y,Scrollbar_Width, Scrollbar_Height);
  109.          if ((rollover == true)||(locked == true))
  110.          {
  111.              fill(#FFD700);
  112.          }
  113.          else
  114.          {
  115.              fill(102);
  116.          }
  117.          rect(pos, y, Scrollbar_Height, Scrollbar_Height);
  118.      }
  119.      float getPos()
  120.      {
  121.           float scallar = Scrollbar_Width/(Scrollbar_Width-Scrollbar_Height);
  122.           float ratio = (pos - x)*scallar;
  123.           float offset = minVal + (ratio/Scrollbar_Width*(maxVal-minVal));
  124.           return offset;
  125.      }
  126. }

  127. Scrollbar Motor1_bar, Motor2_bar;
  128. Button But1, But2;
  129. PFont font;
  130. int pos1, pos2;
  131. import processing.serial.*;
  132. Serial myPort;
  133. float Speed1 = 0,Speed2 = 0;
  134. PImage img;


  135. void setup()
  136. {
  137.     img = requestImage("image1.jpg");
  138.     size (600 , 600);
  139.     noStroke();
  140.     textSize(20);
  141.     Motor1_bar = new Scrollbar(100, 50, 255, 20, 0, 255);
  142.     Motor2_bar = new Scrollbar(100, 150, 255, 20, 0, 255);
  143.     But1 = new Button(110,110,10);
  144.     But2 = new Button(110,210,10);
  145.     font = loadFont("David-30.vlw");
  146.     textFont(font);
  147.     textAlign(LEFT);
  148.     myPort = new Serial(this, "COM4", 9600);
  149.     myPort.bufferUntil('\n');
  150.     myPort.clear();
  151.    
  152. }

  153. void draw()
  154. {   
  155.     background(0);
  156.     img.resize(352,220);
  157.     image(img,120,350);


  158.     fill(255);
  159.     text("Motor1", 20, 68);
  160.     text("Motor2", 20, 168);
  161.     pos1 = int (Motor1_bar.getPos());
  162.     textSize(25);
  163.     text(pos1, 525, 68);
  164.     text("PWM:", 365, 68);
  165.     text("Speed1(mm/s):", 365, 120);
  166.     text(Speed1, 520, 120);
  167.     pos2 = int (Motor2_bar.getPos());
  168.     text(pos2, 525, 168);
  169.     text("PWM:", 365, 168);
  170.     text("Speed2(mm/s):", 365, 220);
  171.     text(Speed2, 520, 220);
  172.     Motor1_bar.update(mouseX, mouseY);
  173.     Motor2_bar.update(mouseX, mouseY);
  174.     Motor1_bar.display();
  175.     Motor2_bar.display();
  176.     But1.display();
  177.     But2.display();
  178. }

  179. void mousePressed()
  180. {
  181.     Motor1_bar.press(mouseX, mouseY);
  182.     Motor2_bar.press(mouseX, mouseY);
  183.     But1.press(mouseX, mouseY);
  184.     But2.press(mouseX, mouseY);
  185. }

  186. void mouseReleased()
  187. {
  188.     String s1 = Integer.toString(pos1);
  189.     String s2 = Integer.toString(pos2);
  190.     int s3 = But1.Output();
  191.     int s4 = But2.Output();
  192.     myPort.write(s3);
  193.     myPort.write(",");
  194.     myPort.write(s4);
  195.     myPort.write(",");
  196.     myPort.write(s1);
  197.     myPort.write(",");
  198.     myPort.write(s2);
  199.     Motor1_bar.release();
  200.     Motor2_bar.release();
  201. }

  202. void serialEvent(Serial p)
  203. {
  204.     String [] str;
  205.     String inString = p.readString();
  206.     if (inString != null)
  207.     {
  208.         str = inString.split(",");
  209.         if(str[0].charAt(0) == 'h')
  210.         {
  211.             Speed1 = Float.parseFloat(str[1]);
  212.             Speed2 = Float.parseFloat(str[2]);
  213.         }
  214.     }
  215. }
  216.    
复制代码


回复

使用道具 举报

 楼主| 发表于 2016-8-26 11:12:20 | 显示全部楼层
活见鬼了 真是每每发Arduino代码都发不出去
  1. #include <FlexiTimer2.h>
  2. #define IN1 3
  3. #define IN2 4
  4. #define IN3 5
  5. #define IN4 6
  6. String comdata = "";
  7. int numdata[2] = {0}, mark = 0,dirdata[2]={0};
  8. int PWMPin[2] = {8,9};
  9. //编码器部分
  10. const int interruptA = 0,interruptB = 5;
  11. //int CLK1 = 22,CLK2 = 23;
  12. //int DT1 = 6,DT2 = 7;
  13. int COUNT1 = 0,COUNT2 = 0;
  14. float lastt, currentt, Speed1,Speed2;

  15. void setup()
  16. {   Serial.begin(9600);
  17.     pinMode(IN1, OUTPUT);
  18.     pinMode(IN2, OUTPUT);
  19.     pinMode(IN3, OUTPUT);
  20.     pinMode(IN4, OUTPUT);
  21.     pinMode(PWMPin[0],OUTPUT);
  22.     pinMode(PWMPin[1],OUTPUT);
  23.     //编码器部分
  24.     attachInterrupt(interruptA, RoteStateChanged1, FALLING);
  25.     attachInterrupt(interruptB, RoteStateChanged2, FALLING);      
  26. //    FlexiTimer2::set(1000, flash); // 500ms period
  27. //motor1
  28. //    pinMode(CLK1, INPUT);
  29. //    digitalWrite (CLK1, HIGH);
  30. //    pinMode(DT1, INPUT);
  31. //    digitalWrite (DT1, HIGH);
  32. //motor2
  33. //    pinMode(CLK2, INPUT);
  34. //    digitalWrite (CLK2, HIGH);
  35. //    pinMode(DT2, INPUT);
  36. //    digitalWrite (DT2, HIGH);
  37.    
  38.     lastt =  millis();
  39. }

  40. //void flash()
  41. //{
  42. //  Speed1 = 4*PI*PI*COUNT1*67/1560;
  43. //  Speed2 = 4*PI*PI*COUNT2*67/1560;
  44. //  Serial.print('h');
  45. //  Serial.print(',');
  46. //  Serial.print(Speed1);
  47. //  Serial.print(',');
  48. //  Serial.print(Speed2);
  49. //  Serial.print('\n');
  50. //  COUNT1 = 0;
  51. //  COUNT2 = 0;
  52. //  }

  53.   
  54. void loop ()
  55. {   
  56.    
  57.     int j = 0;
  58.     while (Serial.available() > 0)
  59.     {

  60.          comdata += char (Serial.read());
  61.          delay (2);
  62.          mark = 1;
  63.       }

  64. //              FlexiTimer2::start();
  65. //              delay(1000);
  66. //              FlexiTimer2::stop();
  67.     if (mark == 1)
  68.     {
  69.             dirdata[0] = comdata[0];
  70.             dirdata[1] = comdata[2];
  71.             if (dirdata[0] == 1)
  72.             {
  73.                 digitalWrite (IN1, HIGH);
  74.                 digitalWrite (IN2, LOW);
  75.             }
  76.             else
  77.             {
  78.                 digitalWrite (IN1, LOW);
  79.                 digitalWrite (IN2, HIGH);
  80.             }
  81.             if (dirdata[1] == 1)
  82.             {
  83.                 digitalWrite (IN3, HIGH);
  84.                 digitalWrite (IN4, LOW);
  85.             }
  86.             else
  87.             {
  88.                 digitalWrite (IN3, LOW);
  89.                 digitalWrite (IN4, HIGH);
  90.             }
  91.             
  92.             for(int i = 4; i < comdata.length(); i++)
  93.             {
  94.                if (comdata [i] == ',')
  95.                {
  96.                  j++;
  97.                }
  98.                else
  99.                {
  100.                 numdata[j] = numdata[j]*10 + (comdata[i] - '0');
  101.                }
  102.             }
  103.                comdata = String("");
  104.                for (int i = 0; i < 2; i++)
  105.                {
  106.                    analogWrite (PWMPin[i], numdata[i]);
  107.                    numdata[i] = 0;
  108.                }
  109.                mark = 0;
  110.               }
  111.        currentt =  millis();
  112.      if ((currentt - lastt) == 500)
  113.      {
  114.         detachInterrupt(interruptA);
  115.         detachInterrupt(interruptB);
  116.         Speed1 = 4*PI*PI*COUNT1*67/1560;
  117.         Speed2 = 4*PI*PI*COUNT2*67/1560;
  118.         Serial.print('h');
  119.         Serial.print(',');
  120.         Serial.print(Speed1);
  121.         Serial.print(',');
  122.         Serial.print(Speed2);
  123.         Serial.print('\n');
  124.         COUNT1 = 0;
  125.         COUNT2 = 0;
  126.         lastt =  millis();
  127.         attachInterrupt(interruptA, RoteStateChanged1, FALLING);
  128.         attachInterrupt(interruptB, RoteStateChanged2, FALLING);     
  129.      }
  130.          
  131. }

  132. void RoteStateChanged1()
  133. {
  134.    
  135. //     if (digitalRead(DT1))
  136. //    {
  137.         COUNT1++;
  138. //    }   
  139.    
  140. }

  141. void RoteStateChanged2()
  142. {

  143. //     if (digitalRead(DT2))
  144. //    {
  145.         COUNT2++;
  146. //    }   

  147. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-26 11:45:13 | 显示全部楼层
用定时器测速 可能精度会高一点
  1. #include <FlexiTimer2.h>
  2. #define IN1 3
  3. #define IN2 4
  4. #define IN3 5
  5. #define IN4 6
  6. String comdata = "";
  7. int numdata[2] = {0}, mark = 0,dirdata[2]={0};
  8. int PWMPin[2] = {8,13};
  9. //编码器部分
  10. const int interruptA = 0,interruptB = 5;
  11. //int CLK1 = 22,CLK2 = 23;
  12. //int DT1 = 6,DT2 = 7;
  13. int COUNT1 = 0,COUNT2 = 0;
  14. float lastt, currentt, Speed1,Speed2;

  15. void setup()
  16. {   Serial.begin(9600);
  17.     pinMode(IN1, OUTPUT);
  18.     pinMode(IN2, OUTPUT);
  19.     pinMode(IN3, OUTPUT);
  20.     pinMode(IN4, OUTPUT);
  21.     pinMode(PWMPin[0],OUTPUT);
  22.     pinMode(PWMPin[1],OUTPUT);
  23.     //编码器部分
  24.     attachInterrupt(interruptA, RoteStateChanged1, FALLING);
  25.     attachInterrupt(interruptB, RoteStateChanged2, FALLING);      
  26.     FlexiTimer2::set(500, flash); // 500ms period
  27.     FlexiTimer2::start();
  28. //motor1
  29. //    pinMode(CLK1, INPUT);
  30. //    digitalWrite (CLK1, HIGH);
  31. //    pinMode(DT1, INPUT);
  32. //    digitalWrite (DT1, HIGH);
  33. //motor2
  34. //    pinMode(CLK2, INPUT);
  35. //    digitalWrite (CLK2, HIGH);
  36. //    pinMode(DT2, INPUT);
  37. //    digitalWrite (DT2, HIGH);
  38.    
  39. //    lastt =  millis();
  40. }

  41. void flash()
  42. {
  43.   Speed1 = 8*PI*PI*COUNT1*67/1560;
  44.   Speed2 = 8*PI*PI*COUNT2*67/1560;
  45.   Serial.print('h');
  46.   Serial.print(',');
  47.   Serial.print(Speed1);
  48.   Serial.print(',');
  49.   Serial.print(Speed2);
  50.   Serial.print('\n');
  51.   COUNT1 = 0;
  52.   COUNT2 = 0;
  53.   }

  54.   
  55. void loop ()
  56. {   
  57.    
  58.     int j = 0;
  59.     while (Serial.available() > 0)
  60.     {

  61.          comdata += char (Serial.read());
  62.          delay (2);
  63.          mark = 1;
  64.       }

  65. //              FlexiTimer2::start();
  66. //              delay(1000);
  67. //              FlexiTimer2::stop();
  68.     if (mark == 1)
  69.     {
  70.             dirdata[0] = comdata[0];
  71.             dirdata[1] = comdata[2];
  72.             if (dirdata[0] == 1)
  73.             {
  74.                 digitalWrite (IN1, HIGH);
  75.                 digitalWrite (IN2, LOW);
  76.             }
  77.             else
  78.             {
  79.                 digitalWrite (IN1, LOW);
  80.                 digitalWrite (IN2, HIGH);
  81.             }
  82.             if (dirdata[1] == 1)
  83.             {
  84.                 digitalWrite (IN3, HIGH);
  85.                 digitalWrite (IN4, LOW);
  86.             }
  87.             else
  88.             {
  89.                 digitalWrite (IN3, LOW);
  90.                 digitalWrite (IN4, HIGH);
  91.             }
  92.             
  93.             for(int i = 4; i < comdata.length(); i++)
  94.             {
  95.                if (comdata [i] == ',')
  96.                {
  97.                  j++;
  98.                }
  99.                else
  100.                {
  101.                 numdata[j] = numdata[j]*10 + (comdata[i] - '0');
  102.                }
  103.             }
  104.                comdata = String("");
  105.                for (int i = 0; i < 2; i++)
  106.                {
  107.                    analogWrite (PWMPin[i], numdata[i]);
  108.                    numdata[i] = 0;
  109.                }
  110.                mark = 0;
  111.               }
  112. //       currentt =  millis();
  113. //     if ((currentt - lastt) == 500)
  114. //     {
  115. //        detachInterrupt(interruptA);
  116. //        detachInterrupt(interruptB);
  117. //        Speed1 = 4*PI*PI*COUNT1*67/1560;
  118. //        Speed2 = 4*PI*PI*COUNT2*67/1560;
  119. //        Serial.print('h');
  120. //        Serial.print(',');
  121. //        Serial.print(Speed1);
  122. //        Serial.print(',');
  123. //        Serial.print(Speed2);
  124. //        Serial.print('\n');
  125. //        COUNT1 = 0;
  126. //        COUNT2 = 0;
  127. //        lastt =  millis();
  128. //        attachInterrupt(interruptA, RoteStateChanged1, FALLING);
  129. //        attachInterrupt(interruptB, RoteStateChanged2, FALLING);     
  130. //     }
  131.          
  132. }

  133. void RoteStateChanged1()
  134. {
  135.    
  136. //     if (digitalRead(DT1))
  137. //    {
  138.         COUNT1++;
  139. //    }   
  140.    
  141. }

  142. void RoteStateChanged2()
  143. {

  144. //     if (digitalRead(DT2))
  145. //    {
  146.         COUNT2++;
  147. //    }   

  148. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2016-8-27 10:51:21 | 显示全部楼层
mills也可以的,编码器的精度多少?340线的?还是11线的?
回复 支持 反对

使用道具 举报

发表于 2016-10-25 16:38:22 | 显示全部楼层
柱头ANDY 发表于 2016-8-26 11:45
用定时器测速 可能精度会高一点

你好,我是初学的,麻烦大神能不能把电机驱动部分去掉只剩下测速部分,我最近在学习编写测速程序,想学习一下。拜托拜托
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-13 20:38 , Processed in 0.040602 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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