MotorDriverのクラス

Dependencies:  

Dependents:   MotorDriveDEBUG

MotorClass.cpp

Committer:
kikoaac
Date:
2015-08-18
Revision:
0:842f92dcf668

File content as of revision 0:842f92dcf668:

#include "mbed.h"
#include "QEI.h"
#include "MotorClass.h"
MotorClass::MotorClass(I2C& _i2c ,QEI& _qei) : i2c(_i2c),wheel(_qei)
{
    Action=0;
    interval = 0.09;
    AngOrSpe = -1;
    //if(wheel.A == 1);
}
/*MotorClass::MotorClass(I2C& _i2c,char add) : i2c(_i2c)
{
    addr = add;
}*/

bool MotorClass::SetRate(char rate)
{
    return OutputOneData(PulsePerAngle,rate);
}
bool MotorClass::Setup(char action)
{
    
    if(action==3||action==2)AngOrSpe=0;
    else if(action==5||action==4)AngOrSpe=1;
    else AngOrSpe=-1;
    Action = action;
    return OutputOneData(MotorMode, action );
}
bool MotorClass::Motor_PWM(float pwm)
{
    PWM = pwm;
    short pwm_ = pwm*0xffff;    
    char data[2] = {pwm_&0xff,pwm_>>8};
    return OutputSomeData(MotorPWML,data,2);
}
bool MotorClass::Motor(char state,float pwm)
{
    static short prev_state;
    PWM = pwm;
    short pwm_ = pwm*0xffff;
    if(state == prev_state)
    {
        char data[2] = {pwm_&0xff,pwm_>>8};        
        return OutputSomeData(MotorPWML,data,2);
    }
    else 
    {
        char data[3] = {state,pwm_&0xff,pwm_>>8};
        prev_state=state;
        return OutputSomeData(MotorState,data,3);
    }
}
bool MotorClass::SetP(float p)
{
    char P = char(p*10);
    return OutputOneData(MotorP, P );
}
bool MotorClass::SetI(float i)
{
    char I = char(i*10);
    return OutputOneData(MotorI, I );
}
bool MotorClass::SetD(float d)
{
    char D = char(d*10);    
    return OutputOneData(MotorD, D );
}
bool MotorClass::SetPID(float *pid)
{
    char Pid[3] = {pid[0]*10,pid[1]*10,pid[2]*10};
    return OutputSomeData(MotorP, Pid,3 );
}
bool MotorClass::SetTarget(short tar)
{
    target=tar;
    char data[2]={target&0xff,target>>8};
    char reg[2] ={TargetAngleL ,TargetSpeedL };
    return OutputSomeData(reg[AngOrSpe],data,2);
}
void MotorClass::StartQEIPut()
{
    QeiInt.detach();
    QeiInt.attach(this,&MotorClass::attach,interval);
}
void MotorClass::StopQEIPut()
{
    AngOrSpe = -1;
    QeiInt.detach();
}
void  MotorClass::QEIAllSetup(short tar,float *pid)
{
    SetPID(pid);
    SetTarget(tar);
    StartQEIPut();
    SetRate(1);
}

char MotorClass::GetAddress()
{
     return InputOneData(ADDRESS);
}
void MotorClass::UseAddress(char ad)
{
    addr = ad;
}
char MotorClass::SetAddress(char ad)
{
    char address = addr =ad;
    char data=0;
    /*do{
    //data = InputOneData(0x3b);
    wait(0.1);
    }while(data==255);*/
    char adD[2] = {data,address};
    while(i2c.write(0x00,adD,2))wait(0.001);;
    
        printf("%d,", data);
        wait(0.5);
    data = InputOneData(0x3a);
    addr = address;
        printf("%d\n", data);
        wait(1.1);
    return data;
}

void MotorClass::GetDebugData(float *data,int mode)
{
    float rate[3]={1,1,1};
    switch(mode)
    {
        case 0 :return;
        case 1 :rate[1]=1000;break;
        case 2 :rate[0]*=100,rate[1]*=100,rate[2]*=100;break;
        case 3 :;
        case 4 :rate[0]*=100,rate[1]*=100,rate[2]*=1000;break;
        case 5 :rate[0]*=100,rate[1]*=100,rate[2]*=1000;break;
    }
    char input[6];
    InputSomeData(0x70,input,6);
    data[0]=short((input[0]<<8)|input[1])/rate[0];
    data[1]=short((input[2]<<8)|input[3])/rate[1];
    data[2]=short((input[4]<<8)|input[5])/rate[2];
    
    
}