ec

Dependents:   F3RC

Fork of EC by ROBOSTEP_LIBRARY

Revision:
0:20fc96400ca3
Child:
5:4abba4f54406
--- /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;
+}
+