Chapter 6 - QEI Module
Chapter 6 - QEI Module
Chapter 6 - QEI Module
CHAPTER 6
QEI
QUADRATURE ENCODER INTERFACE
HCMUT - 2011
QEI
What is QEI?
- A Quadrature Encoder (or incremental encoder, or optical
encoder) is used to detect the position and speed of rotors,
enabling closed loop control in many motor control applications
like switched reluctance and induction motors.
Encoder structure
2
2011 – Vo Tuong Quan
QEI
Encoder structure
4
2011 – Vo Tuong Quan
QEI
INITIALIZING THE QEI MODULE
ENABLE DIGITAL FILTERS
- Enabling the digital filters is desirable to filter any possible
glitches on the incremental encoder signals.
- if and only if three consecutive samples have the same value
the input is considered stable and the value is output from the
filter
QEI Filter
5
2011 – Vo Tuong Quan
QEI
CALCULATE THE MINIMUM PULSE WIDTH
6
2011 – Vo Tuong Quan
QEI
QUADRATURE DECODER
Determine the direction of rotation looking at the two
incoming phase signals, and generate the clock that will be
used by the position counter.
• (x2) mode: the decoder only generates a clock impulse at the
rising and falling edges of Phase A signal.
• (x4) mode: the clock pulses are generate at each edge of
phase A and Phase B.
The position counter can be reset either by the index pulse
coming from the encoder or by the matching of the current
position counter value with the number in the Maximum Count
Register
7
2011 – Vo Tuong Quan
QEI
QEI in x4 mode
8
2011 – Vo Tuong Quan
QEI
POSITION COUNTER
The position counter can be used either for position or speed
measurement.
To measure motor position, we must know the relationship
between the displacement and the number of phase pulses we
get from the encoder.
For speed measurement application, the time interval
between two index pulses or count match events gives a
measure of the angular velocity.
9
2011 – Vo Tuong Quan
QEI
MCU with QEI module
10
2011 – Vo Tuong Quan
QEI
#include <p30f4011.h> Example code
#include <pwm.h>
#include <qei.h>
void QEI_Init()
{
ADPCFG = 0xFFFF; // Configure QEI pins as digital inputs
QEICONbits.QEIM = 1; // (bit 10-8 Disable QEI Module) x4 mode
QEICONbits.QEISIDL = 0; // bit 13 Continue operation during sleep
QEICONbits.SWPAB = 0; // bit 7 QEA and QEB not swapped
QEICONbits.PCDOUT = 0; // bit 6 Normal I/O pin operation
QEICONbits.TQGATE= 1; // bit 5 Timer gated time accumulation disabled
QEICONbits.TQCKPS= 0; // bit 4-3 Timer Input Clock Prescale Select bits
12
2011 – Vo Tuong Quan
QEI
PID Code for motor control
// PID Code for motor control
void pid_cal()
{
EncoderCount = POSCNT - Count;
Count = POSCNT;
mposition += EncoderCount ;
e = position - mposition ;
Ypid = ceilf(e*Kp) ;
Intergral =Intergral + e;
Ypid = Ypid + ceilf(Ki*Intergral);
Ypid = Ypid + ceilf(Kd*EncoderCount);//Duty cycle
if Ypid > max
Ypid = max;
if Ypid < min
Ypid = min;
PDC1 = PDC2 = Ypid;
}
13
2011 – Vo Tuong Quan
QEI
PID Code for motor control
// PID Code for motor control
void pid_cal()
{
EncoderCount = POSCNT - Count;
Count = POSCNT;
mposition = mposition +EncoderCount ;
e = position - mposition ;
Intergral =Intergral + e;
Ypid = ceilf(e*Kp) + ceilf(Ki*Intergral)+ceilf(Kd*EncoderCount);
u= Ypid
if u > maxPID
u = maxPID;
if u< min
u = minPID;
PDC1 = PDC2 = u;
}
14
2011 – Vo Tuong Quan