QEILibrary
Dependents: MotorIdentification MotorPIcontrol Motor_P_PositionControl
Encoder.cpp
- Committer:
- porizou3
- Date:
- 2019-03-18
- Revision:
- 0:6d62a5947f59
File content as of revision 0:6d62a5947f59:
#include "Encoder.h" Encoder::Encoder(PinName A , PinName B , int pulseNum , float aSample, float vSample) : qei(A , B , NC , pulseNum , QEI::X4_ENCODING) { pulseNum_ = pulseNum; aSample_ = aSample; vSample_ = vSample; initParam(); /* 回転角度計算タイマー割り込み開始 */ AngleTicker.attach(this , &Encoder::calcAngle , aSample_); /* 回転速度計算タイマー割り込み開始 */ VelocityTicker.attach(this , &Encoder::calcVelocity , vSample_); } void Encoder::initParam(void) { qei.reset(); /* 現在の回転角を原点に設定 */ Angle = pAngle = (float)qei.getPulses()/(float)pulseNum_*2.0*PI; Velocity = 0.0; pVelocity = 0.0; } void Encoder::calcAngle(void) { /* エンコーダから回転角を取得 */ Angle = (float)qei.getPulses()/(float)pulseNum_*2.0*PI; } void Encoder::calcVelocity(void) { float dAngle; dAngle = Angle - pAngle ; // 角度の差分を計算 pAngle = Angle ; // 前回の回転角を更新 //while(dAngle > PI){ dAngle -= 2*PI;} //角度の差分の範囲を-π~πにする //while(dAngle <-PI){ dAngle += 2*PI;} /* 速度を計算(回転角の微分 dAngle/Sample_)して、一次LPFに通す 現在の速度 = LPF係数 × 前回の速度 + 現在の速度 × (1 - LPF係数) */ Velocity = LPF * pVelocity + (dAngle/vSample_) * (1.0-LPF); pVelocity = Velocity; //前回の速度を更新 } float Encoder::getVelocity(void) { return Velocity; } int Encoder::getPulses(void) { return qei.getPulses(); } float Encoder::getAngle(void) { return Angle; } float Encoder::getRevolution(void) { return qei.getPulses() / pulseNum_; }