1. TMS320F28335 eQEP 및 eCAP 모듈 개요
TI의 TMS320F28335는 C2000 Delfino 시리즈의 32비트 마이크로컨트롤러로, 모터 제어, 인코더 인터페이스, 타이밍 캡처 등에 적합합니다. eQEP(Enhanced Quadrature Encoder Pulse) 및 eCAP(Enhanced Capture) 모듈은 위치 센서 인터페이스와 타이밍 캡처 기능을 제공합니다. 이 문서에서는 eQEP 및 eCAP 모듈의 설정 방법, Bitfield 구조를 활용한 레지스터 설정, 그리고 실용적인 예제 코드를 제공하여 초보자와 숙련된 개발자 모두 쉽게 활용할 수 있도록 돕습니다.
1.1 eQEP 모듈 주요 사양
- 기능: 쿼드러처 엔코더 신호(QEPA, QEPB, QEPI) 처리, 위치 및 속도 측정
- 클럭 소스: 시스템 클럭(SYSCLK, 최대 150MHz)
- 카운터: 32비트 위치 카운터(QPOSCNT)
- 모드:
- 쿼드러처 모드
- 방향/속도 모드
- 주요 기능:
- 위치 측정 (최대 4억 회전)
- 속도 계산 (타임 스탬프 기반)
- 단위 시간 이벤트 (타이머 기반 속도 측정)
- 인터럽트 지원
- 모듈 수: 최대 2개 (eQEP1, eQEP2)
1.2 eCAP 모듈 주요 사양
- 기능: 펄스 캡처, 시간 측정, APWM(Asymmetric PWM) 출력
- 클럭 소스: 시스템 클럭(SYSCLK, 최대 150MHz)
- 타이머: 32비트 타임-베이스 카운터
- 모드:
- 캡처 모드
- APWM 모드
- 주요 기능:
- 상승/하강 에지 캡처
- 절대/델타 타임 스탬프
- 인터럽트 지원
- 모듈 수: 최대 6개 (eCAP1~eCAP6)
2. eQEP 및 eCAP Bitfield 설정 상세
TMS320F28335의 eQEP 및 eCAP 레지스터는 Bitfield 구조로 정의되어 있으며, F2833x_eqep.h 및 F2833x_ecap.h 헤더 파일을 통해 접근합니다.
2.1 eQEP 주요 레지스터
- QPOSCTL (위치 카운터 제어):
- bit.PCRM: 위치 카운터 리셋 모드 (0: 인덱스, 1: 최대값)
- bit.PCSHDW: 섀도우 모드 활성화
- QDECCTL (디코더 제어):
- bit.QSRC: 쿼드러처 소스 (0: 쿼드러처, 2: 방향/속도)
- bit.XCR: 해상도 (0: 1x, 1: 2x)
- QEPCTL (eQEP 제어):
- bit.QPEN: eQEP 모듈 활성화
- bit.IEI: 인덱스 이벤트 인터럽트 활성화
- bit.UTEN: 단위 시간 이벤트 활성화
- QCAPCTL (캡처 제어):
- bit.CEN: 캡처 유닛 활성화
- bit.UPPS: 단위 시간 프리스케일러
2.2 eCAP 주요 레지스터
- ECCTL1 (캡처 제어 1):
- bit.CAPxPOL: 캡처 극성 (0: 상승, 1: 하강)
- bit.CTRRSTx: 카운터 리셋 설정
- ECCTL2 (캡처 제어 2):
- bit.CAP_APWM: 모드 선택 (0: 캡처, 1: APWM)
- bit.APWMPOL: APWM 극성
- ECEINT (인터럽트 제어):
- bit.CEVTx: 캡처 이벤트 인터럽트 활성화
- bit.CTROVF: 오버플로우 인터럽트 활성화
- TSCTR: 타임 스탬프 카운터
3. eQEP 및 eCAP 설정 절차
- 시스템 초기화:
- InitSysCtrl()로 시스템 클럭과 PLL 초기화
- 인터럽트 비활성화 및 PIE 초기화 (DINT, InitPieCtrl, InitPieVectTable)
- 클럭 활성화:
- CpuSysRegs.PCLKCR0.bit.ECAPx = 1로 eCAP 모듈 클럭 활성화
- CpuSysRegs.PCLKCR1.bit.EQEPx = 1로 eQEP 모듈 클럭 활성화
- 보호된 레지스터 접근을 위해 EALLOW와 EDIS 사용
- GPIO 설정:
- eQEP 및 eCAP 핀을 적절한 멀티플렉서 설정으로 구성
- eQEP 설정:
- QEPCTL.bit.QPEN으로 모듈 활성화
- QDECCTL.bit.QSRC로 쿼드러처 모드 설정
- QPOSMAX로 최대 위치 값 설정
- QCAPCTL로 캡처 유닛 설정
- eCAP 설정:
- ECCTL2.bit.CAP_APWM으로 모드 선택
- 캡처 모드: ECCTL1.bit.CAPxPOL로 에지 선택
- APWM 모드: CAPx로 듀티 설정
- 인터럽트 설정 (필요 시):
- eQEP: QEPCTL.bit.IEI 또는 QCAPCTL.bit.CEN
- eCAP: ECEINT.bit.CEVTx 설정
- 모듈 실행:
- QEPCTL.bit.FREE_SOFT = 2 또는 ECCTL2.bit.FREE_SOFT = 2로 Free Run 모드 활성화
4. eQEP 및 eCAP 설정 고려사항
- 클럭 설정: SYSCLK(150MHz)에서 적절한 분주 설정
- 엔코더 해상도: eQEP의 XCR 설정으로 1x 또는 2x 선택
- 캡처 타이밍: eCAP의 프리스케일러 설정으로 정밀도 조정
- 인터럽트: 이벤트 트리거와 오버플로우 처리
- 노이즈 필터링: 입력 신호에 디지털 필터 적용 권장
- 동기화: 다중 eQEP/eCAP 모듈 간 동기화 가능
5. 실용적인 예제 코드 (Bitfield 구조)
아래는 TMS320F28335의 eQEP 및 eCAP 모듈을 Bitfield 구조로 설정한 예제 코드입니다. GPIO 설정은 별도의 함수로 분리되었으며, 각 라인에 상세한 주석이 추가되었습니다. Code Composer Studio(CCS)와 C2000Ware 환경에서 실행 가능합니다.
5.1 예제 1: eQEP 쿼드러처 엔코더 위치 측정
// File: eqep_position.c
// Description: TMS320F28335 eQEP 쿼드러처 엔코더 위치 측정 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28335
#include "F28x_Project.h"
// GPIO 설정 함수
void ConfigureGPIO(void) {
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.GPIO34 = 1; // GPIO34를 출력으로 설정 (LED용)
GpioDataRegs.GPBSET.bit.GPIO34 = 1; // GPIO34를 High로 설정하여 LED 켬
EDIS; // 보호된 레지스터 접근 비허용
}
// eQEP1 설정 함수
void ConfigureEQEP1(void) {
EALLOW; // 보호된 레지스터 접근 허용
CpuSysRegs.PCLKCR1.bit.EQEP1 = 1; // eQEP1 모듈 클럭 활성화
EDIS; // 보호된 레지스터 접근 비허용
EQep1Regs.QEPCTL.bit.QPEN = 0; // eQEP 모듈 비활성화 (설정 전)
EQep1Regs.QDECCTL.bit.QSRC = 0; // 쿼드러처 모드 (QEPA/QEPB)
EQep1Regs.QDECCTL.bit.XCR = 1; // 2x 해상도 (4배 카운트)
EQep1Regs.QPOSMAX = 0xFFFFFFFF; // 최대 위치 카운터 값 설정 (32비트 최대)
EQep1Regs.QPOSCNT = 0; // 위치 카운터 초기화
EQep1Regs.QPOSCTL.bit.PCRM = 0; // 인덱스 이벤트에서 카운터 리셋
EQep1Regs.QEPCTL.bit.IEI = 1; // 인덱스 이벤트 인터럽트 활성화
EQep1Regs.QEPCTL.bit.QPEN = 1; // eQEP 모듈 활성화
EQep1Regs.QEPCTL.bit.FREE_SOFT = 2; // Free run 모드
}
void main(void) {
InitSysCtrl(); // 시스템 클럭(150MHz)과 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 컨트롤러 초기화
IER = 0x0000; // CPU 인터럽트 레지스터 비활성화
IFR = 0x0000; // 인터럽트 플래그 레지스터 클리어
InitPieVectTable(); // PIE 인터럽트 벡터 테이블 초기화
ConfigureGPIO(); // GPIO 설정 함수 호출
ConfigureEQEP1(); // eQEP1 설정 함수 호출
for(;;); // 무한 루프: 위치 카운터 지속 업데이트
}
설명:
- 기능: eQEP1을 사용하여 쿼드러처 엔코더의 위치를 측정
- 설정: 쿼드러처 모드, 2x 해상도, 최대 위치 카운터 32비트, 인덱스 이벤트로 리셋
- GPIO: GPIO20(eQEP1A), GPIO21(eQEP1B), GPIO23(eQEP1I), GPIO34(LED)
- 출력: 위치 카운터(QPOSCNT) 값 업데이트, LED ON
5.2 예제 2: eQEP 속도 측정
// File: eqep_velocity.c
// Description: TMS320F28335 eQEP 속도 측정 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28335
#include "F28x_Project.h"
// GPIO 설정 함수
void ConfigureGPIO(void) {
EALLOW; // 보호된 레지스터 접근 허용
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; // GPIO20을 eQEP1A로 설정
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1; // GPIO21을 eQEP1B로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // GPIO34를 출력으로 설정 (LED용)
GpioDataRegs.GPBSET.bit.GPIO34 = 1; // GPIO34를 High로 설정하여 LED 켬
EDIS; // 보호된 레지스터 접근 비허용
}
// eQEP1 설정 함수
void ConfigureEQEP1(void) {
EALLOW; // 보호된 레지스터 접근 허용
CpuSysRegs.PCLKCR1.bit.EQEP1 = 1; // eQEP1 모듈 클럭 활성화
EDIS; // 보호된 레지스터 접근 비허용
EQep1Regs.QEPCTL.bit.QPEN = 0; // eQEP 모듈 비활성화 (설정 전)
EQep1Regs.QDECCTL.bit.QSRC = 0; // 쿼드러처 모드
EQep1Regs.QDECCTL.bit.XCR = 1; // 2x 해상도
EQep1Regs.QPOSMAX = 0xFFFFFFFF; // 최대 위치 카운터 값
EQep1Regs.QPOSCNT = 0; // 위치 카운터 초기화
EQep1Regs.QCAPCTL.bit.UPPS = 4; // 단위 시간 프리스케일러: 1/16 SYSCLK
EQep1Regs.QCAPCTL.bit.CEN = 1; // 캡처 유닛 활성화
EQep1Regs.QUPRD = 150000; // 단위 시간 주기: 1ms (150MHz/150000)
EQep1Regs.QEPCTL.bit.UTEN = 1; // 단위 시간 이벤트 활성화
EQep1Regs.QEPCTL.bit.QPEN = 1; // eQEP 모듈 활성화
EQep1Regs.QEPCTL.bit.FREE_SOFT = 2; // Free run 모드
}
void main(void) {
InitSysCtrl(); // 시스템 클럭(150MHz)과 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 컨트롤러 초기화
IER = 0x0000; // CPU 인터럽트 레지스터 비활성화
IFR = 0x0000; // 인터럽트 플래그 레지스터 클리어
InitPieVectTable(); // PIE 인터럽트 벡터 테이블 초기화
ConfigureGPIO(); // GPIO 설정 함수 호출
ConfigureEQEP1(); // eQEP1 설정 함수 호출
for(;;); // 무한 루프: 속도 데이터 지속 업데이트
}
설명:
- 기능: eQEP1을 사용하여 엔코더의 속도를 측정 (단위 시간 이벤트 기반)
- 설정: 쿼드러처 모드, 2x 해상도, 1ms 단위 시간 주기
- GPIO: GPIO20(eQEP1A), GPIO21(eQEP1B), GPIO34(LED)
- 출력: 속도 데이터(QCPRD) 업데이트, LED ON
5.3 예제 3: eCAP 펄스 캡처
// File: ecap_capture.c
// Description: TMS320F28335 eCAP 펄스 캡처 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28335
#include "F28x_Project.h"
// GPIO 설정 함수
void ConfigureGPIO(void) {
EALLOW; // 보호된 레지스터 접근 허용
GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 1; // GPIO24를 eCAP1로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // GPIO34를 출력으로 설정 (LED용)
GpioDataRegs.GPBSET.bit.GPIO34 = 1; // GPIO34를 High로 설정하여 LED 켬
EDIS; // 보호된 레지스터 접근 비허용
}
// eCAP1 설정 함수
void ConfigureECAP1(void) {
EALLOW; // 보호된 레지스터 접근 허용
CpuSysRegs.PCLKCR0.bit.ECAP1 = 1; // eCAP1 모듈 클럭 활성화
EDIS; // 보호된 레지스터 접근 비허용
ECap1Regs.ECEINT.all = 0; // 모든 인터럽트 비활성화
ECap1Regs.ECCTL2.bit.CAP_APWM = 0; // 캡처 모드 선택
ECap1Regs.ECCTL1.bit.CAP1POL = 0; // 상승 에지 캡처
ECap1Regs.ECCTL1.bit.CTRRST1 = 0; // 캡처 이벤트 1에서 카운터 리셋 비활성화
ECap1Regs.ECCTL1.bit.CAP2POL = 1; // 하강 에지 캡처
ECap1Regs.ECCTL1.bit.CTRRST2 = 0; // 캡처 이벤트 2에서 카운터 리셋 비활성화
ECap1Regs.ECCTL1.bit.PRESCALE = 0; // 프리스케일러 비활성화 (1/1)
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // 타임 스탬프 카운터 시작
ECap1Regs.ECCTL2.bit.FREE_SOFT = 2; // Free run 모드
}
void main(void) {
InitSysCtrl(); // 시스템 클럭(150MHz)과 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 컨트롤러 초기화
IER = 0x0000; // CPU 인터럽트 레지스터 비활성화
IFR = 0x0000; // 인터럽트 플래그 레지스터 클리어
InitPieVectTable(); // PIE 인터럽트 벡터 테이블 초기화
ConfigureGPIO(); // GPIO 설정 함수 호출
ConfigureECAP1(); // eCAP1 설정 함수 호출
for(;;); // 무한 루프: 펄스 캡처 지속
}
설명:
- 기능: eCAP1을 사용하여 입력 펄스의 상승/하강 에지 캡처
- 설정: 캡처 모드, 상승/하강 에지 감지, 프리스케일러 비활성화
- GPIO: GPIO24(eCAP1), GPIO34(LED)
- 출력: 타임 스탬프(CAP1, CAP2) 업데이트, LED ON
5.4 예제 4: eCAP APWM 출력
// File: ecap_apwm.c
// Description: TMS320F28335 eCAP APWM 출력 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28335
#include "F28x_Project.h"
// GPIO 설정 함수
void ConfigureGPIO(void) {
EALLOW; // 보호된 레지스터 접근 허용
GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 1; // GPIO24를 eCAP1로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // GPIO34를 출력으로 설정 (LED용)
GpioDataRegs.GPBSET.bit.GPIO34 = 1; // GPIO34를 High로 설정하여 LED 켬
EDIS; // 보호된 레지스터 접근 비허용
}
// eCAP1 설정 함수
void ConfigureECAP1(void) {
EALLOW; // 보호된 레지스터 접근 허용
CpuSysRegs.PCLKCR0.bit.ECAP1 = 1; // eCAP1 모듈 클럭 활성화
EDIS; // 보호된 레지스터 접근 비허용
ECap1Regs.ECEINT.all = 0; // 모든 인터럽트 비활성화
ECap1Regs.ECCTL2.bit.CAP_APWM = 1; // APWM 모드 선택
ECap1Regs.ECCTL2.bit.APWMPOL = 0; // Active High 출력
ECap1Regs.TSCTR = 0; // 타임 스탬프 카운터 초기화
ECap1Regs.CAP1 = 750; // 주기 설정: 5us (150MHz/750 = 200kHz)
ECap1Regs.CAP2 = 375; // 듀티 설정: 50% (375/750)
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // 타임 스탬프 카운터 시작
ECap1Regs.ECCTL2.bit.FREE_SOFT = 2; // Free run 모드
}
void main(void) {
InitSysCtrl(); // 시스템 클럭(150MHz)과 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 컨트롤러 초기화
IER = 0x0000; // CPU 인터럽트 레지스터 비활성화
IFR = 0x0000; // 인터럽트 플래그 레지스터 클리어
InitPieVectTable(); // PIE 인터럽트 벡터 테이블 초기화
ConfigureGPIO(); // GPIO 설정 함수 호출
ConfigureECAP1(); // eCAP1 설정 함수 호출
for(;;); // 무한 루프: APWM 신호 지속 출력
}
설명:
- 기능: eCAP1을 사용하여 200kHz, 50% 듀티 APWM 신호 생성
- 설정: APWM 모드, 주기 750(200kHz @ 150MHz), 듀티 375(50%)
- GPIO: GPIO24(eCAP1), GPIO34(LED)
- 출력: GPIO24에 APWM 신호 출력, LED ON
6. 사용 방법
6.1 환경 설정
- C2000Ware 설치: C:\ti\c2000\C2000Ware_x_xx_xx_xx
- CCS 프로젝트: TMS320F28335 타겟으로 프로젝트 생성, F28x_Project.h 포함
- 링커 파일: device_support\f2833x 폴더에서 링커 파일 추가
6.2 코드 실행
- 각 예제를 별도의 .c 파일로 저장하거나, main.c에 복사
- 다른 예제 코드 주석 처리
6.3 하드웨어 준비
- eQEP: GPIO20, GPIO21, GPIO23에 쿼드러처 엔코더 연결
- eCAP: GPIO24에 펄스 입력 또는 PWM 출력 연결
- LED: GPIO34에 LED 연결
- 디버깅 장비: 오실로스코프 또는 로직 애널라이저로 신호 확인
6.4 디버깅
- CCS Expressions 창: EQep1Regs.QPOSCNT, ECap1Regs.CAP1 확인
- 인터럽트 플래그: EQep1Regs.QFLG, ECap1Regs.ECFLG 점검
- 타이머 값: EQep1Regs.QCTMR, ECap1Regs.TSCTR 모니터링
7. 추가 팁
- 캘리브레이션: Device_cal() 호출로 클럭 정확도 확보
- 노이즈 감소: eQEP 입력에 디지털 필터(QDECCTL.bit.QSP) 사용
- C2000Ware 참고: C:\ti\c2000\C2000Ware_x_xx_xx_xx\device_support\f2833x\examples\cpu1\eqep, ecap
- 문제 해결:
- 위치 카운터 오류: QDECCTL.bit.QSRC, QPOSMAX 확인
- 캡처 실패: ECCTL1.bit.CAPxPOL, ECCTL2.bit.TSCTRSTOP 확인
- 출력 없음: GPIO 멀티플렉서 및 모듈 클럭 확인
- TI 리소스: TI E2E 포럼, C2000Ware 예제
8. 결론
이 문서는 TMS320F28335의 eQEP 및 eCAP 모듈의 설정 방법과 Bitfield 구조를 활용한 예제 코드를 제공하여 모터 제어, 위치/속도 측정, 펄스 캡처 등 다양한 애플리케이션에 적용 가능하도록 구성했습니다.
키워드: TMS320F28335, eQEP, eCAP, C2000, 쿼드러처 엔코더, 펄스 캡처, APWM, 마이크로컨트롤러, Code Composer Studio, 위치 측정, 속도 측정
'MCU > C2000' 카테고리의 다른 글
[TI C2000]TI TMS320F280049C DSP를 적용한 동기 벅 컨버터 설계 - PCMC (0) | 2025.08.21 |
---|---|
[TI C2000]TMS320F280049C DSP를 적용한 동기 벅 컨버터 설계 절차-VMC (0) | 2025.08.20 |
[TMS320F28335] CAN, I2C, McBSP 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.19 |
[TMS320F28335] DMA 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.19 |
[TMS320F28335] XINTF 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.19 |
[TMS320F28335] ADC 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.18 |
[TMS320F28335] ePWM 사용법 : Bitfield 구조 활용 예제 코드 (1) | 2025.08.18 |
[TMS320F28377D] DC-DC 변환 토포롤로지별 ePWM 생성 방법: Bitfield 구조 활용 예제 코드 (1) | 2025.08.18 |