极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10261|回复: 0

关于自己写的一个两轴步进电机云台的库函数,求助...

[复制链接]
发表于 2012-10-19 17:35:46 | 显示全部楼层 |阅读模式
本帖最后由 highplay86 于 2012-10-19 17:45 编辑

最近在搞一个履带机器人,上面需要用到一个两轴的步进电机云台,为了编写程序更快捷高效,于是花时间自己写了一个专门驱动这个云台的库函数...其实原理简单的不能再简单....
就是写一个库函数,打包同时控制两个步进电机的函数调用,具体的代码如下...


  1. #ifndef Movetable_h
  2. #define Movetable_h

  3. class Movetable
  4. {
  5.         private:
  6.         int _stepper1A1pin;
  7.         int _stepper1A2pin;
  8.         int _stepper1B1pin;
  9.         int _stepper1B2pin;
  10.         int _stepper2A1pin;
  11.         int _stepper2A2pin;
  12.         int _stepper2B1pin;
  13.         int _stepper2B2pin;
  14.        
  15.         public:
  16.         Movetable(int _stepper1A1pin,int _stepper1A2pin,int _stepper1B1pin,int _stepper1B2pin,
  17.                   int _stepper2A1pin,int _stepper2A2pin,int _stepper2B1pin,int _stepper2B2pin);
  18.         void setSpeed(float _speed);
  19.         void left_Rotate(float _speed);
  20.         void right_Rotate(float _speed);
  21.         void up_Rotate(float _speed);
  22.         void down_Rotate(float _speed);
  23.         void left_up_Rotate(float _speed);
  24.         void left_down_Rotate(float _speed);
  25.         void right_up_Rotate(float _speed);
  26.         void right_down_Rotate(float _speed);
  27.         void stop();
  28.        
  29. };
复制代码

以上是定义的库函数的头文件说明

