sls

Dependencies:   mbed

Committer:
yuto17320508
Date:
Mon Apr 29 07:02:33 2019 +0000
Revision:
4:96f38805f055
Parent:
0:c1476d342c13
ss

Who changed what in which revision?

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