DSP28335 2812 xqep

/* =================================================================================
File name: F280XQEP.C

Originator: Digital Control Systems Group
Texas Instruments

Description: This file contains source for the QEP drivers for the F280X

Target: TMS320F280x family

====================================================================================
History:
-------------------------------------------------------------------------------------
04-15-2005 Version 3.20: Using DSP280x v. 1.10 or higher
----------------------------------------------------------------------------------*/

#include "DSP280x_Device.h"
#include "f280xqep.h"

void F280X_QEP_Init(QEP *p)
{

EQep1Regs.QDECCTL.all = QDECCTL_INIT_STATE;
EQep1Regs.QEPCTL.all = QEPCTL_INIT_STATE;
EQep1Regs.QPOSCTL.all = QPOSCTL_INIT_STATE;
EQep1Regs.QUPRD = 1000000; // Unit Timer for 100Hz
EQep1Regs.QCAPCTL.all = QCAPCTL_INIT_STATE;
EQep1Regs.QPOSMAX = 4*p->LineEncoder;

EALLOW; // Enable EALLOW
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; // GPIO20 is EQEP1A
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1; // GPIO21 is EQEP1B
GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 1; // GPIO23 is EQEP1I
EDIS; // Disable EALLOW

}


void F280X_QEP_Calc(QEP *p)
{

// Check the rotational direction
p->DirectionQep = EQep1Regs.QEPSTS.bit.QDF;

// Check the position counter for EQEP1
p->RawTheta = EQep1Regs.QPOSCNT + p->CalibratedAngle;

if (p->RawTheta < 0)
p->RawTheta = p->RawTheta + EQep1Regs.QPOSMAX;
else if (p->RawTheta > EQep1Regs.QPOSMAX)
p->RawTheta = p->RawTheta - EQep1Regs.QPOSMAX;

// Compute the mechanical angle in Q24
p->MechTheta = __qmpy32by16(p->MechScaler,(int16)p->RawTheta,31); // Q15 = Q30*Q0
p->MechTheta &= 0x7FFF; // Wrap around 0x07FFF
p->MechTheta <<= 9; // Q15 -> Q24

// Compute the electrical angle in Q24
p->ElecTheta = p->PolePairs*p->MechTheta; // Q24 = Q0*Q24
p->ElecTheta &= 0x00FFFFFF; // Wrap around 0x00FFFFFF

// Check an index occurrence
if (EQep1Regs.QFLG.bit.IEL == 1)
{
p->IndexSyncFlag = 0x00F0;
p->QepCountIndex = EQep1Regs.QPOSILAT;
EQep1Regs.QCLR.bit.IEL = 1; // Clear interrupt flag
}

// Check unit Time out-event for speed calculation:
// Unit Timer is configured for 100Hz in INIT function
if(EQep1Regs.QFLG.bit.UTO == 1)
{
//**** Low Speed Calculation ****//
if((EQep1Regs.QEPSTS.bit.COEF || EQep1Regs.QEPSTS.bit.CDEF))
{ // Capture Counter overflowed, hence do no compute speed
EQep1Regs.QEPSTS.all = 0x000C;
}
else
// Comp

ute lowspeed using capture counter value
p->QepPeriod = EQep1Regs.QCPRDLAT;
}

}



相关文档
最新文档