改良版(仮)

Dependents:   harurobo1006 harurobo_1026

Fork of EC by ROBOSTEP_LIBRARY

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers EC.h Source File

EC.h

00001 #ifndef __INCLUDED_EC_H_
00002 #define __INCLUDED_EC_H_
00003 
00004 #ifndef M_pi
00005 #define M_pi 3.141592
00006 #endif
00007 /**@class Ec
00008 @brief increment型encoder用class.
00009 Z相(1周につき1回立ち上がる)の機能あり.
00010 普通に使う分には不必要な機能ですが、回転回数が欲しい場合や、回転が非常に早い物の回転速度が欲しい場合などで
00011 A,B相での処理だとマイコンが追いつかない場合などに使ってください
00012 */
00013 class Ec
00014 {
00015 protected:
00016     int S;  //A相B相のパターン(1~4)
00017     bool stateA,stateB; //A・B相の状態
00018     int count;  //カウント数 分解能分で一周
00019     int pre_count;  //一つ前のカウント
00020     double precount;    //4倍精度カウント
00021     int solution;   //分解能
00022     double dt;  //角速度の計算間隔
00023     double distance_mm_;//距離[mm]
00024     double diameter_mm_;//測定輪半径
00025     double count_to_distance_mm_;//カウントを距離に変換する係数
00026     double gear_rate_;//ギア比(エンコーダタイムプーリー/測定輪タイムプーリー)
00027     int is_diameter_set;//diameterがセットされていたら1
00028     //z相用
00029     bool first;
00030     int rev;
00031     double now_time,old_time;
00032     double RPM,RPM_old;
00033     int RPM_th;
00034 
00035     InterruptIn signalA_;
00036     InterruptIn signalB_;
00037     InterruptIn signalZ_;
00038 
00039     void upA();
00040     void downA();
00041     void upB();
00042     void downB();
00043     void upZ();
00044     void downZ();
00045     void setCountToDistance_mm();//countからdistanceに変換する係数を計算する。
00046 public:
00047     double omega;   //角速度
00048     /** コンストラクタの定義
00049      *
00050      *  ***Z相の機能を追加したことで引数が増えました!!!!***
00051      *
00052      *  main関数の前に必ず一度宣言する
00053      *
00054      *  使うエンコーダの数だけ設定する必要がある
00055      *
00056      *  @param signalA エンコーダA相のピン名
00057      *  @param signalB エンコーダB相のピン名
00058      *  @param signalZ エンコーダZ相のピン名
00059      *  @param s エンコーダの分解能(省略可)
00060      *  @param t 角速度計算の間隔(省略可)
00061      */
00062     /** @section CAUTION
00063      *  今まで以下のように定義していたものは
00064      *  @code
00065      *  #include "mbed.h"
00066      *  #include "EC.h"
00067      *
00068      *  Ec Ec1(PA_0,PA_1,1024,0.05);
00069      *  @endcode
00070      *  次のようにZ相の引数の部分に、NCと入れれば今までの様に使える
00071      *  @code
00072      *  #include "mbed.h"
00073      *  #include "EC.h"
00074      *
00075      *  Ec Ec1(PA_0,PA_1,NC,1024,0.05);
00076      *  @endcode
00077      */
00078     Ec(PinName signalA,PinName signalB,PinName signalZ,int s,double t);
00079 
00080     ///countの値を返す関数(int型)
00081     int getCount();
00082 
00083     /** omega(角速度 rad/s)の値を計算する関数
00084     * @section CAUTION
00085      *  CalOmega関数は、一定時間ごと(dtごと)に計算される必要があるので、main関数内でタイマー割り込みを設定する必要がある。
00086      *  @code
00087      *  #include "mbed.h"
00088      *  #include "EC.h"        //ライブラリをインクルード
00089      *
00090      *  Ec Ec1(PA_0,PA_1,NC,1024,0.05); //分解能1024、計算間隔0.05秒に設定、Z相は使わない
00091      *  Ticker ticker;
00092      *  DigitalIn button(USER_BUTTON);
00093      *  Serial pc(USBTX,USBRX);
00094      *
00095      *  void calOmega(){
00096      *      Ec1.CalOmega();
00097      *  }
00098      *
00099      *  int main(){
00100      *      ticker.attach(&calOmega,0.05); //0.05秒間隔で角速度を計算
00101      *     while(1){
00102      *          pc.printf(" count1=%d ",Ec1.getCount());
00103      *          pc.printf(" omega1=%f\r\n ",Ec1.getOmega());
00104      *          if(pc.readable()) {
00105      *              char sel=pc.getc();
00106      *              if(sel=='r') Ec1.reset(); //rを押したらリセット
00107      *          }
00108      *      }
00109      *  }
00110      * @endcode
00111      */
00112     void CalOmega();
00113 
00114     ///omega(角速度 rad/s)の値を返す関数(double型)
00115     double getOmega();
00116     ///四倍精度のcountの値を返す関数(double型)
00117     double getPreCount();
00118     ///エンコーダを初期状態に戻す関数 countやomegaの値を0にする
00119     virtual void reset();
00120     ///角速度計算の間隔dtを決めることができる(デフォルトは0.05秒)
00121     void setTime(double t);
00122     ///(Z相を使用する場合)回転回数を返す関数(int型)
00123     int getRev();
00124 
00125     ///(Z相を使用する場合)回転速度(rpm)の値を返す関数(double型)
00126     /** @section SAMPLE
00127      *  z相を使う場合のプログラムの例
00128      *  @code
00129      *  #include "mbed.h"
00130      *  #include "EC.h"        //ライブラリをインクルード
00131      *
00132      *  Ec Ec1(NC,NC,PA_0,1024,0.05); //A相B相が不必要な場合も、このようにNCと入れればよい
00133      *  DigitalIn button(USER_BUTTON);
00134      *  Serial pc(USBTX,USBRX);
00135      *
00136      *  int main(){
00137      *     while(1){
00138      *          pc.printf(" rev1=%d ",Ec1.getRev());
00139      *          pc.printf(" rpm1=%f\r\n ",Ec1.getRPM());
00140      *          if(!button) Ec1.reset();     //USERボタンを押したらリセット
00141      *      }
00142      *  }
00143      * @endcode
00144      */
00145     double getRPM();
00146     void changeRPM_th(int th);
00147 
00148     /** @caution 先にsetDiameter_mmをしないと正しい値とならない
00149     @return 現在距離.
00150     @code
00151 #include <mbed.h>
00152 #include "EC.h"
00153 Ec ec(PB_5, PB_4, NC, 500, 0.5);
00154 int main()
00155 {
00156     ec.setDiameter_mm(48);
00157     while(1) {
00158         printf("%f\r\n", ec.getDistance_mm());
00159         wait(0.1);
00160     }
00161 }
00162 @endcode
00163     */
00164     double getDistance_mm();
00165 
00166     /** @param diameter_mm 測定輪半径
00167     */
00168     void setDiameter_mm (double diameter_mm);
00169     /** @param gear比(エンコーダタイムプーリー/測定輪タイムプーリー)
00170     */
00171     void setGearRate (double gear_rate);
00172     static double deftime;//角速度計算の間隔
00173     static int defsolution;//エンコーダの分解能のデフォルト値
00174     Timer timer;
00175 };
00176 
00177 
00178 #endif