ec
Fork of EC by
Diff: EC.cpp
- Revision:
- 0:20fc96400ca3
- Child:
- 5:4abba4f54406
diff -r 000000000000 -r 20fc96400ca3 EC.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EC.cpp Thu Jun 16 07:36:15 2016 +0000 @@ -0,0 +1,86 @@ +#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; +} +