自分用QEI
エンコーダの回転方向はデフォの状態の反対を正としたいならrotReverce()を呼び出すと反対になる.
22020/3/6 移動平均を使ってパルスを平滑化し,RPSを算出している. useAvePRS()を書くことで,エンコーダのパルスを時間平均しそのままRPSを算出する関数MoveAve_pulse_to_RPS()がタイマー割り込みで呼び出される.移動平均を使うことでエンコーダのパルスのばらつきを無くし,平均をとらないとガタガタになるRPSがそこそこ綺麗になる.3000usごとの割り込み.この時間が長いほど精度は高い.あとclass内で配列の格納数をconst int で定義しているため黄色いエラーが出るけど無視. この方法でとったRPSの呼び出しはgetRPS()を使う.
QEI.h
- Committer:
- ttrist
- Date:
- 2020-03-20
- Revision:
- 3:4f69bb55ab4a
- Parent:
- 2:98811a31580a
- Child:
- 4:13f78735242e
File content as of revision 3:4f69bb55ab4a:
#ifndef QEI_H #define QEI_H #include "mbed.h" class QEI { public: //引数は(A相のピン,B相のピン,1回転のパルスPPR,timerインスタンス,tickerインスタンス) QEI(PinName A,PinName B,int PPR,Timer *timer,Ticker *ticker); //初期設定 void init(); //MoveAve_pulse_to_RPSを使う場合に記述.3333usごとの割り込み void useAvePRS(); //パルスカウント void CountPulse(); //移動平均とるだけ void MoveAve_pulse(); //移動平均を使ったRPS算出 void MoveAve_pulse_to_RPS(); //MoveAve_pulse_to_RPSで出したRPS値を返す double getRPS(); //オドメトリ用関数 double Odometry(double WheelDia); //返し値を反転させることができる void rotReverce(); private: InterruptIn chA; InterruptIn chB; Timer *_timer; Ticker *_ticker; int _PPR; double current_rps; uint8_t pre_ABstate; const int data_sizeof = 30; int pulse,pulseData[data_sizeof]; double pulseAve; double rps; int8_t NrotDIR; double pre_time; //修正1:関数内staticからグローバルへ }; #endif