自分用QEI
エンコーダの回転方向はデフォの状態の反対を正としたいならrotReverce()を呼び出すと反対になる.
22020/3/6 移動平均を使ってパルスを平滑化し,RPSを算出している. useAvePRS()を書くことで,エンコーダのパルスを時間平均しそのままRPSを算出する関数MoveAve_pulse_to_RPS()がタイマー割り込みで呼び出される.移動平均を使うことでエンコーダのパルスのばらつきを無くし,平均をとらないとガタガタになるRPSがそこそこ綺麗になる.3000usごとの割り込み.この時間が長いほど精度は高い.あとclass内で配列の格納数をconst int で定義しているため黄色いエラーが出るけど無視. この方法でとったRPSの呼び出しはgetRPS()を使う.
Revision 5:01e1a1dfbd5e, committed 2020-04-13
- 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 |
--- 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ごと
--- 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