改良版(仮)
Dependents: harurobo1006 harurobo_1026
Fork of EC by
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
Generated on Thu Aug 4 2022 11:33:19 by 1.7.2