📄 电动机位置检测.c
字号:
#include "DSP28_Device.h"
#include "f28xqep.h"
#include "f28xbmsk.h"
void F28X_EV1_QEP_Init(QEP *p)
{
EvaRegs.CAPCON.all = QEP_CAP_INIT_STATE; /*设置捕捉单元 */
EvaRegs.T2CON.all = QEP_TIMER_INIT_STATE; /*设置捕捉定时器*/
EvaRegs.T2PR = 0xFFFF;
EvaRegs.EVAIFRC.bit.CAP3INT = 1; /*清除CAP3标志*/
EvaRegs.EVAIMRC.bit.CAP3INT = 1; /*使能CAP3中断*/
GpioMuxRegs.GPAMUX.all |= 0x0700; /*配置捕捉单元的引脚*/
}
void F28X_EV1_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)(p->theta_raw*p->mech_scaler); /* Q0*Q26 = Q26 */
tmp &= 0x03FFF000;
p->theta_mech = (int)(tmp>>11); /* Q26 -> Q15 */
p->theta_mech &= 0x7FFF;
p->theta_elec = p->pole_pairs*p->theta_mech; /* Q0*Q15 = Q15 */
p->theta_elec &= 0x7FFF;
}
void F28X_EV1_QEP_Isr(QEP *p)
{
p->QEP_cnt_idx = EvaRegs.T2CNT;
EvaRegs.T2CNT = 0;
p->index_sync_flag = 0x00F0;
}
//******************************************************************************
// TMS320F2812电动机位置检测 QEP电路初始化参数及函数定义
// 文件名称:F28XQEP.H
//******************************************************************************
#ifndef __F28X_QEP_H__
#define __F28X_QEP_H__
#include "f28xbmsk.h"
/* 初始化T2CON和CAPCON */
#define QEP_CAP_INIT_STATE 0x9004
#define QEP_TIMER_INIT_STATE (FREE_RUN_FLAG + \
TIMER_DIR_UPDN + \
TIMER_CLK_PRESCALE_X_1 + \
TIMER_ENABLE_BY_OWN + \
TIMER_ENABLE + \
TIMER_CLOCK_SRC_QEP + \
TIMER_COMPARE_LD_ON_ZERO)
/* 定义QEP (正交编码电路) 驱动的对象 */
typedef struct {int theta_elec; /* 输出: 电动机电角度(Q15) */
int theta_mech; /* 输出: 电动机机械角度(Q15) */
int dir_QEP; /* 输出: 电动机转动方向 (Q0) */
int QEP_cnt_idx; /* 变量: 编码器计数(Q0) */
int theta_raw; /* 变量: 定时器2得出的角度(Q0) */
int mech_scaler; /* 参数: 0.9999/计数最大值,计数最大值 = 4000 (Q26) */
int pole_pairs; /* 参数: 极对数(Q0) */
int cal_angle; /* 参数: 编码器和相之间的角度偏移量 (Q0) */
int index_sync_flag; /* 输出: Index sync status (Q0) */
void (*init)(); /* 初始化函数指针 */
void (*calc)(); /* 计算函数指针 */
void (*isr)(); /* 中断程序指针 */
} QEP;
/* 定义一个QEP_handle */
typedef QEP *QEP_handle;
#define QEP_DEFAULTS { 0x0, 0x0,0x0,0x0,0x0,16776,2,-2365,0x0, \
(void (*)(long))F28X_EV1_QEP_Init, \
(void (*)(long))F28X_EV1_QEP_Calc, \
(void (*)(long))F28X_EV1_QEP_Isr }
void F28X_EV1_QEP_Init(QEP_handle);
void F28X_EV1_QEP_Calc(QEP_handle);
void F28X_EV1_QEP_Isr(QEP_handle);
#endif /* __F28X_QEP_H__ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -