📄 qep.c
字号:
#include "DSP28_Device.h"
#include "qep.h"
#include "f28xbmsk.h"
void qep_init(QEP *p)
{
EvaRegs.CAPCON.all = 0x9004; /* Set up capture units */
// EvaRegs.T2CON.all = 0x9870; /* Set up capture timer */
// EvaRegs.T2PR = 0xFFFF;
EvaRegs.T2PR=0xffff; //设置定时器周期 4000防止溢出 4096?
EvaRegs.T2CNT=0; //设置定时器起始值
EvaRegs.T2CON.all=0x9870; //设置定时器状态 定向增减模式 禁止比较操作
//输入时钟定标参数HSPCLK/1 QEP作为时钟源
// EvaRegs.T2CON.all = QEP_TIMER_INIT_STATE; 0x9870
// EvaRegs.EVAIFRC.bit.CAP3INT = 1; /* Clear CAP3 flag */
// EvaRegs.EVAIMRC.bit.CAP3INT = 1; /* Enable CAP3 Interrupt*/
EALLOW;
GpioMuxRegs.GPAMUX.all |= 0x0700; /* Set up the capture pins to primary functions */
EDIS;
}
void qep_calc(QEP *p)
{
long tmp;
p->dir_QEP = 0x4000&EvaRegs.GPTCONA.all;
p->dir_QEP = p->dir_QEP>>14;
p->theta_raw = EvaRegs.T2CNT + p->cal_angle;
tmp = (long)((long)p->theta_raw*(long)p->mech_scaler); /* Q0*Q26 = Q26 */
tmp &= 0x03FFF800; // 原程序为0x03FFF000
p->theta_mech = (int)(tmp>>11); /* Q26 -> Q15 T2CNT过大会使tmp>>11后仍大于65535 产生错误 解决方法 中断qep_isr 或者可以试试wang中的方法*/
p->theta_mech &= 0x7FFF;
p->theta_elec = p->pole_pairs*p->theta_mech; /* Q0*Q15 = Q15 */
p->theta_elec &= 0x7FFF;
// if(EvaRegs.T2CNT==4000)
/* if(p->theta_raw==4000) // cal_angle is considered to be zero or 4096?
EvaRegs.T2CNT=0;
*/
}
/*void qep_isr(QEP *p)
{
// p->QEP_cnt_idx = EvaRegs.T2CNT;
EvaRegs.T2CNT = 0;
// p->index_sync_flag = 0x00F0;
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -