1. TMS320F28377D eQEP 모듈 개요
TI의 TMS320F28377D는 C2000 Delfino 시리즈의 32비트 마이크로컨트롤러로, 모터 제어 및 엔코더 기반 위치/속도 감지에 최적화된 eQEP(Enhanced Quadrature Encoder Pulse) 모듈을 제공합니다. eQEP 모듈은 로터리 엔코더 또는 리니어 엔코더 신호를 처리하여 위치, 방향, 속도를 측정합니다. 이 문서에서는 eQEP 모듈의 설정 방법, Bitfield 구조를 활용한 레지스터 설정, 그리고 실용적인 예제 코드를 제공하여 초보자와 숙련된 개발자 모두가 쉽게 활용할 수 있도록 돕겠습니다.
주요 사양
- 모듈 수: 최대 3개 독립적인 eQEP 모듈(eQEP1~eQEP3)
- 입력 신호:
- QEPA, QEPB (직교 펄스 신호)
- QEPI (인덱스 펄스)
- QEPS (스트로브 신호)
- 클럭 소스: 시스템 클럭(SYSCLK, 최대 200MHz)
- 카운터: 32비트 위치 카운터(QPOSCNT)
- 모드:
- 직교 펄스 카운트 모드 (Quadrature Count)
- 방향 카운트 모드 (Direction Count)
- 업/다운 카운트 모드
- 주요 기능:
- 위치 측정 (최대 4배 해상도)
- 속도 계산 (단위 시간 또는 이벤트 기반)
- 인터럽트 지원 (위치, 타이머, 캡처 등)
- 워치독 타이머
- 단위 타이머(Unit Timer)로 속도 계산
- 인터럽트: 위치 카운터 이벤트, 타이머 만료, 인덱스 이벤트 등
- 응용 분야: 모터 제어, 로봇 공학, 위치/속도 피드백 시스템
2. eQEP Bitfield 설정 상세
eQEP 레지스터는 Bitfield 구조로 정의되어 있으며, F2837xD_eqep.h 헤더 파일을 통해 접근합니다. 주요 레지스터와 Bitfield는 다음과 같습니다:
2.1 QPOSCTL (위치 카운터 제어 레지스터)
- bit.PCEN: 위치 비교 활성화 (1: 활성화)
- bit.PCSHDW: 섀도우 모드 활성화 (1: 섀도우)
- bit.PCMODE: 비교 모드 (0: 위치 비교, 1: 펄스 폭 비교)
2.2 QDECCTL (디코더 제어 레지스터)
- bit.QSRC: 카운터 소스 (0: 직교 펄스, 1: 방향 카운트)
- bit.SWAP: QEPA/QEPB 스왑 (1: 스왑)
- bit.IGATE: 인덱스 게이팅 (0: 비활성화, 1: 활성화)
- bit.QAP: QEPA 극성 (0: 정상, 1: 반전)
2.3 QEPCTL (eQEP 제어 레지스터)
- bit.FREE_SOFT: 동작 모드 (2: Free Run)
- bit.QPEN: eQEP 모듈 활성화 (1: 활성화)
- bit.IEI: 인덱스 이벤트 초기화 (0: 비활성화, 1: 상승 에지)
- bit.UTIME: 단위 타이머 활성화 (1: 활성화)
2.4 QCAPCTL (캡처 제어 레지스터)
- bit.CEN: 캡처 활성화 (1: 활성화)
- bit.UPPS: 단위 위치 이벤트 분주비 (0
15, 1/11/32768) - bit.CCPS: 캡처 클럭 분주비 (0
7, 1/11/128)
2.5 QINT (인터럽트 제어 레지스터)
- bit.PCE: 위치 카운터 에러 인터럽트 (1: 활성화)
- bit.QMAE: 직교 모드 에러 인터럽트 (1: 활성화)
- bit.UIE: 단위 타이머 인터럽트 (1: 활성화)
- bit.IEL: 인덱스 이벤트 인터럽트 (1: 활성화)
Bitfield 사용 이점
- 명확한 비트 단위 설정으로 실수 감소
- 코드 가독성 및 유지보수성 향상
- F2837xD_eqep.h에서 제공하는 구조체로 직관적 접근
3. eQEP 설정 절차
eQEP 모듈을 효과적으로 설정하려면 다음 단계를 따릅니다:
- 시스템 초기화:
- InitSysCtrl() 호출로 시스템 클럭과 PLL 초기화
- 인터럽트 비활성화 및 PIE 초기화 (DINT, InitPieCtrl, InitPieVectTable)
- eQEP 클럭 활성화:
- CpuSysRegs.PCLKCR4.bit.EQEPx = 1로 원하는 eQEP 모듈(x=1~3) 클럭 활성화
- 보호된 레지스터 접근을 위해 EALLOW와 EDIS 사용
- GPIO 설정:
- GpioCtrlRegs.GPAMUXx로 QEPA, QEPB, QEPI 핀 설정
- 예: GPIO20/21/23을 eQEP1A/1B/1I로 설정
- 디코더 설정:
- QDECCTL.bit.QSRC로 카운터 소스 선택 (보통 직교 펄스)
- QDECCTL.bit.QAP, QDECCTL.bit.QBP로 신호 극성 설정
- 위치 카운터 설정:
- QPOSMAX로 최대 카운터 값 설정 (엔코더 분해능 기반)
- QPOSINIT로 초기 위치 값 설정
- 단위 타이머 설정 (속도 계산용):
- QUPRD로 단위 타이머 주기 설정
- QCAPCTL.bit.UPPS로 단위 위치 이벤트 분주비 설정
- 인터럽트 설정 (필요 시):
- QINT.bit.UIE로 단위 타이머 인터럽트 활성화
- QINT.bit.IEL로 인덱스 이벤트 인터럽트 활성화
- 모듈 활성화:
- QEPCTL.bit.QPEN = 1로 eQEP 모듈 활성화
- QEPCTL.bit.FREE_SOFT = 2로 Free Run 모드 설정
4. eQEP 설정 고려사항
- 클럭 설정: SYSCLK(200MHz)에서 적절한 분주비 설정
- 엔코더 분해능: 엔코더의 PPR(Pulses Per Revolution) 확인 후 QPOSMAX 설정
- 속도 계산: 단위 타이머 주기(QUPRD)와 분주비(QCAPCTL.bit.UPPS)로 속도 해상도 조정
- 노이즈 필터링: QDECCTL.bit.QSP로 입력 신호 필터링 활성화
- 인터럽트: 실시간 위치/속도 모니터링 시 인터럽트 활용
- 에러 처리: QFLG.bit.PCE, QFLG.bit.QMAE로 에러 감지 및 처리
5. 실용적인 eQEP 예제 코드 (Bitfield 구조)
아래는 TMS320F28377D eQEP 모듈을 Bitfield 구조로 설정한 5개의 실용적인 예제 코드입니다. 각 예제는 Code Composer Studio(CCS)와 C2000Ware 환경에서 실행 가능합니다.
5.1 예제 1: 기본 위치 측정 (직교 펄스)
// File: eqep_position.c
// Description: TMS320F28377D eQEP 기본 위치 측정 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
void main(void) {
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// GPIO 설정
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; // GPIO20을 eQEP1A로 설정
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1; // GPIO21을 eQEP1B로 설정
GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 1; // GPIO23을 eQEP1I로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// eQEP1 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR4.bit.EQEP1 = 1; // eQEP1 모듈 클럭 활성화
EDIS;
// eQEP1 설정 (Bitfield 사용)
EQep1Regs.QDECCTL.bit.QSRC = 0; // 직교 펄스 모드
EQep1Regs.QDECCTL.bit.XCR = 0; // 4배 해상도
EQep1Regs.QPOSMAX = 999; // 엔코더 250 PPR (4*250=1000 펄스/회전)
EQep1Regs.QPOSINIT = 0; // 초기 위치 0
EQep1Regs.QEPCTL.bit.QPEN = 1; // eQEP 모듈 활성화
EQep1Regs.QEPCTL.bit.FREE_SOFT = 2; // Free Run 모드
for(;;); // 무한 루프
}
설명:
- 기능: eQEP1 모듈로 250 PPR 엔코더의 위치를 측정 (4배 해상도, 최대 1000 펄스/회전).
- 설정: 직교 펄스 모드, QPOSMAX=999, 초기 위치 0.
- GPIO: GPIO20(eQEP1A), GPIO21(eQEP1B), GPIO23(eQEP1I), GPIO31(LED).
- 출력: EQep1Regs.QPOSCNT로 현재 위치 확인, 정상 동작 시 LED ON.
5.2 예제 2: 속도 계산 (단위 타이머 사용)
// File: eqep_speed.c
// Description: TMS320F28377D eQEP 속도 계산 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
void main(void) {
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// GPIO 설정
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; // GPIO20을 eQEP1A로 설정
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1; // GPIO21을 eQEP1B로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// eQEP1 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR4.bit.EQEP1 = 1; // eQEP1 모듈 클럭 활성화
EDIS;
// eQEP1 설정 (Bitfield 사용)
EQep1Regs.QDECCTL.bit.QSRC = 0; // 직교 펄스 모드
EQep1Regs.QDECCTL.bit.XCR = 0; // 4배 해상도
EQep1Regs.QPOSMAX = 999; // 엔코더 250 PPR
EQep1Regs.QPOSINIT = 0; // 초기 위치 0
EQep1Regs.QUPRD = 200000; // 단위 타이머 주기 (1ms @ 200MHz)
EQep1Regs.QCAPCTL.bit.UPPS = 4; // 단위 위치 이벤트 분주비 1/16
EQep1Regs.QCAPCTL.bit.CEN = 1; // 캡처 활성화
EQep1Regs.QEPCTL.bit.UTIME = 1; // 단위 타이머 활성화
EQep1Regs.QEPCTL.bit.QPEN = 1; // eQEP 모듈 활성화
EQep1Regs.QEPCTL.bit.FREE_SOFT = 2; // Free Run 모드
for(;;); // 무한 루프
}
설명:
- 기능: eQEP1 모듈로 250 PPR 엔코더의 위치 및 속도를 측정.
- 설정: 직교 펄스 모드, QPOSMAX=999, 단위 타이머 1ms(QUPRD=200000), 속도 분주비 1/16.
- GPIO: GPIO20(eQEP1A), GPIO21(eQEP1B), GPIO31(LED).
- 출력: EQep1Regs.QPOSCNT로 위치, EQep1Regs.QCPRD로 속도 확인, 정상 동작 시 LED ON.
5.3 예제 3: 인터럽트 기반 위치/속도 모니터링
// File: eqep_interrupt.c
// Description: TMS320F28377D eQEP 인터럽트 기반 위치/속도 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
volatile Uint32 position = 0;
volatile Uint32 speed = 0;
__interrupt void eqep1_isr(void)
{
// 위치 및 속도 읽기
position = EQep1Regs.QPOSCNT;
speed = EQep1Regs.QCPRD;
// 인터럽트 플래그 클리어
EQep1Regs.QCLR.bit.UIE = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP5;
}
void main(void) {
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// 인터럽트 벡터 설정
EALLOW;
PieVectTable.EQEP1_INT = &eqep1_isr; // eQEP1 인터럽트 벡터 설정
EDIS;
// GPIO 설정
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; // GPIO20을 eQEP1A로 설정
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1; // GPIO21을 eQEP1B로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// eQEP1 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR4.bit.EQEP1 = 1; // eQEP1 모듈 클럭 활성화
EDIS;
// eQEP1 설정 (Bitfield 사용)
EQep1Regs.QDECCTL.bit.QSRC = 0; // 직교 펄스 모드
EQep1Regs.QDECCTL.bit.XCR = 0; // 4배 해상도
EQep1Regs.QPOSMAX = 999; // 엔코더 250 PPR
EQep1Regs.QPOSINIT = 0; // 초기 위치 0
EQep1Regs.QUPRD = 200000; // 단위 타이머 주기 (1ms @ 200MHz)
EQep1Regs.QCAPCTL.bit.UPPS = 4; // 단위 위치 이벤트 분주비 1/16
EQep1Regs.QCAPCTL.bit.CEN = 1; // 캡처 활성화
EQep1Regs.QEPCTL.bit.UTIME = 1; // 단위 타이머 활성화
EQep1Regs.QEPCTL.bit.QPEN = 1; // eQEP 모듈 활성화
EQep1Regs.QEPCTL.bit.FREE_SOFT = 2; // Free Run 모드
EQep1Regs.QEINT.bit.UIE = 1; // 단위 타이머 인터럽트 활성화
EQep1Regs.QCLR.bit.UIE = 1; // 인터럽트 플래그 클리어
PieCtrlRegs.PIEIER5.bit.INTx1 = 1; // PIE 그룹 5, eQEP1 인터럽트 활성화
IER |= M_INT5; // CPU 인터럽트 5 활성화
EINT; // 글로벌 인터럽트 활성화
for(;;); // 무한 루프
}
설명:
- 기능: eQEP1 모듈로 250 PPR 엔코더의 위치 및 속도를 단위 타이머 인터럽트를 통해 모니터링.
- 설정: 직교 펄스 모드, QPOSMAX=999, 단위 타이머 1ms(QUPRD=200000), 속도 분주비 1/16, 인터럽트 활성화.
- GPIO: GPIO20(eQEP1A), GPIO21(eQEP1B), GPIO31(LED).
- 출력: position과 speed 변수로 위치와 속도 확인, 정상 동작 시 LED ON.
5.4 예제 4: 인덱스 이벤트 기반 위치 초기화
// File: eqep_index_reset.c
// Description: TMS320F28377D eQEP 인덱스 이벤트로 위치 초기화 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
volatile Uint32 position = 0;
__interrupt void eqep1_isr(void)
{
// 위치 읽기
position = EQep1Regs.QPOSCNT;
// 인터럽트 플래그 클리어
EQep1Regs.QCLR.bit.IEL = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP5;
}
void main(void) {
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// 인터럽트 벡터 설정
EALLOW;
PieVectTable.EQEP1_INT = &eqep1_isr; // eQEP1 인터럽트 벡터 설정
EDIS;
// GPIO 설정
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; // GPIO20을 eQEP1A로 설정
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1; // GPIO21을 eQEP1B로 설정
GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 1; // GPIO23을 eQEP1I로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// eQEP1 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR4.bit.EQEP1 = 1; // eQEP1 모듈 클럭 활성화
EDIS;
// eQEP1 설정 (Bitfield 사용)
EQep1Regs.QDECCTL.bit.QSRC = 0; // 직교 펄스 모드
EQep1Regs.QDECCTL.bit.XCR = 0; // 4배 해상도
EQep1Regs.QPOSMAX = 999; // 엔코더 250 PPR
EQep1Regs.QPOSINIT = 0; // 초기 위치 0
EQep1Regs.QEPCTL.bit.QPEN = 1; // eQEP 모듈 활성화
EQep1Regs.QEPCTL.bit.FREE_SOFT = 2; // Free Run 모드
EQep1Regs.QEPCTL.bit.IEI = 2; // 인덱스 상승 에지에서 위치 초기화
EQep1Regs.QEINT.bit.IEL = 1; // 인덱스 이벤트 인터럽트 활성화
EQep1Regs.QCLR.bit.IEL = 1; // 인터럽트 플래그 클리어
PieCtrlRegs.PIEIER5.bit.INTx1 = 1; // PIE 그룹 5, eQEP1 인터럽트 활성화
IER |= M_INT5; // CPU 인터럽트 5 활성화
EINT; // 글로벌 인터럽트 활성화
for(;;); // 무한 루프
}
설명:
- 기능: eQEP1 모듈로 250 PPR 엔코더의 위치를 측정하며, 인덱스 펄스(QEPI) 발생 시 위치 카운터를 초기화하고 인터럽트로 위치 확인.
- 설정: 직교 펄스 모드, QPOSMAX=999, 인덱스 상승 에지에서 초기화(IEI=2), 인덱스 인터럽트 활성화.
- GPIO: GPIO20(eQEP1A), GPIO21(eQEP1B), GPIO23(eQEP1I), GPIO31(LED).
- 출력: position 변수로 위치 확인, 인덱스 이벤트 시 QPOSCNT 초기화, 정상 동작 시 LED ON.
5.5 예제 5: 방향 감지 및 카운터 모드
// File: eqep_direction.c
// Description: TMS320F28377D eQEP 방향 감지 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
volatile Uint32 position = 0;
volatile Uint16 direction = 0;
__interrupt void eqep1_isr(void)
{
// 위치 및 방향 읽기
position = EQep1Regs.QPOSCNT;
direction = EQep1Regs.QFLG.bit.QDF ? 1 : 0; // 1: 정방향, 0: 역방향
// 인터럽트 플래그 클리어
EQep1Regs.QCLR.bit.PCE = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP5;
}
void main(void) {
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// 인터럽트 벡터 설정
EALLOW;
PieVectTable.EQEP1_INT = &eqep1_isr; // eQEP1 인터럽트 벡터 설정
EDIS;
// GPIO 설정
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; // GPIO20을 eQEP1A로 설정
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1; // GPIO21을 eQEP1B로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// eQEP1 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR4.bit.EQEP1 = 1; // eQEP1 모듈 클럭 활성화
EDIS;
// eQEP1 설정 (Bitfield 사용)
EQep1Regs.QDECCTL.bit.QSRC = 0; // 직교 펄스 모드
EQep1Regs.QDECCTL.bit.XCR = 0; // 4배 해상도
EQep1Regs.QPOSMAX = 999; // 엔코더 250 PPR
EQep1Regs.QPOSINIT = 0; // 초기 위치 0
EQep1Regs.QEPCTL.bit.QPEN = 1; // eQEP 모듈 활성화
EQep1Regs.QEPCTL.bit.FREE_SOFT = 2; // Free Run 모드
EQep1Regs.QEINT.bit.PCE = 1; // 위치 카운터 에러 인터럽트 활성화
EQep1Regs.QCLR.bit.PCE = 1; // 인터럽트 플래그 클리어
PieCtrlRegs.PIEIER5.bit.INTx1 = 1; // PIE 그룹 5, eQEP1 인터럽트 활성화
IER |= M_INT5; // CPU 인터럽트 5 활성화
EINT; // 글로벌 인터럽트 활성화
for(;;); // 무한 루프
}
설명:
- 기능: eQEP1 모듈로 250 PPR 엔코더의 위치와 회전 방향을 감지, 위치 카운터 에러 인터럽트를 통해 모니터링.
- 설정: 직교 펄스 모드, QPOSMAX=999, 위치 카운터 에러 인터럽트 활성화.
- GPIO: GPIO20(eQEP1A), GPIO21(eQEP1B), GPIO31(LED).
- 출력: position으로 위치, direction으로 회전 방향(1: 정방향, 0: 역방향) 확인, 정상 동작 시 LED ON.
6. 사용 방법
6.1 환경 설정
- C2000Ware 설치: C:\ti\c2000\C2000Ware_x_xx_xx_xx에서 라이브러리 다운로드
- CCS 프로젝트: TMS320F28377D 타겟으로 프로젝트 생성, F28x_Project.h 포함
- 링커 파일: device_support\f2837xd 폴더에서 링커 파일 추가
6.2 코드 실행
- 각 예제를 별도의 .c 파일로 저장하거나, main.c에 복사
- 원하는 예제만 실행되도록 다른 코드 주 timeframe 처리
6.3 하드웨어 준비
- 엔코더 연결: QEPA, QEPB, QEPI 신호를 GPIO20/21/23에 연결
- LED: GPIO31에 LED 연결 (정상 동작 확인용)
- 테스트 장비: 오실로스코프 또는 로직 분석기로 QEPA/QEPB 신호 확인
6.4 디버깅
- CCS Expressions 창: EQep1Regs.QPOSCNT, EQep1Regs.QCPRD로 위치/속도 확인
- 인터럽트 상태: EQep1Regs.QFLG로 인터럽트 플래그 점검
- 에러 확인: EQep1Regs.QFLG.bit.PCE, QFLG.bit.QMAE로 에러 감지
- 레지스터 모니터링: EQep1Regs.QDECCTL, EQep1Regs.QEPCTL 확인
7. 추가 팁
- 엔코더 PPR: 엔코더의 펄스 수 확인 후 QPOSMAX 정확히 설정
- 노이즈 필터링: QDECCTL.bit.QSP로 입력 신호 필터링 활성화
- 속도 계산 최적화: QUPRD와 QCAPCTL.bit.UPPS 조정으로 속도 해상도 최적화
- C2000Ware 참고: C:\ti\c2000\C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\cpu1\eqep
- 문제 해결:
- 위치 카운트 오류: QDECCTL.bit.QSRC, QDECCTL.bit.XCR 확인
- 속도 계산 실패: QUPRD, QCAPCTL.bit.UPPS 확인
- 인터럽트 미작동: QEINT, PieCtrlRegs.PIEIER5 확인
- TI 리소스: TI E2E 포럼, C2000Ware 예제
8. 결론
이 문서는 TMS320F28377D eQEP 모듈의 설정 방법과 Bitfield 구조를 활용한 예제 코드를 제공하여, 위치 및 속도 측정 애플리케이션에 쉽게 적용할 수 있도록 구성했습니다. 기본 위치 측정, 속도 계산, 인터럽트 기반 모니터링, 인덱스 이벤트 초기화, 방향 감지 예제를 통해 모터 제어 및 엔코더 기반 시스템 개발에 활용 가능합니다.
키워드: TMS320F28377D, eQEP, C2000, 엔코더, 위치 측정, 속도 계산, 마이크로컨트롤러, Code Composer Studio, 직교 펄스, 단위 타이머, 인터럽트, 인덱스 이벤트, 방향 감지
'MCU > C2000' 카테고리의 다른 글
[TMS320F28377D] CLA 사용법 : Bitfield 구조 활용 예제 코드 (1) | 2025.08.18 |
---|---|
[TMS320F28377D] CPU1, CPU2 멀티코어 사용법 : Bitfield 구조 활용 예제 코드 (1) | 2025.08.18 |
[TMS320F28377D] EMIF 사용법 : Bitfield 구조 활용 예제 코드 (1) | 2025.08.17 |
[TMS320F28377D] eCAP 사용법 : Bitfield 구조 활용 예제 코드 (1) | 2025.08.17 |
[TMS320F28377D] ePWM 사용법 : Bitfield 구조 활용 예제 코드 (1) | 2025.08.17 |
[TMS320F28388D] CPU1, CPU2 멀티코어 사용법: DriverLib API로 멀티코어 설정 및 코드 (0) | 2025.08.17 |
[TMS320F28388D] DMA 사용법: DriverLib API로 DMA 설정 및 코드 (0) | 2025.08.17 |
[TMS320F28388D] SPI 사용법: DriverLib API로 SPI 설정 및 코드 (0) | 2025.08.17 |