自分用QEI

Dependents:   FourOmniMecha

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

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

Revision:
5:01e1a1dfbd5e
Parent:
4:13f78735242e
--- 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ごと