自分用QEI

Dependents:   FourOmniMecha

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

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

Committer:
ttrist
Date:
Mon Apr 13 05:57:14 2020 +0000
Revision:
4:13f78735242e
Parent:
3:4f69bb55ab4a
Child:
5:01e1a1dfbd5e
Rename : pulsecount -> countpulse; Remodel : (exsample) "pulsecount"  is remodeled to "pulsecount2 ".; ; remodeled function name are likely  "fancname2".

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ttrist 0:47508ccc086b 1 #ifndef QEI_H
ttrist 0:47508ccc086b 2 #define QEI_H
ttrist 2:98811a31580a 3
ttrist 0:47508ccc086b 4 #include "mbed.h"
ttrist 2:98811a31580a 5
ttrist 2:98811a31580a 6
ttrist 0:47508ccc086b 7 class QEI
ttrist 0:47508ccc086b 8 {
ttrist 0:47508ccc086b 9 public:
ttrist 2:98811a31580a 10 //引数は(A相のピン,B相のピン,1回転のパルスPPR,timerインスタンス,tickerインスタンス)
ttrist 0:47508ccc086b 11 QEI(PinName A,PinName B,int PPR,Timer *timer,Ticker *ticker);
ttrist 4:13f78735242e 12
ttrist 2:98811a31580a 13 //初期設定
ttrist 0:47508ccc086b 14 void init();
ttrist 4:13f78735242e 15
ttrist 2:98811a31580a 16 //MoveAve_pulse_to_RPSを使う場合に記述.3333usごとの割り込み
ttrist 0:47508ccc086b 17 void useAvePRS();
ttrist 4:13f78735242e 18
ttrist 2:98811a31580a 19 //パルスカウント
ttrist 4:13f78735242e 20 void PulseCount();
ttrist 4:13f78735242e 21
ttrist 2:98811a31580a 22 //移動平均とるだけ
ttrist 2:98811a31580a 23 void MoveAve_pulse();
ttrist 4:13f78735242e 24
ttrist 2:98811a31580a 25 //移動平均を使ったRPS算出
ttrist 0:47508ccc086b 26 void MoveAve_pulse_to_RPS();
ttrist 4:13f78735242e 27
ttrist 2:98811a31580a 28 //MoveAve_pulse_to_RPSで出したRPS値を返す
ttrist 1:2b1d4925ea1c 29 double getRPS();
ttrist 4:13f78735242e 30
ttrist 2:98811a31580a 31 //オドメトリ用関数
ttrist 2:98811a31580a 32 double Odometry(double WheelDia);
ttrist 4:13f78735242e 33
ttrist 2:98811a31580a 34 //返し値を反転させることができる
ttrist 0:47508ccc086b 35 void rotReverce();
ttrist 0:47508ccc086b 36
ttrist 4:13f78735242e 37 //パルスの確認
ttrist 4:13f78735242e 38 int returnPulse();
ttrist 4:13f78735242e 39
ttrist 4:13f78735242e 40 //********************処理をもっと頭良さげにしたものが2********************
ttrist 4:13f78735242e 41 //*********************違いはコメントアウトで説明*************************
ttrist 4:13f78735242e 42 void useAvePRS2();//をタイマー割り込みで使用
ttrist 4:13f78735242e 43
ttrist 4:13f78735242e 44 void PulseCount2();//エンコーダの表を参照するようになった
ttrist 4:13f78735242e 45
ttrist 4:13f78735242e 46 void rotReverce2();//表自体を反転させることで正転方向を変更する
ttrist 4:13f78735242e 47
ttrist 4:13f78735242e 48 void MoveAve_pulse_to_RPS2();//表を参照した移動平均とrps.多分こっちのが処理少し軽い
ttrist 4:13f78735242e 49
ttrist 4:13f78735242e 50 double getRPS2();//MoveAve_pulse_to_RPS2で出したRPS値を返す
ttrist 4:13f78735242e 51
ttrist 4:13f78735242e 52 double Odometry2(double WheelDia);//オドメトリ用関数2
ttrist 4:13f78735242e 53
ttrist 4:13f78735242e 54
ttrist 0:47508ccc086b 55 private:
ttrist 0:47508ccc086b 56 InterruptIn chA;
ttrist 0:47508ccc086b 57 InterruptIn chB;
ttrist 0:47508ccc086b 58 Timer *_timer;
ttrist 0:47508ccc086b 59 Ticker *_ticker;
ttrist 0:47508ccc086b 60 int _PPR;
ttrist 1:2b1d4925ea1c 61 double current_rps;
ttrist 0:47508ccc086b 62 uint8_t pre_ABstate;
ttrist 0:47508ccc086b 63 const int data_sizeof = 30;
ttrist 0:47508ccc086b 64 int pulse,pulseData[data_sizeof];
ttrist 1:2b1d4925ea1c 65 double pulseAve;
ttrist 1:2b1d4925ea1c 66 double rps;
ttrist 0:47508ccc086b 67 int8_t NrotDIR;
ttrist 3:4f69bb55ab4a 68 double pre_time; //修正1:関数内staticからグローバルへ
ttrist 0:47508ccc086b 69 };
ttrist 0:47508ccc086b 70
ttrist 0:47508ccc086b 71 #endif