- 积分
- 94
- 回帖
- 0
- 西莫币
-
- 贡献
-
- 威望
-
- 存款
-
- 阅读权限
- 5
- 最后登录
- 1970-1-1
该用户从未签到
|
楼主 |
发表于 2011-9-5 13:03
|
显示全部楼层
电机位置检测:
#include "DSP28_Device.h"
#include "f28xqep.h"
#include "f28xbmsk.h"
void F28X_EV1_QEP_Init(QEP *p)
{
EvaRegs.CAPCON.all = 0x9004; /*设置捕捉单元 */
EvaRegs.T2CON.all = 0x9872; /*设置捕捉定时器*/
EvaRegs.T2PR = p->
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__ */
上面为QEP 头文件
我在主函数里面 我问过旋转变压器产商 它们的解码板 输出的是1024个脉冲,因此QEP脉冲为4*1024=4096
里面的偏移角 cal_angle 我随便设的 |
|