以下是库函数主体:
  1. /**************************************************
  2. 两轴步进电机云台驱动库函数
  3. 编写人:highplay86
  4. 时间:2012/10/17

  5. ***************************************************/
  6. #include "Arduino.h"
  7. #include "Movetable.h"
  8. #include "Stepper.h"
  9. #define STEPS 100  // 这里设置步进电机旋转一圈是多少步


  10. Movetable::Movetable(int _step1A1pin,int _step1A2pin,int _step1B1pin,int _step1B2pin,
  11.                      int _step2A1pin,int _step2A2pin,int _step2B1pin,int _step2B2pin)
  12. {
  13.         _stepper1A1pin=_step1A1pin;
  14.         _stepper1A2pin=_step1A2pin;
  15.         _stepper1B1pin=_step1B1pin;
  16.         _stepper1B2pin=_step1B2pin;
  17.         _stepper2A1pin=_step2A1pin;
  18.         _stepper2A2pin=_step2A2pin;
  19.         _stepper2B1pin=_step2B1pin;
  20.         _stepper2B2pin=_step2B2pin;

  21.         Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
  22.         Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);

  23. }
  24. void Movetable::setSpeed(float _speed)
  25. {
  26.         Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
  27.         Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
  28.        
  29.         stepper1.setSpeed(_speed);
  30.         stepper2.setSpeed(_speed);
  31. }
  32. void Movetable::left_Rotate(float _speed)
  33. {
  34.         Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
  35.         Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
  36.        
  37.         stepper1.step(100);
  38.         delay(2);
  39.         stepper1.setSpeed(300-(_speed/521)*300);
  40. }
  41. void Movetable::right_Rotate(float _speed)
  42. {
  43.         Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
  44.         Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
  45.        
  46.         stepper1.step(-100);
  47.         delay(2);
  48.         stepper1.setSpeed(300-(_speed/521)*300);
  49. }
  50. void Movetable::up_Rotate(float _speed)
  51. {
  52.         Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
  53.         Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
  54.        
  55.         stepper2.step(100);
  56.         delay(2);
  57.         stepper2.setSpeed(300-(_speed/521)*300);
  58. }
  59. void Movetable::down_Rotate(float _speed)
  60. {
  61.         Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
  62.         Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
  63.        
  64.         stepper2.step(-100);
  65.         delay(2);
  66.         stepper2.setSpeed(300-(_speed/521)*300);
  67. }
  68. void Movetable::left_up_Rotate(float _speed)
  69. {
  70.         Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
  71.         Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
  72.        
  73.         stepper1.step(100);
  74.         delay(1);
  75.         stepper1.setSpeed(300-(_speed/521)*300);
  76.         stepper2.step(100);
  77.         delay(1);
  78.         stepper2.setSpeed(300-(_speed/521)*300);
  79. }
  80. void Movetable::left_down_Rotate(float _speed)
  81. {
  82.         Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
  83.         Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
  84.        
  85.         stepper1.step(100);
  86.         delay(1);
  87.         stepper1.setSpeed(300-(_speed/521)*300);
  88.         stepper2.step(-100);
  89.         delay(1);
  90.         stepper2.setSpeed(((_speed-521)/521)*300);
  91. }
  92. void Movetable::right_up_Rotate(float _speed)
  93. {
  94.         Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
  95.         Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
  96.        
  97.         stepper1.step(-100);
  98.         delay(1);
  99.         stepper1.setSpeed(((_speed-521)/521)*300);
  100.         stepper2.step(100);
  101.         delay(1);
  102.         stepper2.setSpeed(300-(_speed/521)*300);
  103. }
  104. void Movetable::right_down_Rotate(float _speed)
  105. {
  106.         Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
  107.         Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
  108.        
  109.         stepper1.step(-100);
  110.         delay(1);
  111.         stepper1.setSpeed(((_speed-521)/521)*300);
  112.         stepper2.step(-100);
  113.         delay(1);
  114.         stepper2.setSpeed(((_speed-521)/521)*300);
  115. }
  116. void Movetable::stop()
  117. {
  118.         Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
  119.         Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
  120.        
  121.         stepper1.step(0);
  122.         stepper2.step(0);
复制代码



修改了好多次...到上面这个版本...终于能够驱动一个步进电机了...不过问题就是,只能驱动一个步进电机,另一个就是不动...
测试过后发现是程序的问题,库函数主体程序中Stepper1控制的那个通道控制正常...Stepper2控制就不正常...

下方是写的一个测试这个库的测试程序:

  1. #include <Stepper.h>

  2. #include <Movetable.h>

  3.   int xpotPin = 0;  //设置模拟口0为X的信号输入端口
  4.   int ypotPin = 1;  //设置模拟口1为Y的信号输入端口
  5.   int xval=0;    //设置变量
  6.   int yval=0;
  7.   long value=0;
  8.   float val;
  9.   // attached to设置步进电机的步数和引脚
  10.   Movetable movetable(2,3,4,5,8,9,10,11);
  11.   
  12.   void setup()
  13.   {
  14.     Serial.begin(9600);//设置波特率为9600
  15.     movetable.setSpeed(300);
  16.   }
  17.   void loop ()
  18.   {
  19.         xval = analogRead(xpotPin);   //xval变量为从0信号口读取到的数值
  20.         yval = analogRead(ypotPin);   //yval变量为从1信号口读取到的数值
  21.         Serial.print(xval);//显示xval 变量数值
  22.         Serial.print("   and   ");
  23.         Serial.println(yval);//显示yval 变量数值
  24.         delay(200);
  25.         
  26.         movetable.right_Rotate(2);
  27.         
  28.         movetable.left_Rotate(2);
  29.         
  30.         movetable.up_Rotate(2);
  31.         
  32.         movetable.down_Rotate(2);

  33.         // 获取传感器读数
复制代码


程序中的X,Y是一个PS2摇杆,串口打印函数仅仅是为了判断程序有无在执行Loop循环...我发现只要写进了Stepper2通道的执行程序,Loop函数就只执行一次...

如下是测试视频:




如果把测试代码中最后两行Stepper2的去掉,驱动就正常了...
  1. #include <Stepper.h>

  2. #include <Movetable.h>

  3.   int xpotPin = 0;  //设置模拟口0为X的信号输入端口
  4.   int ypotPin = 1;  //设置模拟口1为Y的信号输入端口
  5.   int xval=0;    //设置变量
  6.   int yval=0;
  7.   long value=0;
  8.   float val;
  9.   // attached to设置步进电机的步数和引脚
  10.   Movetable movetable(2,3,4,5,8,9,10,11);
  11.   
  12.   void setup()
  13.   {
  14.     Serial.begin(9600);//设置波特率为9600
  15.     movetable.setSpeed(300);
  16.   }
  17.   void loop ()
  18.   {
  19.         xval = analogRead(xpotPin);   //xval变量为从0信号口读取到的数值
  20.         yval = analogRead(ypotPin);   //yval变量为从1信号口读取到的数值
  21.         Serial.print(xval);//显示xval 变量数值
  22.         Serial.print("   and   ");
  23.         Serial.println(yval);//显示yval 变量数值
  24.         delay(200);
  25.         
  26.         movetable.right_Rotate(2);
  27.         
  28.         movetable.left_Rotate(2);

  29.         // 获取传感器读数

  30.   }
复制代码


测试视频如下:



我检查了库文件好久了,实在是没发现哪不对劲的...求解......
回复

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-5 07:11 , Processed in 0.039921 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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