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.
Dependents: Nucleo_Motor Nucleo_Motor mbed_test_enc mbed_touteki_MR1 ... more
Fork of QEI2 by
QEI.cpp
- Committer:
- kikoaac
- Date:
- 2015-07-21
- Revision:
- 2:6a38785d5f0c
- Parent:
- 1:1f4e8614d0ed
- Child:
- 3:f285adb565b1
File content as of revision 2:6a38785d5f0c:
#include "QEI.h"
QEI::QEI(PinName channelA,
PinName channelB,
PinName index,
int pulsesPerRev,
Encoding encoding
) : channelA_(channelA), channelB_(channelB),
index_(index) {
pulses_ = 0;
revolutions_ = 0;
pulsesPerRev_ = pulsesPerRev;
encoding_ = encoding;
//Workout what the current state is.
int chanA = channelA_.read();
int chanB = channelB_.read();
//2-bit state.
currState_ = (chanA << 1) | (chanB);
prevState_ = currState_;
channelA_.rise(this, &QEI::encode);
channelA_.fall(this, &QEI::encode);
if (encoding == X4_ENCODING) {
channelB_.rise(this, &QEI::encode);
channelB_.fall(this, &QEI::encode);
}
if (index != NC) {
index_.rise(this, &QEI::index);
}
}
void QEI::state(int i)
{
if(i==1)
{
channelA_.disable_irq();
channelB_.disable_irq();
}
else if(i==0)
{
channelA_.enable_irq();
channelB_.enable_irq();
}
}
void QEI::reset(void) {
pulses_ = 0;
revolutions_ = 0;
round_rev = 0;
sumangle = angle_ =0;
}
void QEI::set(int pul , int rev) {
pulses_ = pul;
revolutions_ = rev;
}
int QEI::getCurrentState(void) {
return currState_;
}
int QEI::getPulses(void) {
return pulses_;
}
int QEI::getRevolutions(void) {
return revolutions_;
}
double QEI::getAngle()
{
return angle_;
}
int QEI::getAng_rev()
{
return round_rev;
}
double QEI::getSumangle()
{
return sumangle;
}
double QEI::getRPM()
{
static double prev_angle;
Mper.stop();
RPM = (sumangle - prev_angle) / Mper.read() * 60.0 / 360;
Mper.reset();
Mper.start();
prev_angle = sumangle;
return RPM;
}
double QEI::getRPS()
{
static double prev_angle;
Rper.stop();
RPS = (sumangle - prev_angle) / Rper.read() / 360;
Rper.reset();
Rper.start();
prev_angle = sumangle;
return RPS;
}
double QEI::getRPMS()
{ static double prev_angle;
MSper.stop();
RPMS = (sumangle - prev_angle) / (double)MSper.read_ms() / 360;
MSper.reset();
MSper.start();
prev_angle = sumangle;
return RPMS;
}
double QEI::getRPUS()
{ static double prev_angle;
USper.stop();
RPUS = (sumangle - prev_angle) / (double)USper.read_us() / 360;
USper.reset();
USper.start();
prev_angle = sumangle;
return RPUS;
}
void QEI::encode(void) {
NVIC_DisableIRQ( I2C_IRQn ) ;
int change = 0;
int chanA = channelA_.read();
int chanB = channelB_.read();
//printf("QEI\n");
currState_ = (chanA << 1) | (chanB);
if (encoding_ == X2_ENCODING) {
if ((prevState_ == 0x3 && currState_ == 0x0) ||
(prevState_ == 0x0 && currState_ == 0x3)) {
pulses_++;
angle_pulses++;
}
else if ((prevState_ == 0x2 && currState_ == 0x1) ||
(prevState_ == 0x1 && currState_ == 0x2)) {
pulses_--;
angle_pulses--;
}
} else if (encoding_ == X4_ENCODING) {
if (((currState_ ^ prevState_) != INVALID) && (currState_ != prevState_)) {
change = (prevState_ & PREV_MASK) ^ ((currState_ & CURR_MASK) >> 1);
if (change == 0) {
change = -1;
}
pulses_ -= change;
angle_pulses -= change;
}
}
angle_ = angle_pulses*360/((double)pulsesPerRev_*4);
sumangle = pulses_*360/((double)pulsesPerRev_*4);
if(angle_>=360)
{
angle_pulses = angle_ = 0;
round_rev++;
}
else if(angle_<=-360)
{
angle_pulses = angle_ = 0;
round_rev--;
}
prevState_ = currState_;
NVIC_EnableIRQ( I2C_IRQn ) ;
}
void QEI::index(void) {
revolutions_++;
}
