2 Phase different signals rotational encoder library 2相位相差型ロータリーエンコーダ用ライブラリ。 絶対値パルス関数。相対値(前回読み出しからの差)パルス出力関数。秋月電子のEC12PLRGBSDVBF-D-25K-24-24C-61で動作確認した。http://akizukidenshi.com/catalog/g/gP-05773/

Dependents:   RotationalEncoder_Hello

example program

Import programRotationalEncoder_Hello

RotationalEncoder library's example program

Committer:
suupen
Date:
Sun Oct 23 03:44:28 2016 +0000
Revision:
2:0102de0ec7a7
Parent:
1:57c43aac7007
include comment to example program code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
suupen 1:57c43aac7007 1 /**
suupen 1:57c43aac7007 2 * rotational encoder Library
suupen 1:57c43aac7007 3 */
suupen 1:57c43aac7007 4
suupen 1:57c43aac7007 5 #include "RotationalEncoder.h"
suupen 1:57c43aac7007 6
suupen 1:57c43aac7007 7 /**
suupen 1:57c43aac7007 8 *
suupen 1:57c43aac7007 9 */
suupen 1:57c43aac7007 10 RotationalEncoder::RotationalEncoder(PinName channelA,
suupen 1:57c43aac7007 11 PinName channelB
suupen 1:57c43aac7007 12 ) : _channelA(channelA), _channelB(channelB)
suupen 1:57c43aac7007 13 {
suupen 1:57c43aac7007 14
suupen 1:57c43aac7007 15 _absolutePulse = 0;
suupen 1:57c43aac7007 16 _relativePulse = 0;
suupen 1:57c43aac7007 17
suupen 1:57c43aac7007 18 _channelA.mode(PullUp);
suupen 1:57c43aac7007 19 _channelB.mode(PullUp);
suupen 1:57c43aac7007 20
suupen 1:57c43aac7007 21 _channelBLevelOfchannelALow = INITAL;
suupen 1:57c43aac7007 22
suupen 1:57c43aac7007 23 _channelA.rise(this, &RotationalEncoder::encoderAUp);
suupen 1:57c43aac7007 24 _channelA.fall(this, &RotationalEncoder::encoderADwon);
suupen 1:57c43aac7007 25
suupen 1:57c43aac7007 26
suupen 1:57c43aac7007 27 }
suupen 1:57c43aac7007 28
suupen 1:57c43aac7007 29 void RotationalEncoder::reset(void)
suupen 1:57c43aac7007 30 {
suupen 1:57c43aac7007 31 _absolutePulse = 0;
suupen 1:57c43aac7007 32 _relativePulse = 0;
suupen 1:57c43aac7007 33 getRelativePulses();
suupen 1:57c43aac7007 34 }
suupen 1:57c43aac7007 35
suupen 1:57c43aac7007 36
suupen 1:57c43aac7007 37 int16_t RotationalEncoder::getAbsolutePulses(void)
suupen 1:57c43aac7007 38 {
suupen 1:57c43aac7007 39
suupen 1:57c43aac7007 40 return _absolutePulse;
suupen 1:57c43aac7007 41
suupen 1:57c43aac7007 42 }
suupen 1:57c43aac7007 43
suupen 1:57c43aac7007 44 int16_t RotationalEncoder::getRelativePulses(void)
suupen 1:57c43aac7007 45 {
suupen 1:57c43aac7007 46 static int16_t beforeAbsolutePulse = 0;
suupen 1:57c43aac7007 47 int16_t temp = _absolutePulse;
suupen 1:57c43aac7007 48
suupen 1:57c43aac7007 49 _relativePulse = temp - beforeAbsolutePulse;
suupen 1:57c43aac7007 50 beforeAbsolutePulse = temp;
suupen 1:57c43aac7007 51
suupen 1:57c43aac7007 52 return _relativePulse;
suupen 1:57c43aac7007 53
suupen 1:57c43aac7007 54 }
suupen 1:57c43aac7007 55
suupen 1:57c43aac7007 56
suupen 1:57c43aac7007 57 void RotationalEncoder::encoderAUp(void)
suupen 1:57c43aac7007 58 {
suupen 1:57c43aac7007 59 if((_channelBLevelOfchannelALow == INITAL) ||
suupen 1:57c43aac7007 60 (_channelBLevelOfchannelALow == _channelB.read())
suupen 1:57c43aac7007 61 ) {
suupen 1:57c43aac7007 62 return;
suupen 1:57c43aac7007 63 }
suupen 1:57c43aac7007 64
suupen 1:57c43aac7007 65 if(_channelB.read() == 0) {
suupen 1:57c43aac7007 66 _absolutePulse++;
suupen 1:57c43aac7007 67
suupen 1:57c43aac7007 68 } else {
suupen 1:57c43aac7007 69 _absolutePulse--;
suupen 1:57c43aac7007 70
suupen 1:57c43aac7007 71 }
suupen 1:57c43aac7007 72
suupen 1:57c43aac7007 73 }
suupen 1:57c43aac7007 74
suupen 1:57c43aac7007 75 void RotationalEncoder::encoderADwon(void)
suupen 1:57c43aac7007 76 {
suupen 1:57c43aac7007 77 _channelBLevelOfchannelALow = _channelB.read();
suupen 1:57c43aac7007 78 }