ec

Dependents:   F3RC

Fork of EC by ROBOSTEP_LIBRARY

Committer:
shimizuta
Date:
Thu Jul 05 01:23:58 2018 +0000
Revision:
34:b34dc495b3c8
Parent:
33:5fe65de5684c
add error coment in distance

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jack0325suzu 0:20fc96400ca3 1 #ifndef __INCLUDED_EC_H_
jack0325suzu 0:20fc96400ca3 2 #define __INCLUDED_EC_H_
jack0325suzu 0:20fc96400ca3 3
jack0325suzu 0:20fc96400ca3 4 #ifndef M_pi
jack0325suzu 0:20fc96400ca3 5 #define M_pi 3.141592
jack0325suzu 0:20fc96400ca3 6 #endif
shimizuta 32:297384f9d261 7 /**@class Ec
shimizuta 32:297384f9d261 8 @brief increment型encoder用class.
shimizuta 32:297384f9d261 9 Z相(1周につき1回立ち上がる)の機能あり.
shimizuta 32:297384f9d261 10 普通に使う分には不必要な機能ですが、回転回数が欲しい場合や、回転が非常に早い物の回転速度が欲しい場合などで
shimizuta 32:297384f9d261 11 A,B相での処理だとマイコンが追いつかない場合などに使ってください
shimizuta 32:297384f9d261 12 */
shimizuta 32:297384f9d261 13 class Ec
shimizuta 32:297384f9d261 14 {
shimizuta 32:297384f9d261 15 protected:
shimizuta 32:297384f9d261 16 int S; //A相B相のパターン(1~4)
shimizuta 32:297384f9d261 17 bool stateA,stateB; //A・B相の状態
shimizuta 32:297384f9d261 18 int count; //カウント数 分解能分で一周
shimizuta 32:297384f9d261 19 int pre_count; //一つ前のカウント
shimizuta 32:297384f9d261 20 double precount; //4倍精度カウント
shimizuta 32:297384f9d261 21 int solution; //分解能
shimizuta 32:297384f9d261 22 double dt; //角速度の計算間隔
shimizuta 32:297384f9d261 23 double distance_mm_;//距離[mm]
shimizuta 32:297384f9d261 24 double diameter_mm_;//測定輪半径
shimizuta 32:297384f9d261 25 double count_to_distance_mm_;//カウントを距離に変換する係数
shimizuta 32:297384f9d261 26 double gear_rate_;//ギア比(エンコーダタイムプーリー/測定輪タイムプーリー)
shimizuta 34:b34dc495b3c8 27 int is_diameter_set;//diameterがセットされていたら1
shimizuta 32:297384f9d261 28 //z相用
shimizuta 32:297384f9d261 29 bool first;
shimizuta 32:297384f9d261 30 int rev;
shimizuta 32:297384f9d261 31 double now_time,old_time;
shimizuta 32:297384f9d261 32 double RPM,RPM_old;
shimizuta 32:297384f9d261 33 int RPM_th;
shimizuta 32:297384f9d261 34
shimizuta 32:297384f9d261 35 InterruptIn signalA_;
shimizuta 32:297384f9d261 36 InterruptIn signalB_;
shimizuta 32:297384f9d261 37 InterruptIn signalZ_;
jack0325suzu 8:833757a1df66 38
shimizuta 32:297384f9d261 39 void upA();
shimizuta 32:297384f9d261 40 void downA();
shimizuta 32:297384f9d261 41 void upB();
shimizuta 32:297384f9d261 42 void downB();
shimizuta 32:297384f9d261 43 void upZ();
shimizuta 32:297384f9d261 44 void downZ();
shimizuta 32:297384f9d261 45 void setCountToDistance_mm();//countからdistanceに変換する係数を計算する。
shimizuta 32:297384f9d261 46 public:
shimizuta 32:297384f9d261 47 double omega; //角速度
shimizuta 32:297384f9d261 48 /** コンストラクタの定義
shimizuta 32:297384f9d261 49 *
shimizuta 32:297384f9d261 50 * ***Z相の機能を追加したことで引数が増えました!!!!***
shimizuta 32:297384f9d261 51 *
shimizuta 32:297384f9d261 52 * main関数の前に必ず一度宣言する
shimizuta 32:297384f9d261 53 *
shimizuta 32:297384f9d261 54 * 使うエンコーダの数だけ設定する必要がある
shimizuta 32:297384f9d261 55 *
shimizuta 32:297384f9d261 56 * @param signalA エンコーダA相のピン名
shimizuta 32:297384f9d261 57 * @param signalB エンコーダB相のピン名
shimizuta 32:297384f9d261 58 * @param signalZ エンコーダZ相のピン名
shimizuta 32:297384f9d261 59 * @param s エンコーダの分解能(省略可)
shimizuta 32:297384f9d261 60 * @param t 角速度計算の間隔(省略可)
shimizuta 32:297384f9d261 61 */
shimizuta 32:297384f9d261 62 /** @section CAUTION
shimizuta 32:297384f9d261 63 * 今まで以下のように定義していたものは
shimizuta 32:297384f9d261 64 * @code
shimizuta 32:297384f9d261 65 * #include "mbed.h"
shimizuta 32:297384f9d261 66 * #include "EC.h"
shimizuta 32:297384f9d261 67 *
shimizuta 32:297384f9d261 68 * Ec Ec1(PA_0,PA_1,1024,0.05);
shimizuta 32:297384f9d261 69 * @endcode
shimizuta 32:297384f9d261 70 * 次のようにZ相の引数の部分に、NCと入れれば今までの様に使える
shimizuta 32:297384f9d261 71 * @code
shimizuta 32:297384f9d261 72 * #include "mbed.h"
shimizuta 32:297384f9d261 73 * #include "EC.h"
shimizuta 32:297384f9d261 74 *
shimizuta 32:297384f9d261 75 * Ec Ec1(PA_0,PA_1,NC,1024,0.05);
shimizuta 32:297384f9d261 76 * @endcode
shimizuta 32:297384f9d261 77 */
shimizuta 32:297384f9d261 78 Ec(PinName signalA,PinName signalB,PinName signalZ,int s,double t);
shimizuta 32:297384f9d261 79
shimizuta 32:297384f9d261 80 ///countの値を返す関数(int型)
shimizuta 32:297384f9d261 81 int getCount();
jack0325suzu 0:20fc96400ca3 82
shimizuta 32:297384f9d261 83 /** omega(角速度 rad/s)の値を計算する関数
shimizuta 32:297384f9d261 84 * @section CAUTION
shimizuta 32:297384f9d261 85 * CalOmega関数は、一定時間ごと(dtごと)に計算される必要があるので、main関数内でタイマー割り込みを設定する必要がある。
shimizuta 32:297384f9d261 86 * @code
shimizuta 32:297384f9d261 87 * #include "mbed.h"
shimizuta 32:297384f9d261 88 * #include "EC.h" //ライブラリをインクルード
shimizuta 32:297384f9d261 89 *
shimizuta 32:297384f9d261 90 * Ec Ec1(PA_0,PA_1,NC,1024,0.05); //分解能1024、計算間隔0.05秒に設定、Z相は使わない
shimizuta 32:297384f9d261 91 * Ticker ticker;
shimizuta 32:297384f9d261 92 * DigitalIn button(USER_BUTTON);
shimizuta 32:297384f9d261 93 * Serial pc(USBTX,USBRX);
shimizuta 32:297384f9d261 94 *
shimizuta 32:297384f9d261 95 * void calOmega(){
shimizuta 32:297384f9d261 96 * Ec1.CalOmega();
shimizuta 32:297384f9d261 97 * }
shimizuta 32:297384f9d261 98 *
shimizuta 32:297384f9d261 99 * int main(){
shimizuta 32:297384f9d261 100 * ticker.attach(&calOmega,0.05); //0.05秒間隔で角速度を計算
shimizuta 32:297384f9d261 101 * while(1){
shimizuta 32:297384f9d261 102 * pc.printf(" count1=%d ",Ec1.getCount());
shimizuta 32:297384f9d261 103 * pc.printf(" omega1=%f\r\n ",Ec1.getOmega());
shimizuta 32:297384f9d261 104 * if(pc.readable()) {
shimizuta 32:297384f9d261 105 * char sel=pc.getc();
shimizuta 32:297384f9d261 106 * if(sel=='r') Ec1.reset(); //rを押したらリセット
shimizuta 32:297384f9d261 107 * }
shimizuta 32:297384f9d261 108 * }
shimizuta 32:297384f9d261 109 * }
shimizuta 32:297384f9d261 110 * @endcode
shimizuta 32:297384f9d261 111 */
shimizuta 32:297384f9d261 112 void CalOmega();
jack0325suzu 8:833757a1df66 113
shimizuta 32:297384f9d261 114 ///omega(角速度 rad/s)の値を返す関数(double型)
shimizuta 32:297384f9d261 115 double getOmega();
shimizuta 32:297384f9d261 116 ///四倍精度のcountの値を返す関数(double型)
shimizuta 32:297384f9d261 117 double getPreCount();
shimizuta 32:297384f9d261 118 ///エンコーダを初期状態に戻す関数 countやomegaの値を0にする
shimizuta 32:297384f9d261 119 virtual void reset();
shimizuta 32:297384f9d261 120 ///角速度計算の間隔dtを決めることができる(デフォルトは0.05秒)
shimizuta 32:297384f9d261 121 void setTime(double t);
shimizuta 32:297384f9d261 122 ///(Z相を使用する場合)回転回数を返す関数(int型)
shimizuta 32:297384f9d261 123 int getRev();
shimizuta 32:297384f9d261 124
shimizuta 32:297384f9d261 125 ///(Z相を使用する場合)回転速度(rpm)の値を返す関数(double型)
shimizuta 32:297384f9d261 126 /** @section SAMPLE
shimizuta 32:297384f9d261 127 * z相を使う場合のプログラムの例
shimizuta 32:297384f9d261 128 * @code
shimizuta 32:297384f9d261 129 * #include "mbed.h"
shimizuta 32:297384f9d261 130 * #include "EC.h" //ライブラリをインクルード
shimizuta 32:297384f9d261 131 *
shimizuta 32:297384f9d261 132 * Ec Ec1(NC,NC,PA_0,1024,0.05); //A相B相が不必要な場合も、このようにNCと入れればよい
shimizuta 32:297384f9d261 133 * DigitalIn button(USER_BUTTON);
shimizuta 32:297384f9d261 134 * Serial pc(USBTX,USBRX);
shimizuta 32:297384f9d261 135 *
shimizuta 32:297384f9d261 136 * int main(){
shimizuta 32:297384f9d261 137 * while(1){
shimizuta 32:297384f9d261 138 * pc.printf(" rev1=%d ",Ec1.getRev());
shimizuta 32:297384f9d261 139 * pc.printf(" rpm1=%f\r\n ",Ec1.getRPM());
shimizuta 32:297384f9d261 140 * if(!button) Ec1.reset(); //USERボタンを押したらリセット
shimizuta 32:297384f9d261 141 * }
shimizuta 32:297384f9d261 142 * }
shimizuta 32:297384f9d261 143 * @endcode
shimizuta 32:297384f9d261 144 */
shimizuta 32:297384f9d261 145 double getRPM();
shimizuta 32:297384f9d261 146 void changeRPM_th(int th);
shimizuta 32:297384f9d261 147
shimizuta 32:297384f9d261 148 /** @caution 先にsetDiameter_mmをしないと正しい値とならない
shimizuta 32:297384f9d261 149 @return 現在距離.
shimizuta 33:5fe65de5684c 150 @code
shimizuta 33:5fe65de5684c 151 #include <mbed.h>
shimizuta 33:5fe65de5684c 152 #include "EC.h"
shimizuta 33:5fe65de5684c 153 Ec ec(PB_5, PB_4, NC, 500, 0.5);
shimizuta 33:5fe65de5684c 154 int main()
shimizuta 33:5fe65de5684c 155 {
shimizuta 33:5fe65de5684c 156 ec.setDiameter_mm(48);
shimizuta 33:5fe65de5684c 157 while(1) {
shimizuta 33:5fe65de5684c 158 printf("%f\r\n", ec.getDistance_mm());
shimizuta 33:5fe65de5684c 159 wait(0.1);
shimizuta 33:5fe65de5684c 160 }
shimizuta 33:5fe65de5684c 161 }
shimizuta 33:5fe65de5684c 162 @endcode
shimizuta 32:297384f9d261 163 */
shimizuta 32:297384f9d261 164 double getDistance_mm();
shimizuta 32:297384f9d261 165
shimizuta 32:297384f9d261 166 /** @param diameter_mm 測定輪半径
shimizuta 32:297384f9d261 167 */
shimizuta 32:297384f9d261 168 void setDiameter_mm(double diameter_mm);
shimizuta 32:297384f9d261 169 /** @param gear比(エンコーダタイムプーリー/測定輪タイムプーリー)
shimizuta 32:297384f9d261 170 */
shimizuta 32:297384f9d261 171 void setGearRate(double gear_rate);
shimizuta 32:297384f9d261 172 static double deftime;//角速度計算の間隔
shimizuta 32:297384f9d261 173 static int defsolution;//エンコーダの分解能のデフォルト値
shimizuta 32:297384f9d261 174 Timer timer;
jack0325suzu 0:20fc96400ca3 175 };
jack0325suzu 0:20fc96400ca3 176
jack0325suzu 29:b8de333facd4 177
jack0325suzu 0:20fc96400ca3 178 #endif