🧭 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 |
'개발 > TI_TMS320' 카테고리의 다른 글
| TI: FLASH 에서 실행, DELAY_US 문제 (0) | 2025.10.21 |
|---|---|
| C2Prog 로 (CCS 없이) FW Download 하기 - TI TMS320 입문 (0) | 2025.10.20 |
| TMS320F28069 eQEP 코드 예시 1 (0) | 2025.09.09 |
| Enhanced Quadrature Encoder Pulse (EQEP) (0) | 2025.09.09 |
| TMS320 error: program will not fit into available memory (0) | 2025.07.03 |