highplay86 发表于 2012-10-19 17:35:46

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

本帖最后由 highplay86 于 2012-10-19 17:45 编辑

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


#ifndef Movetable_h
#define Movetable_h

class Movetable
{
        private:
        int _stepper1A1pin;
        int _stepper1A2pin;
        int _stepper1B1pin;
        int _stepper1B2pin;
        int _stepper2A1pin;
        int _stepper2A2pin;
        int _stepper2B1pin;
        int _stepper2B2pin;
       
        public:
        Movetable(int _stepper1A1pin,int _stepper1A2pin,int _stepper1B1pin,int _stepper1B2pin,
                int _stepper2A1pin,int _stepper2A2pin,int _stepper2B1pin,int _stepper2B2pin);
        void setSpeed(float _speed);
        void left_Rotate(float _speed);
        void right_Rotate(float _speed);
        void up_Rotate(float _speed);
        void down_Rotate(float _speed);
        void left_up_Rotate(float _speed);
        void left_down_Rotate(float _speed);
        void right_up_Rotate(float _speed);
        void right_down_Rotate(float _speed);
        void stop();
       
};

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

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

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


Movetable::Movetable(int _step1A1pin,int _step1A2pin,int _step1B1pin,int _step1B2pin,
                     int _step2A1pin,int _step2A2pin,int _step2B1pin,int _step2B2pin)
{
        _stepper1A1pin=_step1A1pin;
        _stepper1A2pin=_step1A2pin;
        _stepper1B1pin=_step1B1pin;
        _stepper1B2pin=_step1B2pin;
        _stepper2A1pin=_step2A1pin;
        _stepper2A2pin=_step2A2pin;
        _stepper2B1pin=_step2B1pin;
        _stepper2B2pin=_step2B2pin;

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

}
void Movetable::setSpeed(float _speed)
{
        Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
        Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
       
        stepper1.setSpeed(_speed);
        stepper2.setSpeed(_speed);
}
void Movetable::left_Rotate(float _speed)
{
        Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
        Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
       
        stepper1.step(100);
        delay(2);
        stepper1.setSpeed(300-(_speed/521)*300);
}
void Movetable::right_Rotate(float _speed)
{
        Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
        Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
       
        stepper1.step(-100);
        delay(2);
        stepper1.setSpeed(300-(_speed/521)*300);
}
void Movetable::up_Rotate(float _speed)
{
        Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
        Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
       
        stepper2.step(100);
        delay(2);
        stepper2.setSpeed(300-(_speed/521)*300);
}
void Movetable::down_Rotate(float _speed)
{
        Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
        Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
       
        stepper2.step(-100);
        delay(2);
        stepper2.setSpeed(300-(_speed/521)*300);
}
void Movetable::left_up_Rotate(float _speed)
{
        Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
        Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
       
        stepper1.step(100);
        delay(1);
        stepper1.setSpeed(300-(_speed/521)*300);
        stepper2.step(100);
        delay(1);
        stepper2.setSpeed(300-(_speed/521)*300);
}
void Movetable::left_down_Rotate(float _speed)
{
        Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
        Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
       
        stepper1.step(100);
        delay(1);
        stepper1.setSpeed(300-(_speed/521)*300);
        stepper2.step(-100);
        delay(1);
        stepper2.setSpeed(((_speed-521)/521)*300);
}
void Movetable::right_up_Rotate(float _speed)
{
        Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
        Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
       
        stepper1.step(-100);
        delay(1);
        stepper1.setSpeed(((_speed-521)/521)*300);
        stepper2.step(100);
        delay(1);
        stepper2.setSpeed(300-(_speed/521)*300);
}
void Movetable::right_down_Rotate(float _speed)
{
        Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
        Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
       
        stepper1.step(-100);
        delay(1);
        stepper1.setSpeed(((_speed-521)/521)*300);
        stepper2.step(-100);
        delay(1);
        stepper2.setSpeed(((_speed-521)/521)*300);
}
void Movetable::stop()
{
        Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
        Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
       
        stepper1.step(0);
        stepper2.step(0);


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

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

#include <Stepper.h>

#include <Movetable.h>

int xpotPin = 0;//设置模拟口0为X的信号输入端口
int ypotPin = 1;//设置模拟口1为Y的信号输入端口
int xval=0;    //设置变量
int yval=0;
long value=0;
float val;
// attached to设置步进电机的步数和引脚
Movetable movetable(2,3,4,5,8,9,10,11);

void setup()
{
    Serial.begin(9600);//设置波特率为9600
    movetable.setSpeed(300);
}
void loop ()
{
      xval = analogRead(xpotPin);   //xval变量为从0信号口读取到的数值
      yval = analogRead(ypotPin);   //yval变量为从1信号口读取到的数值
      Serial.print(xval);//显示xval 变量数值
      Serial.print("   and   ");
      Serial.println(yval);//显示yval 变量数值
      delay(200);
      
      movetable.right_Rotate(2);
      
      movetable.left_Rotate(2);
      
      movetable.up_Rotate(2);
      
      movetable.down_Rotate(2);

      // 获取传感器读数

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

如下是测试视频:
http://v.youku.com/v_show/id_XNDY0MDExMzU2.html



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

#include <Movetable.h>

int xpotPin = 0;//设置模拟口0为X的信号输入端口
int ypotPin = 1;//设置模拟口1为Y的信号输入端口
int xval=0;    //设置变量
int yval=0;
long value=0;
float val;
// attached to设置步进电机的步数和引脚
Movetable movetable(2,3,4,5,8,9,10,11);

void setup()
{
    Serial.begin(9600);//设置波特率为9600
    movetable.setSpeed(300);
}
void loop ()
{
      xval = analogRead(xpotPin);   //xval变量为从0信号口读取到的数值
      yval = analogRead(ypotPin);   //yval变量为从1信号口读取到的数值
      Serial.print(xval);//显示xval 变量数值
      Serial.print("   and   ");
      Serial.println(yval);//显示yval 变量数值
      delay(200);
      
      movetable.right_Rotate(2);
      
      movetable.left_Rotate(2);

      // 获取传感器读数

}

测试视频如下:
http://v.youku.com/v_show/id_XNDY0MDExNzI0.html


我检查了库文件好久了,实在是没发现哪不对劲的...求解......
页: [1]
查看完整版本: 关于自己写的一个两轴步进电机云台的库函数,求助...