DSP的EQEP的例程代码讲解
时间: 2024-02-09 15:12:23 浏览: 60
EQEP是一种用于运动控制应用的接口,可以用于测量旋转位置、速度和加速度。下面是一个基于TMS320F28379D的DSP的EQEP的例程代码讲解:
```c
#include "F2837xD_device.h"
#include "F2837xD_pievect.h"
//定义EQEP1的寄存器地址
#define EQEP1_QPOSCNT EQEP1Regs.QPOSCNT
#define EQEP1_QPOSINIT EQEP1Regs.QPOSINIT
#define EQEP1_QPOSMAX EQEP1Regs.QPOSMAX
#define EQEP1_QEPCTL EQEP1Regs.QEPCTL
#define EQEP1_QCAPCTL EQEP1Regs.QCAPCTL
#define EQEP1_QPOSILAT EQEP1Regs.QPOSILAT
#define EQEP1_QPOSSLAT EQEP1Regs.QPOSSLAT
#define EQEP1_QPOSLAT EQEP1Regs.QPOSLAT
#define EQEP1_QCTMR EQEP1Regs.QCTMR
#define EQEP1_QCPRD EQEP1Regs.QCPRD
#define EQEP1_QCTMRLAT EQEP1Regs.QCTMRLAT
#define EQEP1_QCPRDLAT EQEP1Regs.QCPRDLAT
//定义EQEP1的计数器值
uint32_t eqep1_count = 0;
//EQEP1初始化函数
void EQEP1_Init(void)
{
//设置EQEP模块为位置计数器模式
EQEP1_QEPCTL.bit.QPEN = 0;
EQEP1_QEPCTL.bit.QCLM = 1;
EQEP1_QEPCTL.bit.UTE = 1;
EQEP1_QEPCTL.bit.QPEN = 1;
//设置捕获模式为单次捕获
EQEP1_QCAPCTL.bit.CEN = 0;
EQEP1_QCAPCTL.bit.CCPS = 7;
EQEP1_QCAPCTL.bit.UPPS = 2;
EQEP1_QCAPCTL.bit.SWFSYNC = 1;
EQEP1_QCAPCTL.bit.CEN = 1;
//初始化计数器值
EQEP1_QPOSCNT = 0;
}
//EQEP1中断服务函数
interrupt void EQEP1_ISR(void)
{
//判断是否为捕获中断
if(EQEP1_QFLG.bit.PCR == 1)
{
//获取捕获寄存器值
eqep1_count = EQEP1_QCPRDLAT;
//清除捕获中断标志位
EQEP1_QCLR.bit.PCR = 1;
}
//清除所有中断标志位
EQEP1_QCLR.all = 0xFFFF;
//结束中断服务函数
PieCtrlRegs.PIEACK.all = PIEACK_GROUP5;
}
int main(void)
{
//初始化系统时钟
InitSysCtrl();
//初始化EQEP1
EQEP1_Init();
//使能EQEP1中断
PieCtrlRegs.PIEIER5.bit.INTx1 = 1;
IER |= M_INT5;
//启用全局中断
EINT;
while(1)
{
}
}
```
上述代码实现了EQEP1的初始化和中断服务函数。在初始化函数中,首先将EQEP模块设置为位置计数器模式,然后设置捕获模式为单次捕获。在中断服务函数中,首先判断是否为捕获中断,如果是,则获取捕获寄存器的值并清除捕获中断标志位。最后,清除所有中断标志位并结束中断服务函数。
在主函数中,首先初始化系统时钟和EQEP1,然后使能EQEP1中断。最后,启用全局中断并进入死循环。
需要注意的是,EQEP1的寄存器地址和计数器值需要根据具体的芯片型号进行修改。同时,为了使EQEP1的中断服务函数得到正确的处理,需要在中断向量表中设置EQEP1_ISR函数的入口地址。