본문 바로가기
MCU/C2000

[TMS320F28377D] eQEP 사용법 : Bitfield 구조 활용 예제 코드

by linuxgo 2025. 8. 17.
반응형

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: 단위 위치 이벤트 분주비 (015, 1/11/32768)
  • bit.CCPS: 캡처 클럭 분주비 (07, 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 모듈을 효과적으로 설정하려면 다음 단계를 따릅니다:

  1. 시스템 초기화:
    • InitSysCtrl() 호출로 시스템 클럭과 PLL 초기화
    • 인터럽트 비활성화 및 PIE 초기화 (DINT, InitPieCtrl, InitPieVectTable)
  2. eQEP 클럭 활성화:
    • CpuSysRegs.PCLKCR4.bit.EQEPx = 1로 원하는 eQEP 모듈(x=1~3) 클럭 활성화
    • 보호된 레지스터 접근을 위해 EALLOW와 EDIS 사용
  3. GPIO 설정:
    • GpioCtrlRegs.GPAMUXx로 QEPA, QEPB, QEPI 핀 설정
    • 예: GPIO20/21/23을 eQEP1A/1B/1I로 설정
  4. 디코더 설정:
    • QDECCTL.bit.QSRC로 카운터 소스 선택 (보통 직교 펄스)
    • QDECCTL.bit.QAP, QDECCTL.bit.QBP로 신호 극성 설정
  5. 위치 카운터 설정:
    • QPOSMAX로 최대 카운터 값 설정 (엔코더 분해능 기반)
    • QPOSINIT로 초기 위치 값 설정
  6. 단위 타이머 설정 (속도 계산용):
    • QUPRD로 단위 타이머 주기 설정
    • QCAPCTL.bit.UPPS로 단위 위치 이벤트 분주비 설정
  7. 인터럽트 설정 (필요 시):
    • QINT.bit.UIE로 단위 타이머 인터럽트 활성화
    • QINT.bit.IEL로 인덱스 이벤트 인터럽트 활성화
  8. 모듈 활성화:
    • 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, 직교 펄스, 단위 타이머, 인터럽트, 인덱스 이벤트, 방향 감지

반응형