Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
encoder/encoder.h@0:761a63c6d020, 2019-08-22 (annotated)
- Committer:
- Tom0108
- Date:
- Thu Aug 22 09:26:20 2019 +0000
- Revision:
- 0:761a63c6d020
08/22
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Tom0108 | 0:761a63c6d020 | 1 | /* ヘッダ再呼び出し防止のための定義 ------------------------------------------*/ |
Tom0108 | 0:761a63c6d020 | 2 | #ifndef INCLDUED_encoder_h_ |
Tom0108 | 0:761a63c6d020 | 3 | #define INCLDUED_encoder_h_ |
Tom0108 | 0:761a63c6d020 | 4 | #define Encoder_MAX 1 |
Tom0108 | 0:761a63c6d020 | 5 | |
Tom0108 | 0:761a63c6d020 | 6 | /* ファイル追加 --------------------------------------------------------------*/ |
Tom0108 | 0:761a63c6d020 | 7 | //#include "YKNCT_def.h" |
Tom0108 | 0:761a63c6d020 | 8 | #include "mbed.h" |
Tom0108 | 0:761a63c6d020 | 9 | |
Tom0108 | 0:761a63c6d020 | 10 | /* 定数定義 ------------------------------------------------------------------*/ |
Tom0108 | 0:761a63c6d020 | 11 | |
Tom0108 | 0:761a63c6d020 | 12 | /* マクロ定義 ----------------------------------------------------------------*/ |
Tom0108 | 0:761a63c6d020 | 13 | |
Tom0108 | 0:761a63c6d020 | 14 | /** |
Tom0108 | 0:761a63c6d020 | 15 | * @brief エンコーダー構造に読み取ったデータを取得する |
Tom0108 | 0:761a63c6d020 | 16 | * @param __ENCODER__: エンコーダー配列 |
Tom0108 | 0:761a63c6d020 | 17 | * @param __NUMBER__: エンコーダー配列の番号 |
Tom0108 | 0:761a63c6d020 | 18 | * @retval 読み取りデータ(0-0xFFF) |
Tom0108 | 0:761a63c6d020 | 19 | */ |
Tom0108 | 0:761a63c6d020 | 20 | #define ENCODER_GET_VAL(__ENCODER__, __NUMBER__) \ |
Tom0108 | 0:761a63c6d020 | 21 | (((__ENCODER__)+ (__NUMBER__))->read_val) |
Tom0108 | 0:761a63c6d020 | 22 | |
Tom0108 | 0:761a63c6d020 | 23 | /** |
Tom0108 | 0:761a63c6d020 | 24 | * @brief エンコーダー構造に読み取った角度を取得する |
Tom0108 | 0:761a63c6d020 | 25 | * @param __ENCODER__: エンコーダー構造 |
Tom0108 | 0:761a63c6d020 | 26 | * @param __NUMBER__: エンコーダー構造の番号 |
Tom0108 | 0:761a63c6d020 | 27 | * @retval 読み取り角度(0-359) |
Tom0108 | 0:761a63c6d020 | 28 | */ |
Tom0108 | 0:761a63c6d020 | 29 | #define ENCODER_GET_DEGREE(__MD_DATA__, __NUMBER__)\ |
Tom0108 | 0:761a63c6d020 | 30 | (((__MD_DATA__) + (__NUMBER__))->degree) |
Tom0108 | 0:761a63c6d020 | 31 | |
Tom0108 | 0:761a63c6d020 | 32 | /* 変数宣言 ------------------------------------------------------------------*/ |
Tom0108 | 0:761a63c6d020 | 33 | |
Tom0108 | 0:761a63c6d020 | 34 | /* 関数宣言 ------------------------------------------------------------------*/ |
Tom0108 | 0:761a63c6d020 | 35 | void encoder_conversion(void); |
Tom0108 | 0:761a63c6d020 | 36 | |
Tom0108 | 0:761a63c6d020 | 37 | /** |
Tom0108 | 0:761a63c6d020 | 38 | * |
Tom0108 | 0:761a63c6d020 | 39 | * Example: |
Tom0108 | 0:761a63c6d020 | 40 | * @code |
Tom0108 | 0:761a63c6d020 | 41 | * #include "mbed.h" |
Tom0108 | 0:761a63c6d020 | 42 | * #include "encoder.h" |
Tom0108 | 0:761a63c6d020 | 43 | * |
Tom0108 | 0:761a63c6d020 | 44 | * // encoder pins: p5 = CS, p6 = CLK,p8 = DO |
Tom0108 | 0:761a63c6d020 | 45 | * // 複数用いる場合は以下のように書いてください |
Tom0108 | 0:761a63c6d020 | 46 | * Encoder encoder[Encoder_MAX] = { |
Tom0108 | 0:761a63c6d020 | 47 | * Encoder(p5,p6,p8), |
Tom0108 | 0:761a63c6d020 | 48 | * Encoder(p5,p6,p7) |
Tom0108 | 0:761a63c6d020 | 49 | * }; |
Tom0108 | 0:761a63c6d020 | 50 | * |
Tom0108 | 0:761a63c6d020 | 51 | * int main() { |
Tom0108 | 0:761a63c6d020 | 52 | * while(1){ |
Tom0108 | 0:761a63c6d020 | 53 | * //エンコーダの処理 |
Tom0108 | 0:761a63c6d020 | 54 | * // 角度取得,26回に1度だけ実行される |
Tom0108 | 0:761a63c6d020 | 55 | * if(encoder->Encoder_Read(encoder,Encoder_MAX)) { |
Tom0108 | 0:761a63c6d020 | 56 | * |
Tom0108 | 0:761a63c6d020 | 57 | * for(int i=0; i<Encoder_MAX; i++) { |
Tom0108 | 0:761a63c6d020 | 58 | * |
Tom0108 | 0:761a63c6d020 | 59 | * //前回の値更新 |
Tom0108 | 0:761a63c6d020 | 60 | * //今回の値更新(エンコーダの値(0~4096)を角度(0~360)に) |
Tom0108 | 0:761a63c6d020 | 61 | * deg[i][1] = deg[i][0]; |
Tom0108 | 0:761a63c6d020 | 62 | * deg[i][0] = ENCODER_GET_VAL(encoder,i)*360.0/4096.0; |
Tom0108 | 0:761a63c6d020 | 63 | * |
Tom0108 | 0:761a63c6d020 | 64 | * //前回270度以上,今回90度より小さい… 359→0を跨いだ時前回の値を0から逆回転で負の値で表記 |
Tom0108 | 0:761a63c6d020 | 65 | * if((270 <= deg[i][1] ) && (deg[i][0] < 90)) deg[i][1]-= 360; |
Tom0108 | 0:761a63c6d020 | 66 | * |
Tom0108 | 0:761a63c6d020 | 67 | * //0→359を跨いだ時,前回の値を360以上の値で表記 |
Tom0108 | 0:761a63c6d020 | 68 | * else if((deg[i][1] < 90) && (270 <= deg[i][0])) deg[i][1]+= 360; |
Tom0108 | 0:761a63c6d020 | 69 | * |
Tom0108 | 0:761a63c6d020 | 70 | * } |
Tom0108 | 0:761a63c6d020 | 71 | * |
Tom0108 | 0:761a63c6d020 | 72 | * } |
Tom0108 | 0:761a63c6d020 | 73 | * } |
Tom0108 | 0:761a63c6d020 | 74 | * } |
Tom0108 | 0:761a63c6d020 | 75 | * @endcode |
Tom0108 | 0:761a63c6d020 | 76 | */ |
Tom0108 | 0:761a63c6d020 | 77 | |
Tom0108 | 0:761a63c6d020 | 78 | class Encoder |
Tom0108 | 0:761a63c6d020 | 79 | { |
Tom0108 | 0:761a63c6d020 | 80 | public: |
Tom0108 | 0:761a63c6d020 | 81 | /** Create an encoder object connected to the specified pins. |
Tom0108 | 0:761a63c6d020 | 82 | * |
Tom0108 | 0:761a63c6d020 | 83 | * @param p1 CS |
Tom0108 | 0:761a63c6d020 | 84 | * @param p2 CLK |
Tom0108 | 0:761a63c6d020 | 85 | * @param p3 DO |
Tom0108 | 0:761a63c6d020 | 86 | */ |
Tom0108 | 0:761a63c6d020 | 87 | Encoder(PinName p1,PinName p2,PinName p3); |
Tom0108 | 0:761a63c6d020 | 88 | /** ロータリーエンコーダから角度を取得する関数 |
Tom0108 | 0:761a63c6d020 | 89 | * |
Tom0108 | 0:761a63c6d020 | 90 | * @param *e クラスオブジェクトの配列の先頭アドレス |
Tom0108 | 0:761a63c6d020 | 91 | * @param MAX 使用するエンコーダ個数 |
Tom0108 | 0:761a63c6d020 | 92 | */ |
Tom0108 | 0:761a63c6d020 | 93 | int Encoder_Read(Encoder *e,uint8_t MAX); |
Tom0108 | 0:761a63c6d020 | 94 | uint16_t read_buf; /* 読み取りデータ処理用の一時保存領域 */ |
Tom0108 | 0:761a63c6d020 | 95 | uint16_t read_val; /* 読み取りデータ(0-0xFFF) */ |
Tom0108 | 0:761a63c6d020 | 96 | int16_t degree; /* 読み取りデータを角度(0-360)に変換した値 */ |
Tom0108 | 0:761a63c6d020 | 97 | |
Tom0108 | 0:761a63c6d020 | 98 | private: |
Tom0108 | 0:761a63c6d020 | 99 | DigitalOut CS; /* CSポートピンデータ構造 */ |
Tom0108 | 0:761a63c6d020 | 100 | DigitalOut CLK; /* CLKポートピンデータ構造 */ |
Tom0108 | 0:761a63c6d020 | 101 | DigitalIn DO; /* DOポートピンデータ構造 */ |
Tom0108 | 0:761a63c6d020 | 102 | }; |
Tom0108 | 0:761a63c6d020 | 103 | |
Tom0108 | 0:761a63c6d020 | 104 | |
Tom0108 | 0:761a63c6d020 | 105 | /** |
Tom0108 | 0:761a63c6d020 | 106 | * @} |
Tom0108 | 0:761a63c6d020 | 107 | */ |
Tom0108 | 0:761a63c6d020 | 108 | |
Tom0108 | 0:761a63c6d020 | 109 | |
Tom0108 | 0:761a63c6d020 | 110 | |
Tom0108 | 0:761a63c6d020 | 111 | /* 型定義 --------------------------------------------------------------------*/ |
Tom0108 | 0:761a63c6d020 | 112 | extern double enc[Encoder_MAX][2]; |
Tom0108 | 0:761a63c6d020 | 113 | extern Encoder encoder[Encoder_MAX]; |
Tom0108 | 0:761a63c6d020 | 114 | |
Tom0108 | 0:761a63c6d020 | 115 | #endif /* _YKNCT_EX_ENCODER_H_ */ |
Tom0108 | 0:761a63c6d020 | 116 | |
Tom0108 | 0:761a63c6d020 | 117 | |
Tom0108 | 0:761a63c6d020 | 118 | |
Tom0108 | 0:761a63c6d020 | 119 | /******************************** END OF FILE *********************************/ |