7th_DENSOU / Encoder

Dependents:   Touteki_publish

Committer:
oshin1030
Date:
Wed Mar 18 13:00:13 2020 +0000
Revision:
0:23ae7be73daf
tweaked a little;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
oshin1030 0:23ae7be73daf 1 #include "mbed.h"
oshin1030 0:23ae7be73daf 2 #include "EC.h"
oshin1030 0:23ae7be73daf 3
oshin1030 0:23ae7be73daf 4
oshin1030 0:23ae7be73daf 5 Ec::Ec(int res,int multi):
oshin1030 0:23ae7be73daf 6 count_(0),pre_count_(0),resolution_(res),multiplication_(multi)
oshin1030 0:23ae7be73daf 7 {
oshin1030 0:23ae7be73daf 8 timer_.start();
oshin1030 0:23ae7be73daf 9 }
oshin1030 0:23ae7be73daf 10
oshin1030 0:23ae7be73daf 11 int Ec::getCount()const
oshin1030 0:23ae7be73daf 12 {
oshin1030 0:23ae7be73daf 13 return count_;
oshin1030 0:23ae7be73daf 14 }
oshin1030 0:23ae7be73daf 15
oshin1030 0:23ae7be73daf 16 double Ec::getRad()const
oshin1030 0:23ae7be73daf 17 {
oshin1030 0:23ae7be73daf 18 return count_*2.0f*M_PI/(multiplication_*resolution_);
oshin1030 0:23ae7be73daf 19 }
oshin1030 0:23ae7be73daf 20
oshin1030 0:23ae7be73daf 21 void Ec::calOmega()
oshin1030 0:23ae7be73daf 22 {
oshin1030 0:23ae7be73daf 23 double t=timer_.read();
oshin1030 0:23ae7be73daf 24 omega_=(count_-pre_count_)*2.0f*M_PI/(multiplication_*resolution_*(t-ptw_));
oshin1030 0:23ae7be73daf 25 pre_count_=count_;
oshin1030 0:23ae7be73daf 26 ptw_=t;
oshin1030 0:23ae7be73daf 27 }
oshin1030 0:23ae7be73daf 28
oshin1030 0:23ae7be73daf 29 double Ec::getOmega()const
oshin1030 0:23ae7be73daf 30 {
oshin1030 0:23ae7be73daf 31 return omega_;
oshin1030 0:23ae7be73daf 32 }
oshin1030 0:23ae7be73daf 33 void Ec::setResolution(int res)
oshin1030 0:23ae7be73daf 34 {
oshin1030 0:23ae7be73daf 35 resolution_=res;
oshin1030 0:23ae7be73daf 36 }
oshin1030 0:23ae7be73daf 37
oshin1030 0:23ae7be73daf 38 /*reset関数の定義*/
oshin1030 0:23ae7be73daf 39 /*エンコーダを初期状態に戻すことができる*/
oshin1030 0:23ae7be73daf 40 void Ec::reset()
oshin1030 0:23ae7be73daf 41 {
oshin1030 0:23ae7be73daf 42 count_=0;
oshin1030 0:23ae7be73daf 43 pre_count_=0,omega_=0;
oshin1030 0:23ae7be73daf 44 ptw_=0;
oshin1030 0:23ae7be73daf 45 timer_.stop();
oshin1030 0:23ae7be73daf 46 timer_.reset();
oshin1030 0:23ae7be73daf 47 timer_.start();
oshin1030 0:23ae7be73daf 48 }
oshin1030 0:23ae7be73daf 49
oshin1030 0:23ae7be73daf 50
oshin1030 0:23ae7be73daf 51 ////////////////////////////////////////////////////1逓倍//////////////////////////////////////////////////////////////////
oshin1030 0:23ae7be73daf 52 Ec1multi::Ec1multi(PinName signalA,PinName signalB,int res) : Ec(res,1),signalA_(signalA),signalB_(signalB)
oshin1030 0:23ae7be73daf 53 {
oshin1030 0:23ae7be73daf 54 signalA_.rise(callback(this,&Ec1multi::upA));
oshin1030 0:23ae7be73daf 55 }
oshin1030 0:23ae7be73daf 56
oshin1030 0:23ae7be73daf 57 //ピン変化割り込み関数の定義
oshin1030 0:23ae7be73daf 58 void Ec1multi::upA()
oshin1030 0:23ae7be73daf 59 {
oshin1030 0:23ae7be73daf 60 if(signalB_.read())count_++;
oshin1030 0:23ae7be73daf 61 else count_--;
oshin1030 0:23ae7be73daf 62 }
oshin1030 0:23ae7be73daf 63 ////////////////////////////////////////////////////2逓倍//////////////////////////////////////////////////////////////////
oshin1030 0:23ae7be73daf 64 Ec2multi::Ec2multi(PinName signalA,PinName signalB,int res) : Ec(res,2),signalA_(signalA),signalB_(signalB)
oshin1030 0:23ae7be73daf 65 {
oshin1030 0:23ae7be73daf 66 signalA_.rise(callback(this,&Ec2multi::upA));
oshin1030 0:23ae7be73daf 67 signalA_.fall(callback(this,&Ec2multi::downA));
oshin1030 0:23ae7be73daf 68 }
oshin1030 0:23ae7be73daf 69
oshin1030 0:23ae7be73daf 70 //ピン変化割り込み関数の定義
oshin1030 0:23ae7be73daf 71 void Ec2multi::upA()
oshin1030 0:23ae7be73daf 72 {
oshin1030 0:23ae7be73daf 73 if(signalB_.read())count_++;
oshin1030 0:23ae7be73daf 74 else count_--;
oshin1030 0:23ae7be73daf 75 }
oshin1030 0:23ae7be73daf 76 void Ec2multi::downA()
oshin1030 0:23ae7be73daf 77 {
oshin1030 0:23ae7be73daf 78 if(signalB_.read())count_--;
oshin1030 0:23ae7be73daf 79 else count_++;
oshin1030 0:23ae7be73daf 80 }
oshin1030 0:23ae7be73daf 81
oshin1030 0:23ae7be73daf 82 ////////////////////////////////////////////////////4逓倍//////////////////////////////////////////////////////////////////
oshin1030 0:23ae7be73daf 83 Ec4multi::Ec4multi(PinName signalA,PinName signalB,int res) : Ec(res,4),signalA_(signalA),signalB_(signalB),pa_(0),pb_(0)
oshin1030 0:23ae7be73daf 84 {
oshin1030 0:23ae7be73daf 85 signalA_.rise(callback(this,&Ec4multi::upA));
oshin1030 0:23ae7be73daf 86 signalA_.fall(callback(this,&Ec4multi::downA));
oshin1030 0:23ae7be73daf 87 signalB_.rise(callback(this,&Ec4multi::upB));
oshin1030 0:23ae7be73daf 88 signalB_.fall(callback(this,&Ec4multi::downB));
oshin1030 0:23ae7be73daf 89 }
oshin1030 0:23ae7be73daf 90 void Ec4multi::upA()
oshin1030 0:23ae7be73daf 91 {
oshin1030 0:23ae7be73daf 92 pa_=1;
oshin1030 0:23ae7be73daf 93 if(pb_==1)count_++;
oshin1030 0:23ae7be73daf 94 else count_--;
oshin1030 0:23ae7be73daf 95 }
oshin1030 0:23ae7be73daf 96 void Ec4multi::downA()
oshin1030 0:23ae7be73daf 97 {
oshin1030 0:23ae7be73daf 98 pa_=0;
oshin1030 0:23ae7be73daf 99 if(pb_==1)count_--;
oshin1030 0:23ae7be73daf 100 else count_++;
oshin1030 0:23ae7be73daf 101 }
oshin1030 0:23ae7be73daf 102 void Ec4multi::upB()
oshin1030 0:23ae7be73daf 103 {
oshin1030 0:23ae7be73daf 104 pb_=1;
oshin1030 0:23ae7be73daf 105 if(pa_==1)count_--;
oshin1030 0:23ae7be73daf 106 else count_++;
oshin1030 0:23ae7be73daf 107 }
oshin1030 0:23ae7be73daf 108 void Ec4multi::downB()
oshin1030 0:23ae7be73daf 109 {
oshin1030 0:23ae7be73daf 110 pb_=0;
oshin1030 0:23ae7be73daf 111 if(pa_==1)count_++;
oshin1030 0:23ae7be73daf 112 else count_--;
oshin1030 0:23ae7be73daf 113 }