⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f280xqep.c

📁 DSP280X芯片的编程简单例子
💻 C
字号:
/* =================================================================================
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
   			// Compute lowspeed using capture counter value
   			p->QepPeriod = EQep1Regs.QCPRDLAT;
    }

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -