📄 f281xqep.c
字号:
/* ==================================================================================
File name: F281XQEP.C
Description: 光电编码器脉冲计数
=====================================================================================*/
#include "DSP281x_Device.h"
#include "f281xqep.h"
void F281X_EV1_QEP_Init(QEP *p)
{
EvaRegs.CAPCONA.all = QEP_CAP_INIT_STATE; // 设置捕捉单元
EvaRegs.T2CON.all = QEP_TIMER_INIT_STATE; // 设置捕捉时钟
EvaRegs.T2PR = 4*p->LineEncoder; // 初始化Timer 1寄存器
EvaRegs.EVAIFRC.bit.CAP3INT = 1; // 清除 CAP3 标志位
EvaRegs.EVAIMRC.bit.CAP3INT = 1; // 使能 CAP3 中断
EALLOW; // 开写保护
GpioMuxRegs.GPAMUX.all |= 0x0700; // 设置捕捉管脚
EDIS; // 关写保护
}
void F281X_EV1_QEP_Calc(QEP *p)
{
int32 Tmp;
// 检查旋转方向
p->DirectionQep = 0x4000&EvaRegs.GPTCONA.all;
p->DirectionQep = p->DirectionQep>>14;
// 检查QEP Timer 2计数器
p->RawTheta = EvaRegs.T2CNT + p->CalibratedAngle;
// 计算机械角为Q15格式
Tmp = __qmpy32by16(p->MechScaler,p->RawTheta,31); // Q15 = Q30*Q0
p->MechTheta = (int16)(Tmp); // Q15 -> Q15
p->MechTheta &= 0x7FFF; // Wrap around 0x07FFF
// 计算电角度为Q15格式
p->ElecTheta = p->PolePairs*p->MechTheta; // Q0*Q15 = Q15
p->ElecTheta &= 0x7FFF; // Wrap around 0x07FFF
}
void F281X_EV1_QEP_Isr(QEP *p)
{
p->QepCountIndex = EvaRegs.T2CNT; // 设置时钟2计数器为机械角度值
EvaRegs.T2CNT = 0; // 设置时钟2计数器
p->IndexSyncFlag = 0x00F0; // 设置同步脉冲标记
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -