1. TMS320F28377D SDFM 모듈 개요
TI의 TMS320F28377D는 C2000 Delfino 시리즈의 32비트 마이크로컨트롤러로, 고정밀 아날로그-디지털 변환을 위한 Sigma-Delta Filter Module(SDFM)을 제공합니다. SDFM은 고해상도 데이터 수집을 가능하게 하여 모터 제어, 전력 변환, 센서 인터페이스 등에 적합합니다. 이 문서에서는 SDFM 모듈의 설정 방법, Bitfield 구조를 활용한 레지스터 설정, 그리고 실용적인 예제 코드를 제공하여 초보자와 숙련된 개발자 모두가 쉽게 활용할 수 있도록 돕겠습니다.
SDFM 주요 사양
- 채널: 최대 8개 독립 SDFM 채널(SD1~SD8)
- 클럭 소스: 시스템 클럭(SYSCLK, 최대 200MHz) 또는 외부 클럭
- 해상도: 최대 24비트
- 샘플링 속도: 최대 1.28MSPS
- 필터: Sinc3, Sinc2, Sinc1, Fast-Settling
- 오버샘플링 비율(OSR): 32, 64, 128, 256
- 주요 기능:
- 고해상도 아날로그-디지털 변환
- 데이터 필터링 및 데시메이션
- 비교기 인터럽트 및 트리거
- PWM 동기화 지원
- Manchester 코딩 지원
- 인터럽트: 데이터 준비 완료, 비교기 이벤트, 에러 조건
2. SDFM Bitfield 설정 상세
SDFM 모듈의 레지스터는 F2837xD_sdfm.h 헤더 파일을 통해 Bitfield 구조로 정의되어 있어 코드 가독성과 유지보수성을 높입니다. 주요 레지스터는 다음과 같습니다:
2.1 SDCTL (Sigma-Delta 제어 레지스터)
- bit.SDEN: SDFM 활성화 (1: 활성화)
- bit.MFE: Manchester Failure Enable (1: 활성화)
- bit.MIE: Manchester Interrupt Enable (1: 활성화)
2.2 SDDFPARM (데이터 필터 파라미터 레지스터)
- bit.SST: Sinc 필터 타입 (0: Fast, 1: Sinc1, 2: Sinc2, 3: Sinc3)
- bit.DOSR: 데이터 오버샘플링 비율 (0~255)
- bit.FEN: 필터 활성화 (1: 활성화)
- bit.SDSYNCEN: PWM 동기화 활성화 (1: 활성화)
2.3 SDCMPH (비교기 High Threshold 레지스터)
- bit.HLT: 고 임계값 설정 (16비트)
- bit.CEVT1: 비교기 이벤트 1 활성화 (1: 활성화)
2.4 SDCMPL (비교기 Low Threshold 레지스터)
- bit.LLT: 저 임계값 설정 (16비트)
- bit.CEVT2: 비교기 이벤트 2 활성화 (1: 활성화)
2.5 SDINT (인터럽트 제어 레지스터)
- bit.DRINTEN: 데이터 준비 인터럽트 활성화 (1: 활성화)
- bit.CMPHINTEN: 고 임계값 인터럽트 활성화 (1: 활성화)
- bit.CMPLINTEN: 저 임계값 인터럽트 활성화 (1: 활성화)
3. SDFM 설정 절차
SDFM 모듈을 설정하려면 다음 단계를 따릅니다:
- 시스템 초기화:
- InitSysCtrl() 호출로 시스템 클럭 및 PLL 초기화
- 인터럽트 비활성화 및 PIE 초기화 (DINT, InitPieCtrl, InitPieVectTable)
- SDFM 클럭 활성화:
- CpuSysRegs.PCLKCR3.bit.SD1 = 1로 SDFM1 클럭 활성화
- 보호된 레지스터 접근을 위해 EALLOW와 EDIS 사용
- GPIO 설정:
- SDFM 데이터 및 클럭 핀 설정 (예: GPIO24~27 for SD1)
- GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 3 등으로 설정
- SDFM 설정:
- SD1Regs.SDCTL.bit.SDEN = 1로 모듈 활성화
- SDDFPARM1.bit.SST로 필터 타입 설정 (예: Sinc3)
- SDDFPARM1.bit.DOSR로 오버샘플링 비율 설정 (예: 128)
- SDDFPARM1.bit.FEN = 1로 필터 활성화
- 비교기 설정 (필요 시):
- SDCMPH1.bit.HLT와 SDCMPL1.bit.LLT로 임계값 설정
- SDCMPH1.bit.CEVT1 또는 SDCMPL1.bit.CEVT2로 이벤트 활성화
- 인터럽트 설정 (필요 시):
- SDINT1.bit.DRINTEN = 1로 데이터 준비 인터럽트 활성화
- PIE 벡터 테이블에 인터럽트 서비스 루틴 등록
- 모듈 실행:
- SDDFPARM1.bit.SDSYNCEN로 PWM 동기화 설정 (필요 시)
- 데이터 수집 시작
4. SDFM 설정 고려사항
- 클럭 설정: SYSCLK(200MHz)에서 SDCLK 설정 (예: 20MHz)
- OSR: 높은 OSR(예: 256)는 해상도 증가, 샘플링 속도 감소
- 필터 선택: Sinc3는 고해상도, Fast는 빠른 응답
- PWM 동기화: 다중 채널 동기화를 위해 SDDFPARM1.bit.SDSYNCEN 사용
- Manchester 코딩: 외부 Sigma-Delta 모듈 사용 시 SDCTL.bit.MFE 활성화
- 인터럽트: 실시간 데이터 처리를 위해 SDINT 설정
5. 실용적인 SDFM 예제 코드 (Bitfield 구조)
아래는 SDFM 모듈을 Bitfield 구조로 설정한 4개의 실용적인 예제 코드입니다. 각 예제는 Code Composer Studio(CCS)와 C2000Ware 환경에서 실행 가능합니다.
5.1 예제 1: 기본 SDFM 데이터 수집
// File: sdfm_basic.c
// Description: TMS320F28377D SDFM 기본 데이터 수집 예제 (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.GPIO24 = 3; // GPIO24를 SD1_D1로 설정
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 3; // GPIO25를 SD1_C1로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// SDFM1 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR3.bit.SD1 = 1; // SDFM1 모듈 클럭 활성화
EDIS;
// SDFM1 설정 (Bitfield 사용)
EALLOW;
Sdfm1Regs.SDCTL.bit.SDEN = 1; // SDFM1 활성화
Sdfm1Regs.SDDFPARM1.bit.SST = 3; // Sinc3 필터
Sdfm1Regs.SDDFPARM1.bit.DOSR = 128; // OSR = 128
Sdfm1Regs.SDDFPARM1.bit.FEN = 1; // 필터 활성화
Sdfm1Regs.SDDFPARM1.bit.SDSYNCEN = 0; // PWM 동기화 비활성화
EDIS;
for(;;) {
// 데이터 읽기
Uint32 data = Sdfm1Regs.SDDATA1.bit.DATA; // 필터 데이터 읽기
// 데이터 처리 (예: 디버깅용 변수 저장)
}
}
설명:
- 기능: SDFM1 채널 1로 아날로그 데이터를 수집 (Sinc3 필터, OSR=128).
- 설정: Sinc3 필터, OSR=128, PWM 동기화 비활성화.
- GPIO: GPIO24(SD1_D1), GPIO25(SD1_C1), GPIO31(LED).
- 출력: Sdfm1Regs.SDDATA1.bit.DATA에서 데이터 읽기, 정상 동작 시 LED ON.
5.2 예제 2: 비교기 인터럽트를 사용한 임계값 감지
// File: sdfm_comparator_interrupt.c
// Description: TMS320F28377D SDFM 비교기 인터럽트 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
volatile Uint16 threshold_exceeded = 0; // 임계값 초과 플래그
__interrupt void sdfm1_isr(void)
{
threshold_exceeded = 1; // 임계값 초과 감지
GpioDataRegs.GPBTOGGLE.bit.GPIO31 = 1; // LED 토글
Sdfm1Regs.SDINTFLG.bit.CMPH1 = 1; // 인터럽트 플래그 클리어
PieCtrlRegs.PIEACK.all = PIEACK_GROUP8; // PIE 그룹 8 ACK
}
void main(void) {
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// 인터럽트 벡터 설정
EALLOW;
PieVectTable.SD1_INT = &sdfm1_isr; // SDFM1 인터럽트 벡터 설정
EDIS;
// GPIO 설정
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 3; // GPIO24를 SD1_D1로 설정
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 3; // GPIO25를 SD1_C1로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// SDFM1 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR3.bit.SD1 = 1; // SDFM1 모듈 클럭 활성화
EDIS;
// SDFM1 설정 (Bitfield 사용)
EALLOW;
Sdfm1Regs.SDCTL.bit.SDEN = 1; // SDFM1 활성화
Sdfm1Regs.SDDFPARM1.bit.SST = 3; // Sinc3 필터
Sdfm1Regs.SDDFPARM1.bit.DOSR = 128; // OSR = 128
Sdfm1Regs.SDDFPARM1.bit.FEN = 1; // 필터 활성화
Sdfm1Regs.SDDFPARM1.bit.SDSYNCEN = 0; // PWM 동기화 비활성화
// 비교기 설정
Sdfm1Regs.SDCMPH1.bit.HLT = 0x7FFF; // 높은 임계값 (예: 50% 최대)
Sdfm1Regs.SDCMPH1.bit.CEVT1 = 1; // 비교기 이벤트 1 활성화
Sdfm1Regs.SDINT.bit.CMPHINTEN = 1; // 고 임계값 인터럽트 활성화
// 인터럽트 활성화
PieCtrlRegs.PIEIER8.bit.INTx1 = 1; // PIE 그룹 8, SDFM1 인터럽트 활성화
IER |= M_INT8; // CPU 인터럽트 8 활성화
EDIS;
EINT; // 글로벌 인터럽트 활성화
for(;;) {
// 데이터 읽기
Uint32 data = Sdfm1Regs.SDDATA1.bit.DATA; // 필터 데이터 읽기
// 데이터 처리 (예: 디버깅용 변수 저장)
}
}
설명:
- 기능: SDFM1 채널 1로 데이터 수집, 높은 임계값 초과 시 인터럽트 발생 및 LED 토글.
- 설정: Sinc3 필터, OSR=128, 높은 임계값 0x7FFF, 비교기 인터럽트 활성화.
- GPIO: GPIO24(SD1_D1), GPIO25(SD1_C1), GPIO31(LED).
- 출력: 데이터 초과 시 LED 토글, 정상 동작 시 데이터 읽기.
5.3 예제 3: PWM 동기화를 사용한 SDFM 데이터 수집
// File: sdfm_pwm_sync.c
// Description: TMS320F28377D SDFM PWM 동기화 데이터 수집 예제 (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.GPIO24 = 3; // GPIO24를 SD1_D1로 설정
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 3; // GPIO25를 SD1_C1로 설정
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0을 ePWM1A로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// SDFM1 및 ePWM1 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR3.bit.SD1 = 1; // SDFM1 모듈 클럭 활성화
CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; // ePWM1 모듈 클럭 활성화
EDIS;
// ePWM1 설정 (동기화 신호 제공)
EALLOW;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 업 카운트 모드
EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 클럭 분주비 1/1
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1; // 고속 클럭 분주비 1/1 (TBCLK = 200MHz)
EPwm1Regs.TBPRD = 2000; // 주기 = 2000 TBCLK (100kHz = 200MHz/2000)
EPwm1Regs.CMPA.bit.CMPA = 1000; // 50% 듀티
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR=0일 때 High
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 Low
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_OUT; // 동기화 신호 출력
EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드
// SDFM1 설정 (Bitfield 사용)
Sdfm1Regs.SDCTL.bit.SDEN = 1; // SDFM1 활성화
Sdfm1Regs.SDDFPARM1.bit.SST = 2; // Sinc2 필터
Sdfm1Regs.SDDFPARM1.bit.DOSR = 64; // OSR = 64
Sdfm1Regs.SDDFPARM1.bit.FEN = 1; // 필터 활성화
Sdfm1Regs.SDDFPARM1.bit.SDSYNCEN = 1; // PWM 동기화 활성화
Sdfm1Regs.SDSYNC1.bit.SDSYNCSEL = 0; // ePWM1 동기화 신호 선택
EDIS;
for(;;) {
// 데이터 읽기
Uint32 data = Sdfm1Regs.SDDATA1.bit.DATA; // 필터 데이터 읽기
// 데이터 처리 (예: 디버깅용 변수 저장)
}
}
설명:
- 기능: SDFM1 채널 1로 ePWM1과 동기화된 데이터 수집 (Sinc2 필터, OSR=64).
- 설정: Sinc2 필터, OSR=64, ePWM1 동기화 활성화, ePWM1 100kHz PWM.
- GPIO: GPIO24(SD1_D1), GPIO25(SD1_C1), GPIO0(ePWM1A), GPIO31(LED).
- 출력: ePWM1 동기화된 데이터 읽기, 정상 동작 시 LED ON.
5.4 예제 4: 다중 SDFM 채널 설정
// File: sdfm_multi_channel.c
// Description: TMS320F28377D SDFM 다중 채널 데이터 수집 예제 (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.GPIO24 = 3; // GPIO24를 SD1_D1로 설정
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 3; // GPIO25를 SD1_C1로 설정
GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 3; // GPIO26를 SD1_D2로 설정
GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 3; // GPIO27를 SD1_C2로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// SDFM1 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR3.bit.SD1 = 1; // SDFM1 모듈 클럭 활성화
EDIS;
// SDFM1 채널 1 설정 (Bitfield 사용)
EALLOW;
Sdfm1Regs.SDCTL.bit.SDEN = 1; // SDFM1 활성화
Sdfm1Regs.SDDFPARM1.bit.SST = 3; // Sinc3 필터
Sdfm1Regs.SDDFPARM1.bit.DOSR = 128; // OSR = 128
Sdfm1Regs.SDDFPARM1.bit.FEN = 1; // 필터 활성화
Sdfm1Regs.SDDFPARM1.bit.SDSYNCEN = 0; // PWM 동기화 비활성화
// SDFM1 채널 2 설정 (Bitfield 사용)
Sdfm1Regs.SDDFPARM2.bit.SST = 2; // Sinc2 필터
Sdfm1Regs.SDDFPARM2.bit.DOSR = 64; // OSR = 64
Sdfm1Regs.SDDFPARM2.bit.FEN = 1; // 필터 활성화
Sdfm1Regs.SDDFPARM2.bit.SDSYNCEN = 0; // PWM 동기화 비활성화
EDIS;
for(;;) {
// 데이터 읽기
Uint32 data1 = Sdfm1Regs.SDDATA1.bit.DATA; // 채널 1 데이터
Uint32 data2 = Sdfm1Regs.SDDATA2.bit.DATA; // 채널 2 데이터
// 데이터 처리 (예: 디버깅용 변수 저장)
}
}
설명:
- 기능: SDFM1 채널 1(Sinc3, OSR=128)과 채널 2(Sinc2, OSR=64)로 동시 데이터 수집.
- 설정: 채널 1은 Sinc3, OSR=128; 채널 2는 Sinc2, OSR=64; PWM 동기화 비활성화.
- GPIO: GPIO24(SD1_D1), GPIO25(SD1_C1), GPIO26(SD1_D2), GPIO27(SD1_C2), GPIO31(LED).
- 출력: 두 채널 데이터 동시 읽기, 정상 동작 시 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에 복사
- 원하는 예제만 실행되도록 다른 코드 주석 처리
6.3 하드웨어 준비
- SDFM 입력: GPIO24(SD1_D1), GPIO25(SD1_C1), GPIO26(SD1_D2), GPIO27(SD1_C2)에 Sigma-Delta 모듈 연결
- LED: GPIO31에 LED 연결 (정상 동작 확인용)
- 외부 클럭: 필요 시 SD1_C1, SD1_C2에 외부 클럭 소스 연결
- PWM 동기화: 예제 3의 경우 GPIO0(ePWM1A)에 오실로스코프 연결
6.4 디버깅
- CCS Expressions 창: Sdfm1Regs.SDDATA1.bit.DATA, Sdfm1Regs.SDDATA2.bit.DATA로 데이터 확인
- 레지스터 점검: Sdfm1Regs.SDCTL, Sdfm1Regs.SDDFPARM1, Sdfm1Regs.SDDFPARM2 모니터링
- 인터럽트 확인: Sdfm1Regs.SDINTFLG로 이벤트 상태 점검
7. 추가 팁
- 캘리브레이션: Device_cal() 호출로 클럭 보정
- 노이즈 감소: 아날로그 입력에 저역통과 필터 사용
- C2000Ware 참고: C:\ti\c2000\C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\cpu1\sdfm
- 문제 해결:
- 데이터 오류: SDCTL.bit.SDEN, SDDFPARM1.bit.FEN 확인
- 인터럽트 실패: SDINT.bit.CMPHINTEN, SDINT.bit.DRINTEN 확인
- 동기화 문제: SDDFPARM1.bit.SDSYNCEN, SDSYNC1.bit.SDSYNCSEL 확인
- TI 리소스: TI E2E 포럼, C2000Ware 예제
8. 결론
이 문서는 TMS320F28377D SDFM 모듈의 설정 방법과 Bitfield 구조를 활용한 예제 코드를 제공하여 고해상도 아날로그-디지털 변환 애플리케이션에 쉽게 적용할 수 있도록 구성했습니다. 기본 데이터 수집, 비교기 인터럽트, PWM 동기화, 다중 채널 설정 예제를 통해 다양한 애플리케이션(모터 제어, 센서 인터페이스 등)에 활용 가능합니다.
키워드: TMS320F28377D, SDFM, C2000, Sigma-Delta, 마이크로컨트롤러, Code Composer Studio, 고해상도 ADC, Sinc 필터, 오버샘플링, PWM 동기화, Manchester 코딩
'MCU > C2000' 카테고리의 다른 글
[TI C2000]CMD 파일: 상세 설명, 구조, 작성 방법 및 예제(C2000 CMD File: Detailed Explanation, Structure, Writing Methods, and Examples) (2) | 2025.08.18 |
---|---|
[TMS320F28377D] FPU, TMU, VCU-II 사용법 : 예제 코드 및 활용 가이드 (1) | 2025.08.18 |
[TMS320F28377D] DAC 및 Fault Trip Zones 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.18 |
[TMS320F28377D] USB, I2C, McBSP, uPP 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.18 |
[TMS320F28377D] ePWM CMPASS 사용법: Bitfield 구조 활용 예제 코드 (0) | 2025.08.18 |
[TMS320F28377D] SPI 사용법 : Bitfield 구조 활용 예제 코드 (2) | 2025.08.18 |
[TMS320F28377D] DMA 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.18 |
[TMS320F28377D] CLA 사용법 : Bitfield 구조 활용 예제 코드 (1) | 2025.08.18 |