?? 電動機位置檢測.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; /*設(shè)置捕捉單元 */
EvaRegs.T2CON.all = QEP_TIMER_INIT_STATE; /*設(shè)置捕捉定時器*/
EvaRegs.T2PR = 0xFFFF;
EvaRegs.EVAIFRC.bit.CAP3INT = 1; /*清除CAP3標(biāo)志*/
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電路初始化參數(shù)及函數(shù)定義
// 文件名稱: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 (正交編碼電路) 驅(qū)動的對象 */
typedef struct {int theta_elec; /* 輸出: 電動機電角度(Q15) */
int theta_mech; /* 輸出: 電動機機械角度(Q15) */
int dir_QEP; /* 輸出: 電動機轉(zhuǎn)動方向 (Q0) */
int QEP_cnt_idx; /* 變量: 編碼器計數(shù)(Q0) */
int theta_raw; /* 變量: 定時器2得出的角度(Q0) */
int mech_scaler; /* 參數(shù): 0.9999/計數(shù)最大值,計數(shù)最大值 = 4000 (Q26) */
int pole_pairs; /* 參數(shù): 極對數(shù)(Q0) */
int cal_angle; /* 參數(shù): 編碼器和相之間的角度偏移量 (Q0) */
int index_sync_flag; /* 輸出: Index sync status (Q0) */
void (*init)(); /* 初始化函數(shù)指針 */
void (*calc)(); /* 計算函數(shù)指針 */
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__ */
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -