![Microchip Technology AN908 Using Manual Download Page 45](http://html1.mh-extra.com/html/microchip-technology/an908/an908_using-manual_1785807045.webp)
2004 Microchip Technology Inc.
DS00908A-page 45
AN908
;Parameters:
;
Input arguments
None
;
;
Return:
;
Void
;
;
SFR Settings required
None
;
;
Support routines required:
None
;
;
Local Stack usage:
3
;
;
Registers modified:
None
;
;
Timing:
About 29 instruction cycles (if new iDeltaCnt produced)
;
;=====================================================
; Equivalent C code
;
{
;
register short Pos, Delta;
;
;
Pos = POSCNT;
;
;
Delta = Pos - EncoderParm.iPrevCnt;
;
EncoderParm.iPrevCnt = Pos;
;
;
if( iDelta >= 0 )
;
{
;
// Delta > 0 either because
;
//
1) vel is > 0 or
;
//
2) Vel < 0 and encoder wrapped around
;
;
if( Delta >= EncoderParm.iCntsPerRev/2 )
;
{
;
// Delta >= EncoderParm.iCntsPerRev/2 => Neg speed, wrapped around
;
;
Delta -= EncoderParm.iCntsPerRev;
;
}
;
}
;
else
;
{
;
// Delta < 0 either because
;
//
1) vel is < 0 or
;
//
2) Vel > 0 and wrapped around
;;
;
if( Delta < -EncoderParm.iCntsPerRev/2 )
;
{
;
// Delta < -EncoderParm.iCntsPerRev/2 => Pos vel, wrapped around
;
;
Delta += EncoderParm.iCntsPerRev;
;
}
;
}
;
;
EncoderParm.iAc= Delta;
;
;
EncoderParm.iVelCntDwn--;
;
if(EncoderParm.iVelCntDwn)
;
return;
;
;
iVelCntDwn = iIrpPerCalc;
;
qVelMech = qKvel * iAccumCnt * 2^Nvel;
;
EncoderParm.iAccumCnt = 0;
;}