ロボステ6期 / Encoder_

Dependents:   ball_snatch NHK2020-arm-sub NHK2020-arm-sub NHK2020-arm-sub2 ... more

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.14159265359f
00006 #endif
00007 
00008 /** @section SAMPLE
00009 * @code
00010 * //プログラム例
00011 * #include "mbed.h"
00012 * #include "EC.h"
00013 *
00014 * #define RESOLUTION 500
00015 * Ticker ticker;
00016 * Serial pc(USBTX,USBRX);
00017 *
00018 * //          (A層,B層,分解能)
00019 * Ec1multi EC(p7,p8,RESOLUTION);  //1逓倍用class
00020 * //            or
00021 * //Ec2multi EC(p7,p8,RESOLUTION);  //2逓倍用class
00022 * //            or
00023 * //Ec4multi EC(p7,p8,RESOLUTION);  //4逓倍用class
00024 * void calcOmega();
00025 *
00026 * int main()
00027 * {
00028 *     int count=0;
00029 *     double omega;
00030 *     ticker.attach(&calcOmega,0.05);
00031 * 
00032 *     while(1) {
00033 *         count=EC.getCount();
00034 *         omega=EC.getOmega();
00035 *         pc.printf("count=%d,",count);
00036 *         pc.printf("omega=%f\r\n",omega);
00037 *     }
00038 * }
00039 * void calcOmega()
00040 * {
00041 *     EC.calOmega();
00042 * }
00043 * @endcode
00044 */
00045 
00046 /**
00047 * @brief increment型エンコーダ用class
00048 * @details 1逓倍:Ec1multi
00049 * 2逓倍:Ec2multi
00050 * 4逓倍:Ec4multi
00051 **/
00052 class Ec
00053 {
00054 protected:
00055     int count_; //カウント数
00056     double omega_;  //角速度(rad/s)
00057     int pre_count_;  //一つ前のカウント
00058     int resolution_;   //分解能
00059     int multiplication_;
00060     double ptw_;
00061 
00062 public:
00063     /*コンストラクタの定義
00064     1,2,4逓倍の元となるclass
00065 
00066     @param res エンコーダの分解能
00067     @param multi エンコーダの逓倍
00068 
00069     @remarks このclassは各逓倍のclassに継承されるため、使用者が宣言する必要はない
00070     */
00071     Ec(int res,int multi);
00072     /** @details エンコーダのcountを返す関数
00073     * 1周のcount=分解能×逓倍
00074     * @return count
00075     */
00076     int getCount ()const;
00077     /**
00078     *   軸の回転角度を返す関数
00079     *   @return θ[rad]
00080     */
00081     double getRad()const;
00082     /**
00083     * 軸の角速度を返す関数
00084     * @return ω [rad/s]
00085     */
00086     
00087     double getOmega()const;
00088     /**
00089     * 角速度を計算するための関数
00090     * 微分を微小時間の変位として計算しているので、タイマー割込などで回さなければいけない
00091     */
00092     void calOmega();
00093     /**
00094     * 分解能を指定するための関数
00095     * @param res エンコーダの分解能
00096     */
00097     void setResolution(int res);
00098     ///エンコーダのcountやωをリセットするための関数
00099     void reset();
00100     
00101     double time();
00102     
00103     Timer timer_;
00104 };
00105 ///@brief increment型エンコーダ用class(1逓倍)
00106 class Ec1multi : public Ec
00107 {
00108 private:
00109     InterruptIn signalA_;
00110     DigitalIn signalB_;
00111     void upA();
00112 public:
00113     /**
00114     * @brief コンストラクタの定義
00115     * @details main関数の前に必ず一度宣言する
00116     * 使うエンコーダの数だけ設定する必要がある
00117 
00118     @ param signalA エンコーダのA相のピン名
00119     @ param signalB エンコーダのB相のピン名
00120     @ param res エンコーダの分解能
00121     @ remark 2,4逓倍も同様
00122     */
00123     Ec1multi(PinName signalA,PinName signalB,int res);
00124 };
00125 ///@brief increment型エンコーダ用class(2逓倍)
00126 class Ec2multi : public Ec
00127 {
00128 private:
00129     InterruptIn signalA_;
00130     DigitalIn signalB_;
00131     void upA();
00132     void downA();
00133 public:
00134     /**
00135     * @brief コンストラクタの定義
00136     * @details main関数の前に必ず一度宣言する
00137     * 使うエンコーダの数だけ設定する必要がある
00138 
00139     @ param signalA エンコーダのA相のピン名
00140     @ param signalB エンコーダのB相のピン名
00141     @ param res エンコーダの分解能
00142     */
00143     Ec2multi(PinName signalA,PinName signalB,int res);
00144 };
00145 ///@brief increment型エンコーダ用class(4逓倍)
00146 class Ec4multi : public Ec
00147 {
00148 private:
00149     InterruptIn signalA_;
00150     InterruptIn signalB_;
00151     void upA();
00152     void downA();
00153     void upB();
00154     void downB();
00155     int pa_,pb_;
00156 public:
00157     /**
00158     * @brief コンストラクタの定義
00159     * @details main関数の前に必ず一度宣言する
00160     * 使うエンコーダの数だけ設定する必要がある
00161 
00162     @ param signalA エンコーダのA相のピン名
00163     @ param signalB エンコーダのB相のピン名
00164     @ param res エンコーダの分解能
00165     */
00166     Ec4multi(PinName signalA,PinName signalB,int res);
00167 };
00168 
00169 
00170 
00171 #endif