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.
Fork of EC by
EC.cpp@5:4abba4f54406, 2016-11-12 (annotated)
- Committer:
- jack0325suzu
- Date:
- Sat Nov 12 06:50:56 2016 +0000
- Revision:
- 5:4abba4f54406
- Parent:
- 0:20fc96400ca3
- Child:
- 6:bd366dd2fd30
- Child:
- 7:87c135463de7
ttt
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| jack0325suzu | 0:20fc96400ca3 | 1 | #include "mbed.h" |
| jack0325suzu | 0:20fc96400ca3 | 2 | #include "EC.h" |
| jack0325suzu | 0:20fc96400ca3 | 3 | |
| jack0325suzu | 0:20fc96400ca3 | 4 | int Ec::defsolution; |
| jack0325suzu | 0:20fc96400ca3 | 5 | double Ec::deftime; |
| jack0325suzu | 0:20fc96400ca3 | 6 | //ピン変化割り込み関数の定義 |
| jack0325suzu | 0:20fc96400ca3 | 7 | void Ec::upA(){ |
| jack0325suzu | 0:20fc96400ca3 | 8 | stateA=1; |
| jack0325suzu | 0:20fc96400ca3 | 9 | if(stateB==0&&S==0) { |
| jack0325suzu | 0:20fc96400ca3 | 10 | S=1; |
| jack0325suzu | 0:20fc96400ca3 | 11 | } else if(stateB==1&&S==3) { |
| jack0325suzu | 0:20fc96400ca3 | 12 | S=2; |
| jack0325suzu | 0:20fc96400ca3 | 13 | } |
| jack0325suzu | 0:20fc96400ca3 | 14 | } |
| jack0325suzu | 0:20fc96400ca3 | 15 | void Ec::downA(){ |
| jack0325suzu | 0:20fc96400ca3 | 16 | stateA=0; |
| jack0325suzu | 0:20fc96400ca3 | 17 | if(stateB==1&&S==2) { |
| jack0325suzu | 0:20fc96400ca3 | 18 | S=3; |
| jack0325suzu | 0:20fc96400ca3 | 19 | } else if(stateB==0&&S==1) { |
| jack0325suzu | 0:20fc96400ca3 | 20 | S=0; |
| jack0325suzu | 0:20fc96400ca3 | 21 | count--; |
| jack0325suzu | 0:20fc96400ca3 | 22 | } |
| jack0325suzu | 0:20fc96400ca3 | 23 | } |
| jack0325suzu | 0:20fc96400ca3 | 24 | void Ec::upB(){ |
| jack0325suzu | 0:20fc96400ca3 | 25 | stateB=1; |
| jack0325suzu | 0:20fc96400ca3 | 26 | if(stateA==1&&S==1) { |
| jack0325suzu | 0:20fc96400ca3 | 27 | S=2; |
| jack0325suzu | 0:20fc96400ca3 | 28 | } else if(stateA==0&&S==0) { |
| jack0325suzu | 0:20fc96400ca3 | 29 | S=3; |
| jack0325suzu | 0:20fc96400ca3 | 30 | } |
| jack0325suzu | 0:20fc96400ca3 | 31 | } |
| jack0325suzu | 0:20fc96400ca3 | 32 | void Ec::downB(){ |
| jack0325suzu | 0:20fc96400ca3 | 33 | stateB=0; |
| jack0325suzu | 0:20fc96400ca3 | 34 | if(stateA==0&&S==3) { |
| jack0325suzu | 0:20fc96400ca3 | 35 | count++; |
| jack0325suzu | 0:20fc96400ca3 | 36 | S=0; |
| jack0325suzu | 0:20fc96400ca3 | 37 | } else if(stateA==1&&S==2) { |
| jack0325suzu | 0:20fc96400ca3 | 38 | S=1; |
| jack0325suzu | 0:20fc96400ca3 | 39 | } |
| jack0325suzu | 0:20fc96400ca3 | 40 | } |
| jack0325suzu | 0:20fc96400ca3 | 41 | |
| jack0325suzu | 5:4abba4f54406 | 42 | void Ec::upZ(){ |
| jack0325suzu | 5:4abba4f54406 | 43 | if(first==false){ |
| jack0325suzu | 5:4abba4f54406 | 44 | rev++; |
| jack0325suzu | 5:4abba4f54406 | 45 | first=true; |
| jack0325suzu | 5:4abba4f54406 | 46 | now_time=timer.read(); |
| jack0325suzu | 5:4abba4f54406 | 47 | RPM=60/(now_time-old_time); |
| jack0325suzu | 5:4abba4f54406 | 48 | if((RPM_old-RPM)>300){ |
| jack0325suzu | 5:4abba4f54406 | 49 | printf("\r\n CAUTION : speed downed drastically\r\n"); |
| jack0325suzu | 5:4abba4f54406 | 50 | NVIC_SystemReset(); |
| jack0325suzu | 5:4abba4f54406 | 51 | } |
| jack0325suzu | 5:4abba4f54406 | 52 | RPM_old=RPM; |
| jack0325suzu | 5:4abba4f54406 | 53 | old_time=timer.read(); |
| jack0325suzu | 5:4abba4f54406 | 54 | } |
| jack0325suzu | 5:4abba4f54406 | 55 | } |
| jack0325suzu | 5:4abba4f54406 | 56 | |
| jack0325suzu | 5:4abba4f54406 | 57 | void Ec::downZ(){ |
| jack0325suzu | 5:4abba4f54406 | 58 | first=false; |
| jack0325suzu | 5:4abba4f54406 | 59 | } |
| jack0325suzu | 5:4abba4f54406 | 60 | |
| jack0325suzu | 5:4abba4f54406 | 61 | |
| jack0325suzu | 0:20fc96400ca3 | 62 | //コンストラクタの定義 |
| jack0325suzu | 0:20fc96400ca3 | 63 | //main関数の前に必ず一度宣言する |
| jack0325suzu | 0:20fc96400ca3 | 64 | //第一・第二引数はエンコーダのA・B相のピン名 |
| jack0325suzu | 0:20fc96400ca3 | 65 | //第三院数はエンコーダの分解能 |
| jack0325suzu | 0:20fc96400ca3 | 66 | |
| jack0325suzu | 5:4abba4f54406 | 67 | Ec::Ec(PinName signalA , PinName signalB , PinName signalZ , int s=defsolution , double t=deftime) : signalA_(signalA),signalB_(signalB),signalZ_(signalZ) |
| jack0325suzu | 0:20fc96400ca3 | 68 | { |
| jack0325suzu | 5:4abba4f54406 | 69 | |
| jack0325suzu | 5:4abba4f54406 | 70 | if((signalA!=NC)&&(signalB!=NC)){ |
| jack0325suzu | 5:4abba4f54406 | 71 | S=0;stateA=0;stateB=0;count=0;pre_count=0.0; |
| jack0325suzu | 5:4abba4f54406 | 72 | signalA_.rise(this,&Ec::upA); |
| jack0325suzu | 5:4abba4f54406 | 73 | signalA_.fall(this,&Ec::downA); |
| jack0325suzu | 5:4abba4f54406 | 74 | signalB_.rise(this,&Ec::upB); |
| jack0325suzu | 5:4abba4f54406 | 75 | signalB_.fall(this,&Ec::downB); |
| jack0325suzu | 5:4abba4f54406 | 76 | } |
| jack0325suzu | 5:4abba4f54406 | 77 | if(signalZ!=NC){ |
| jack0325suzu | 5:4abba4f54406 | 78 | first=false; rev=0; old_time=0; RPM=0; RPM_old=0; |
| jack0325suzu | 5:4abba4f54406 | 79 | timer.start(); |
| jack0325suzu | 5:4abba4f54406 | 80 | signalZ_.rise(this,&Ec::upZ); |
| jack0325suzu | 5:4abba4f54406 | 81 | signalZ_.fall(this,&Ec::downZ); |
| jack0325suzu | 5:4abba4f54406 | 82 | } |
| jack0325suzu | 0:20fc96400ca3 | 83 | dt=t; |
| jack0325suzu | 0:20fc96400ca3 | 84 | solution=s; |
| jack0325suzu | 0:20fc96400ca3 | 85 | defsolution=s; |
| jack0325suzu | 0:20fc96400ca3 | 86 | } |
| jack0325suzu | 0:20fc96400ca3 | 87 | |
| jack0325suzu | 0:20fc96400ca3 | 88 | int Ec::getCount(){ |
| jack0325suzu | 0:20fc96400ca3 | 89 | return count; |
| jack0325suzu | 0:20fc96400ca3 | 90 | } |
| jack0325suzu | 0:20fc96400ca3 | 91 | |
| jack0325suzu | 0:20fc96400ca3 | 92 | void Ec::CalOmega(){ |
| jack0325suzu | 0:20fc96400ca3 | 93 | omega=(count-pre_count)*2*M_pi/(solution*dt); |
| jack0325suzu | 0:20fc96400ca3 | 94 | pre_count=count; |
| jack0325suzu | 0:20fc96400ca3 | 95 | } |
| jack0325suzu | 0:20fc96400ca3 | 96 | |
| jack0325suzu | 0:20fc96400ca3 | 97 | double Ec::getOmega(){ |
| jack0325suzu | 0:20fc96400ca3 | 98 | return omega; |
| jack0325suzu | 0:20fc96400ca3 | 99 | } |
| jack0325suzu | 0:20fc96400ca3 | 100 | |
| jack0325suzu | 0:20fc96400ca3 | 101 | double Ec::getPreCount(){ |
| jack0325suzu | 0:20fc96400ca3 | 102 | precount=count+S/4.0; |
| jack0325suzu | 0:20fc96400ca3 | 103 | return precount; |
| jack0325suzu | 0:20fc96400ca3 | 104 | } |
| jack0325suzu | 0:20fc96400ca3 | 105 | /*reset関数の定義*/ |
| jack0325suzu | 0:20fc96400ca3 | 106 | /*エンコーダを初期状態に戻すことができる*/ |
| jack0325suzu | 0:20fc96400ca3 | 107 | void Ec::reset(){ |
| jack0325suzu | 0:20fc96400ca3 | 108 | S=0;stateA=0;stateB=0;count=0;pre_count=0.0,omega=0; |
| jack0325suzu | 0:20fc96400ca3 | 109 | } |
| jack0325suzu | 0:20fc96400ca3 | 110 | /*setTime関数の定義*/ |
| jack0325suzu | 0:20fc96400ca3 | 111 | /*自分で好きなように角速度計算の間隔を決めることができる(デフォルトは0.05秒)*/ |
| jack0325suzu | 0:20fc96400ca3 | 112 | void Ec::setTime(double t){ |
| jack0325suzu | 0:20fc96400ca3 | 113 | dt=t; |
| jack0325suzu | 0:20fc96400ca3 | 114 | } |
| jack0325suzu | 0:20fc96400ca3 | 115 | |
| jack0325suzu | 5:4abba4f54406 | 116 | double Ec::getRPM(){ |
| jack0325suzu | 5:4abba4f54406 | 117 | return RPM; |
| jack0325suzu | 5:4abba4f54406 | 118 | } |
| jack0325suzu | 5:4abba4f54406 | 119 | |
| jack0325suzu | 5:4abba4f54406 | 120 | int Ec::getrev(){ |
| jack0325suzu | 5:4abba4f54406 | 121 | return rev; |
| jack0325suzu | 5:4abba4f54406 | 122 | } |
| jack0325suzu | 5:4abba4f54406 | 123 |
