l

Dependencies:   mbed

Committer:
eri
Date:
Fri Dec 14 10:49:59 2018 +0000
Revision:
0:111abd91b0cb
a;

Who changed what in which revision?

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