自分用QEI

Dependents:   FourOmniMecha

エンコーダの回転方向はデフォの状態の反対を正としたいならrotReverce()を呼び出すと反対になる.

22020/3/6 移動平均を使ってパルスを平滑化し,RPSを算出している. useAvePRS()を書くことで,エンコーダのパルスを時間平均しそのままRPSを算出する関数MoveAve_pulse_to_RPS()がタイマー割り込みで呼び出される.移動平均を使うことでエンコーダのパルスのばらつきを無くし,平均をとらないとガタガタになるRPSがそこそこ綺麗になる.3000usごとの割り込み.この時間が長いほど精度は高い.あとclass内で配列の格納数をconst int で定義しているため黄色いエラーが出るけど無視. この方法でとったRPSの呼び出しはgetRPS()を使う.

Files at this revision

API Documentation at this revision

Comitter:
ttrist
Date:
Mon Apr 13 06:10:36 2020 +0000
Parent:
4:13f78735242e
Commit message:
fix : method of defining ABstate_Table

Changed in this revision

QEI.cpp Show annotated file Show diff for this revision Revisions of this file
QEI.h Show annotated file Show diff for this revision Revisions of this file
diff -r 13f78735242e -r 01e1a1dfbd5e QEI.cpp
--- a/QEI.cpp	Mon Apr 13 05:57:14 2020 +0000
+++ b/QEI.cpp	Mon Apr 13 06:10:36 2020 +0000
@@ -1,6 +1,5 @@
 #include "QEI.h"
 #define PI 3.141592653589793
-int ABstate_Table[15] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1};
 
 QEI::QEI(PinName A,PinName B,int PPR,Timer *timer,Ticker *ticker):chA(A),chB(B)
 {
@@ -15,6 +14,7 @@
 {
     for(int i =0; i<data_sizeof; i++) pulseData[i] = 0;
     NrotDIR = 1;
+    Setting_ABstate_Table();
 
     chA.rise(this,&QEI::PulseCount);
     chA.fall(this,&QEI::PulseCount);
@@ -25,6 +25,15 @@
     _timer -> start();
 }
 
+void QEI::Setting_ABstate_Table()
+{
+    for(int i =0; i<15; i++) {
+        if     (i == 0b1101 || i == 0b0100 || i == 0b0010 || i == 0b1011) ABstate_Table[i] =  1;
+        else if(i == 0b1110 || i == 0b0111 || i == 0b0001 || i == 0b1000) ABstate_Table[i] = -1;
+        else                                                              ABstate_Table[i] =  0;
+    }
+}
+
 void QEI::useAvePRS()
 {
     _ticker -> attach_us(this,&QEI::MoveAve_pulse_to_RPS,3000); //3000usごと
diff -r 13f78735242e -r 01e1a1dfbd5e QEI.h
--- a/QEI.h	Mon Apr 13 05:57:14 2020 +0000
+++ b/QEI.h	Mon Apr 13 06:10:36 2020 +0000
@@ -12,6 +12,8 @@
 
     //初期設定
     void init();
+    
+    void Setting_ABstate_Table();//エンコーダの参照表に代入
 
     //MoveAve_pulse_to_RPSを使う場合に記述.3333usごとの割り込み
     void useAvePRS();
@@ -66,6 +68,7 @@
     double rps;
     int8_t NrotDIR;
     double pre_time;   //修正1:関数内staticからグローバルへ
+    int ABstate_Table[15];
 };
 
 #endif
\ No newline at end of file