본문 바로가기
개발/TI_TMS320

TMS320F28069 eQEP 코드 예시 2

by 즐기며 2025. 9. 9.

 

 

 


🧭 TMS320F28069 eQEP1 설정 매뉴얼 (GPIO20, GPIO21 사용)

📘 개요

이 매뉴얼은 TMS320F28069에서 GPIO20(QEP1A), **GPIO21(QEP1B)**를 사용하여
eQEP1(Enhanced Quadrature Encoder Pulse) 모듈을 설정하고,
인코더의 위치(Position) 및 **속도(Speed)**를 측정하는 예제 코드를 설명합니다.

  • SYSCLK: 90 MHz
  • Unit Timer 주기: 100 Hz (0.01초 간격)

🧩 코드 전체

#include "F2806x_Device.h"     // TMS320F28069 레지스터 정의
#include "F2806x_Examples.h"   // C2000Ware 예제 유틸리티 함수

//--------------------------------------------
// eQEP1 GPIO 초기화 (GPIO20: QEP1A, GPIO21: QEP1B)
//--------------------------------------------
void InitEQep1Gpio(void) {
    EALLOW; // GPIO 레지스터 접근 허용

    // GPIO20 → QEP1A
    GpioCtrlRegs.GPAPUD.bit.GPIO20 = 1;    // 풀업 비활성화
    GpioCtrlRegs.GPAQSEL2.bit.GPIO20 = 0;  // SYSCLKOUT 동기화
    GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1;   // eQEP1A로 기능 설정

    // GPIO21 → QEP1B
    GpioCtrlRegs.GPAPUD.bit.GPIO21 = 1;    // 풀업 비활성화
    GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 0;  // SYSCLKOUT 동기화
    GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1;   // eQEP1B로 기능 설정

    EDIS; // GPIO 레지스터 보호
}

//--------------------------------------------
// eQEP1 모듈 초기화 (위치 및 속도 측정)
//--------------------------------------------
void InitEQep1(void) {
    EQep1Regs.QEPCTL.bit.FREE_SOFT = 2;    // 에뮬레이션 중 자유 실행
    EQep1Regs.QEPCTL.bit.PCRM = 1;         // 인덱스 이벤트 시 위치 카운터 리셋
    EQep1Regs.QDECCTL.bit.QSRC = 0;        // 쿼드러처 카운트 모드
    EQep1Regs.QPOSMAX = 0xFFFFFFFF;        // 32비트 최대 카운터
    EQep1Regs.QUPRD = 900000;              // Unit Timer: 100Hz (90MHz / 900000)
    EQep1Regs.QEPCTL.bit.UTE = 1;          // Unit Timer 활성화
    EQep1Regs.QEPCTL.bit.QPEN = 1;         // eQEP 모듈 Enable

    // Unit Timer Overflow Interrupt 활성화
    EQep1Regs.QEINT.bit.UTO = 1;
}

//--------------------------------------------
// eQEP1 인터럽트 서비스 루틴 (100Hz 주기)
//--------------------------------------------
interrupt void EQep1IntISR(void) {
    Uint32 position = EQep1Regs.QPOSCNT;   // 현재 위치 카운터
    Uint32 period   = EQep1Regs.QCPRD;     // 최근 펄스 주기
    float speed     = (float)period / EQep1Regs.QUPRD; // 상대 속도 계산

    // 인터럽트 플래그 초기화
    EQep1Regs.QCLR.bit.UTO = 1;  // Unit Timer 플래그 클리어
    EQep1Regs.QCLR.bit.INT = 1;  // 글로벌 인터럽트 플래그 클리어

    // PIE 인터럽트 승인
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP5;
}

//--------------------------------------------
// 메인 함수
//--------------------------------------------
void main(void) {
    InitSysCtrl();      // 시스템 클럭 초기화 (90MHz)
    InitEQep1Gpio();    // GPIO20/21 eQEP1 핀 설정
    InitEQep1();        // eQEP1 모듈 초기화

    // 인터럽트 벡터 및 설정
    EALLOW;
    PieVectTable.EQEP1_INT = &EQep1IntISR; // ISR 등록
    EDIS;

    PieCtrlRegs.PIEIER5.bit.INTx1 = 1; // eQEP1 인터럽트 활성화
    IER |= M_INT5;                     // CPU 레벨 인터럽트 5 Enable
    EINT;                              // 전역 인터럽트 Enable

    // 무한 루프 (애플리케이션 실행 영역)
    for(;;) {
        // 사용자 로직 추가 가능
    }
}

⚙️ 코드 설명 요약

구성 요소 설명

헤더 파일 F2806x_Device.h (레지스터 정의), F2806x_Examples.h (C2000Ware 유틸리티)
InitEQep1Gpio() GPIO20(QEP1A), GPIO21(QEP1B) 설정. 풀업 비활성화, SYSCLKOUT 동기화, eQEP 기능 매핑
InitEQep1() 쿼드러처 모드(QSRC=0), Unit Timer(100Hz), 인덱스 리셋, 인터럽트 설정
EQep1IntISR() 위치(QPOSCNT), 주기(QCPRD) 읽고 속도 계산. 인터럽트 플래그 및 PIE ACK 처리
main() 시스템 초기화 후 GPIO/eQEP 설정, ISR 등록, 무한 루프 실행

🔍 추가 고려사항

항목 설명

인코더 신호 전압 GPIO20/21은 3.3V 입력 한계. 5V 인코더 사용 시 레벨 시프터(TXB0106 등) 필요
인코더 해상도 (PPR) 1000 PPR 인코더는 4배 카운팅 시 4000 펄스 → QPOSMAX 조정 필요
오버플로우 처리 저속 시 QCPRD가 65535 초과 가능 → 프리스케일 또는 예외 처리 추가 필요
디버깅 팁 CCS Watch Window에서 QPOSCNT, QCPRD 실시간 모니터링
문서 참조 - TI TRM: SPRUH18A, eQEP Section- C2000Ware 예제: eqep_pos_speed- TI E2E Forum: eQEP 관련 Q&A