ec

Dependents:   F3RC

Fork of EC by ROBOSTEP_LIBRARY

EC.cpp

Committer:
jack0325suzu
Date:
2016-06-16
Revision:
0:20fc96400ca3
Child:
5:4abba4f54406

File content as of revision 0:20fc96400ca3:

#include "mbed.h"
#include "EC.h"

int Ec::defsolution;
double Ec::deftime;
//ピン変化割り込み関数の定義
void Ec::upA(){
    stateA=1;
    if(stateB==0&&S==0) {
        S=1;
    } else if(stateB==1&&S==3) {
        S=2;
    }
}
void Ec::downA(){
    stateA=0;
    if(stateB==1&&S==2) {
        S=3;
    } else if(stateB==0&&S==1) {
        S=0;
        count--;
    }
}
void Ec::upB(){
    stateB=1;
    if(stateA==1&&S==1) {
        S=2;
    } else if(stateA==0&&S==0) {
        S=3;
    }
}
void Ec::downB(){
    stateB=0;
    if(stateA==0&&S==3) {
        count++;
        S=0;
    } else if(stateA==1&&S==2) {
        S=1;
    }
}

//コンストラクタの定義
//main関数の前に必ず一度宣言する
//第一・第二引数はエンコーダのA・B相のピン名
//第三院数はエンコーダの分解能

Ec::Ec(PinName signalA,PinName signalB,int s=defsolution,double t=deftime)  :  signalA_(signalA),signalB_(signalB)
{
    S=0;stateA=0;stateB=0;count=0;pre_count=0.0;
    signalA_.rise(this,&Ec::upA);
    signalA_.fall(this,&Ec::downA);
    signalB_.rise(this,&Ec::upB);
    signalB_.fall(this,&Ec::downB);
    dt=t;
    solution=s;
    defsolution=s;
}

int Ec::getCount(){
    return count;
}

void Ec::CalOmega(){
    omega=(count-pre_count)*2*M_pi/(solution*dt);
    pre_count=count;
}

double Ec::getOmega(){
    return omega;
}

double Ec::getPreCount(){
    precount=count+S/4.0;
    return precount;
}
/*reset関数の定義*/
/*エンコーダを初期状態に戻すことができる*/
void Ec::reset(){
    S=0;stateA=0;stateB=0;count=0;pre_count=0.0,omega=0;
}
/*setTime関数の定義*/
/*自分で好きなように角速度計算の間隔を決めることができる(デフォルトは0.05秒)*/
void Ec::setTime(double t){
    dt=t;
}