ai

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

Committer:
MazeTaka
Date:
Thu Jul 04 11:56:15 2019 +0000
Revision:
3:c04b12937bae
Parent:
2:670bd19af5e1
Child:
4:d1c16f9877b6

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MazeTaka 0:eb20667a5a27 1 #ifndef _INCLUDED_EC_H_
MazeTaka 0:eb20667a5a27 2 #define _INCLUDED_EC_H_
MazeTaka 0:eb20667a5a27 3
MazeTaka 0:eb20667a5a27 4 #ifndef M_PI
MazeTaka 0:eb20667a5a27 5 #define M_PI 3.14159265359f
MazeTaka 0:eb20667a5a27 6 #endif
MazeTaka 0:eb20667a5a27 7 /**
MazeTaka 0:eb20667a5a27 8 increment型エンコーダ用class
MazeTaka 0:eb20667a5a27 9 1逓倍:Ec1multi
MazeTaka 0:eb20667a5a27 10 2逓倍:Ec2multi
MazeTaka 0:eb20667a5a27 11 4逓倍:Ec4multi
MazeTaka 0:eb20667a5a27 12 **/
MazeTaka 0:eb20667a5a27 13 class Ec
MazeTaka 0:eb20667a5a27 14 {
MazeTaka 0:eb20667a5a27 15 protected:
MazeTaka 0:eb20667a5a27 16 int count_; //カウント数
MazeTaka 0:eb20667a5a27 17 double omega_; //角速度(rad/s)
MazeTaka 0:eb20667a5a27 18 int pre_count_; //一つ前のカウント
MazeTaka 0:eb20667a5a27 19 int resolution_; //分解能
MazeTaka 0:eb20667a5a27 20 int multiplication_;
MazeTaka 0:eb20667a5a27 21 double ptw_;
MazeTaka 0:eb20667a5a27 22
MazeTaka 0:eb20667a5a27 23 public:
MazeTaka 3:c04b12937bae 24 /*コンストラクタの定義
MazeTaka 0:eb20667a5a27 25 1,2,4逓倍の元となるclass
MazeTaka 0:eb20667a5a27 26
MazeTaka 0:eb20667a5a27 27 @param res エンコーダの分解能
MazeTaka 0:eb20667a5a27 28 @param multi エンコーダの逓倍
MazeTaka 0:eb20667a5a27 29
MazeTaka 0:eb20667a5a27 30 @remarks このclassは各逓倍のclassに継承されるため、使用者が宣言する必要はない
MazeTaka 0:eb20667a5a27 31 */
MazeTaka 0:eb20667a5a27 32 Ec(int res,int multi);
MazeTaka 0:eb20667a5a27 33 /**
MazeTaka 0:eb20667a5a27 34 エンコーダのcountを返す関数
MazeTaka 3:c04b12937bae 35 1周のcount=分解能×逓倍
MazeTaka 0:eb20667a5a27 36 @return count
MazeTaka 0:eb20667a5a27 37 */
MazeTaka 0:eb20667a5a27 38 int getCount();
MazeTaka 0:eb20667a5a27 39 /**
MazeTaka 0:eb20667a5a27 40 軸の角速度を返す関数
MazeTaka 0:eb20667a5a27 41 @return ω(rad/s)
MazeTaka 0:eb20667a5a27 42 */
MazeTaka 0:eb20667a5a27 43 double getOmega();
MazeTaka 0:eb20667a5a27 44 /**
MazeTaka 0:eb20667a5a27 45 角速度を計算するための関数
MazeTaka 0:eb20667a5a27 46 微分を微小時間の変位として計算しているので、タイマー割込などで回さなければいけない
MazeTaka 0:eb20667a5a27 47 */
MazeTaka 0:eb20667a5a27 48 void calOmega();
MazeTaka 0:eb20667a5a27 49 /**
MazeTaka 0:eb20667a5a27 50 分解能を指定するための関数
MazeTaka 0:eb20667a5a27 51 @param res エンコーダの分解能
MazeTaka 0:eb20667a5a27 52 */
MazeTaka 0:eb20667a5a27 53 void setResolution(int res);
MazeTaka 3:c04b12937bae 54 ///エンコーダのcountやωをリセットするための関数
MazeTaka 3:c04b12937bae 55 void reset();
MazeTaka 0:eb20667a5a27 56 Timer timer_;
MazeTaka 0:eb20667a5a27 57 };
MazeTaka 0:eb20667a5a27 58 class Ec1multi : public Ec
MazeTaka 0:eb20667a5a27 59 {
MazeTaka 0:eb20667a5a27 60 private:
MazeTaka 0:eb20667a5a27 61 InterruptIn signalA_;
MazeTaka 0:eb20667a5a27 62 DigitalIn signalB_;
MazeTaka 0:eb20667a5a27 63 void upA();
MazeTaka 0:eb20667a5a27 64 public:
MazeTaka 0:eb20667a5a27 65 /**コンストラクタの定義
MazeTaka 0:eb20667a5a27 66 main関数の前に必ず一度宣言する
MazeTaka 0:eb20667a5a27 67 使うエンコーダの数だけ設定する必要がある
MazeTaka 0:eb20667a5a27 68
MazeTaka 0:eb20667a5a27 69 @param signalA エンコーダのA相のピン名
MazeTaka 0:eb20667a5a27 70 @param signalB エンコーダのB相のピン名
MazeTaka 0:eb20667a5a27 71 @param res エンコーダの分解能
MazeTaka 3:c04b12937bae 72 @remark 2,4逓倍も同様
MazeTaka 0:eb20667a5a27 73 */
MazeTaka 0:eb20667a5a27 74 Ec1multi(PinName signalA,PinName signalB,int res);
MazeTaka 0:eb20667a5a27 75 };
MazeTaka 0:eb20667a5a27 76 class Ec2multi : public Ec
MazeTaka 0:eb20667a5a27 77 {
MazeTaka 0:eb20667a5a27 78 private:
MazeTaka 0:eb20667a5a27 79 InterruptIn signalA_;
MazeTaka 0:eb20667a5a27 80 DigitalIn signalB_;
MazeTaka 0:eb20667a5a27 81 void upA();
MazeTaka 0:eb20667a5a27 82 void downA();
MazeTaka 0:eb20667a5a27 83 public:
MazeTaka 0:eb20667a5a27 84 /**コンストラクタの定義
MazeTaka 0:eb20667a5a27 85 main関数の前に必ず一度宣言する
MazeTaka 0:eb20667a5a27 86 使うエンコーダの数だけ設定する必要がある
MazeTaka 0:eb20667a5a27 87
MazeTaka 0:eb20667a5a27 88 @param signalA エンコーダのA相のピン名
MazeTaka 0:eb20667a5a27 89 @param signalB エンコーダのB相のピン名
MazeTaka 0:eb20667a5a27 90 @param res エンコーダの分解能
MazeTaka 0:eb20667a5a27 91 */
MazeTaka 0:eb20667a5a27 92 Ec2multi(PinName signalA,PinName signalB,int res);
MazeTaka 0:eb20667a5a27 93 };
MazeTaka 0:eb20667a5a27 94 class Ec4multi : public Ec
MazeTaka 0:eb20667a5a27 95 {
MazeTaka 0:eb20667a5a27 96 private:
MazeTaka 0:eb20667a5a27 97 InterruptIn signalA_;
MazeTaka 0:eb20667a5a27 98 InterruptIn signalB_;
MazeTaka 0:eb20667a5a27 99 void upA();
MazeTaka 0:eb20667a5a27 100 void downA();
MazeTaka 0:eb20667a5a27 101 void upB();
MazeTaka 0:eb20667a5a27 102 void downB();
MazeTaka 0:eb20667a5a27 103 int pa_,pb_;
MazeTaka 0:eb20667a5a27 104 public:
MazeTaka 0:eb20667a5a27 105 /**コンストラクタの定義
MazeTaka 0:eb20667a5a27 106 main関数の前に必ず一度宣言する
MazeTaka 0:eb20667a5a27 107 使うエンコーダの数だけ設定する必要がある
MazeTaka 0:eb20667a5a27 108
MazeTaka 0:eb20667a5a27 109 @param signalA エンコーダのA相のピン名
MazeTaka 0:eb20667a5a27 110 @param signalB エンコーダのB相のピン名
MazeTaka 0:eb20667a5a27 111 @param res エンコーダの分解能
MazeTaka 0:eb20667a5a27 112 */
MazeTaka 0:eb20667a5a27 113 Ec4multi(PinName signalA,PinName signalB,int res);
MazeTaka 0:eb20667a5a27 114 };
MazeTaka 2:670bd19af5e1 115 /**@section SAMPLE
MazeTaka 2:670bd19af5e1 116 @code
MazeTaka 2:670bd19af5e1 117 //プログラム例
MazeTaka 2:670bd19af5e1 118 #include "mbed.h"
MazeTaka 2:670bd19af5e1 119 #include "EC.h"
MazeTaka 0:eb20667a5a27 120
MazeTaka 2:670bd19af5e1 121 #define RESOLUTION 500
MazeTaka 2:670bd19af5e1 122 Ticker ticker;
MazeTaka 2:670bd19af5e1 123 Serial pc(USBTX,USBRX);
MazeTaka 2:670bd19af5e1 124
MazeTaka 2:670bd19af5e1 125 //(A層,B層,分解能)
MazeTaka 2:670bd19af5e1 126 Ec1multi EC(p7,p8,RESOLUTION); //1逓倍用class
MazeTaka 2:670bd19af5e1 127 //or
MazeTaka 2:670bd19af5e1 128 //Ec2multi EC(p7,p8,RESOLUTION); //2逓倍用class
MazeTaka 2:670bd19af5e1 129 //or
MazeTaka 2:670bd19af5e1 130 //Ec4multi EC(p7,p8,RESOLUTION); //4逓倍用class
MazeTaka 2:670bd19af5e1 131 void calOmega();
MazeTaka 2:670bd19af5e1 132
MazeTaka 2:670bd19af5e1 133 int main()
MazeTaka 2:670bd19af5e1 134 {
MazeTaka 2:670bd19af5e1 135 int count=0;
MazeTaka 2:670bd19af5e1 136 double omega;
MazeTaka 2:670bd19af5e1 137 ticker.attach(&calOmega,0.05);
MazeTaka 2:670bd19af5e1 138
MazeTaka 2:670bd19af5e1 139 while(1) {
MazeTaka 2:670bd19af5e1 140 count=EC.getCount();
MazeTaka 2:670bd19af5e1 141 omega=EC.getOmega();
MazeTaka 2:670bd19af5e1 142 pc.printf("count=%d,",count);
MazeTaka 2:670bd19af5e1 143 pc.printf("omega=%f\r\n",omega);
MazeTaka 2:670bd19af5e1 144 }
MazeTaka 2:670bd19af5e1 145 }
MazeTaka 2:670bd19af5e1 146 void calOmega()
MazeTaka 2:670bd19af5e1 147 {
MazeTaka 2:670bd19af5e1 148 EC.calOmega();
MazeTaka 2:670bd19af5e1 149 }
MazeTaka 2:670bd19af5e1 150 @endcode
MazeTaka 2:670bd19af5e1 151 */
MazeTaka 0:eb20667a5a27 152
MazeTaka 0:eb20667a5a27 153
MazeTaka 0:eb20667a5a27 154 #endif