ai

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

Committer:
MazeTaka
Date:
Thu Jul 04 11:50:54 2019 +0000
Revision:
2:670bd19af5e1
Parent:
0:eb20667a5a27
Child:
3:c04b12937bae

        

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 0:eb20667a5a27 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 0:eb20667a5a27 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 0:eb20667a5a27 54 void reset();///エンコーダのcountやωをリセットするための関数
MazeTaka 0:eb20667a5a27 55 Timer timer_;
MazeTaka 0:eb20667a5a27 56 };
MazeTaka 0:eb20667a5a27 57 class Ec1multi : public Ec
MazeTaka 0:eb20667a5a27 58 {
MazeTaka 0:eb20667a5a27 59 private:
MazeTaka 0:eb20667a5a27 60 InterruptIn signalA_;
MazeTaka 0:eb20667a5a27 61 DigitalIn signalB_;
MazeTaka 0:eb20667a5a27 62 void upA();
MazeTaka 0:eb20667a5a27 63 public:
MazeTaka 0:eb20667a5a27 64 /**コンストラクタの定義
MazeTaka 0:eb20667a5a27 65 main関数の前に必ず一度宣言する
MazeTaka 0:eb20667a5a27 66 使うエンコーダの数だけ設定する必要がある
MazeTaka 0:eb20667a5a27 67
MazeTaka 0:eb20667a5a27 68 @param signalA エンコーダのA相のピン名
MazeTaka 0:eb20667a5a27 69 @param signalB エンコーダのB相のピン名
MazeTaka 0:eb20667a5a27 70 @param res エンコーダの分解能
MazeTaka 0:eb20667a5a27 71 */
MazeTaka 0:eb20667a5a27 72 Ec1multi(PinName signalA,PinName signalB,int res);
MazeTaka 0:eb20667a5a27 73 };
MazeTaka 0:eb20667a5a27 74 class Ec2multi : public Ec
MazeTaka 0:eb20667a5a27 75 {
MazeTaka 0:eb20667a5a27 76 private:
MazeTaka 0:eb20667a5a27 77 InterruptIn signalA_;
MazeTaka 0:eb20667a5a27 78 DigitalIn signalB_;
MazeTaka 0:eb20667a5a27 79 void upA();
MazeTaka 0:eb20667a5a27 80 void downA();
MazeTaka 0:eb20667a5a27 81 public:
MazeTaka 0:eb20667a5a27 82 /**コンストラクタの定義
MazeTaka 0:eb20667a5a27 83 main関数の前に必ず一度宣言する
MazeTaka 0:eb20667a5a27 84 使うエンコーダの数だけ設定する必要がある
MazeTaka 0:eb20667a5a27 85
MazeTaka 0:eb20667a5a27 86 @param signalA エンコーダのA相のピン名
MazeTaka 0:eb20667a5a27 87 @param signalB エンコーダのB相のピン名
MazeTaka 0:eb20667a5a27 88 @param res エンコーダの分解能
MazeTaka 0:eb20667a5a27 89 */
MazeTaka 0:eb20667a5a27 90 Ec2multi(PinName signalA,PinName signalB,int res);
MazeTaka 0:eb20667a5a27 91 };
MazeTaka 0:eb20667a5a27 92 class Ec4multi : public Ec
MazeTaka 0:eb20667a5a27 93 {
MazeTaka 0:eb20667a5a27 94 private:
MazeTaka 0:eb20667a5a27 95 InterruptIn signalA_;
MazeTaka 0:eb20667a5a27 96 InterruptIn signalB_;
MazeTaka 0:eb20667a5a27 97 void upA();
MazeTaka 0:eb20667a5a27 98 void downA();
MazeTaka 0:eb20667a5a27 99 void upB();
MazeTaka 0:eb20667a5a27 100 void downB();
MazeTaka 0:eb20667a5a27 101 int pa_,pb_;
MazeTaka 0:eb20667a5a27 102 public:
MazeTaka 0:eb20667a5a27 103 /**コンストラクタの定義
MazeTaka 0:eb20667a5a27 104 main関数の前に必ず一度宣言する
MazeTaka 0:eb20667a5a27 105 使うエンコーダの数だけ設定する必要がある
MazeTaka 0:eb20667a5a27 106
MazeTaka 0:eb20667a5a27 107 @param signalA エンコーダのA相のピン名
MazeTaka 0:eb20667a5a27 108 @param signalB エンコーダのB相のピン名
MazeTaka 0:eb20667a5a27 109 @param res エンコーダの分解能
MazeTaka 0:eb20667a5a27 110 */
MazeTaka 0:eb20667a5a27 111 Ec4multi(PinName signalA,PinName signalB,int res);
MazeTaka 0:eb20667a5a27 112 };
MazeTaka 2:670bd19af5e1 113 /**@section SAMPLE
MazeTaka 2:670bd19af5e1 114 @code
MazeTaka 2:670bd19af5e1 115 //プログラム例
MazeTaka 2:670bd19af5e1 116 #include "mbed.h"
MazeTaka 2:670bd19af5e1 117 #include "EC.h"
MazeTaka 0:eb20667a5a27 118
MazeTaka 2:670bd19af5e1 119 #define RESOLUTION 500
MazeTaka 2:670bd19af5e1 120 Ticker ticker;
MazeTaka 2:670bd19af5e1 121 Serial pc(USBTX,USBRX);
MazeTaka 2:670bd19af5e1 122
MazeTaka 2:670bd19af5e1 123 //(A層,B層,分解能)
MazeTaka 2:670bd19af5e1 124 Ec1multi EC(p7,p8,RESOLUTION); //1逓倍用class
MazeTaka 2:670bd19af5e1 125 //or
MazeTaka 2:670bd19af5e1 126 //Ec2multi EC(p7,p8,RESOLUTION); //2逓倍用class
MazeTaka 2:670bd19af5e1 127 //or
MazeTaka 2:670bd19af5e1 128 //Ec4multi EC(p7,p8,RESOLUTION); //4逓倍用class
MazeTaka 2:670bd19af5e1 129 void calOmega();
MazeTaka 2:670bd19af5e1 130
MazeTaka 2:670bd19af5e1 131 int main()
MazeTaka 2:670bd19af5e1 132 {
MazeTaka 2:670bd19af5e1 133 int count=0;
MazeTaka 2:670bd19af5e1 134 double omega;
MazeTaka 2:670bd19af5e1 135 ticker.attach(&calOmega,0.05);
MazeTaka 2:670bd19af5e1 136
MazeTaka 2:670bd19af5e1 137 while(1) {
MazeTaka 2:670bd19af5e1 138 count=EC.getCount();
MazeTaka 2:670bd19af5e1 139 omega=EC.getOmega();
MazeTaka 2:670bd19af5e1 140 pc.printf("count=%d,",count);
MazeTaka 2:670bd19af5e1 141 pc.printf("omega=%f\r\n",omega);
MazeTaka 2:670bd19af5e1 142 }
MazeTaka 2:670bd19af5e1 143 }
MazeTaka 2:670bd19af5e1 144 void calOmega()
MazeTaka 2:670bd19af5e1 145 {
MazeTaka 2:670bd19af5e1 146 EC.calOmega();
MazeTaka 2:670bd19af5e1 147 }
MazeTaka 2:670bd19af5e1 148 @endcode
MazeTaka 2:670bd19af5e1 149 */
MazeTaka 0:eb20667a5a27 150
MazeTaka 0:eb20667a5a27 151
MazeTaka 0:eb20667a5a27 152 #endif