본문 바로가기
Power Electronics

디지탈 전력변환-제5장 고속 제어 루프 설계 — CLA, DMA, 루프 타이밍 최적화

by linuxgo 2026. 6. 30.

5.1 서론 

전력 변환기의 성능은 결국 제어 루프의 실행 주기와 정밀도로 귀결된다. 스위칭 주파수가 높아질수록 인덕터와 커패시터를 작게 만들 수 있고, 제어 루프가 빠를수록 부하 과도 응답이 좋아진다. 그러나 제어 루프 주기를 무한정 줄일 수 없는 이유는 분명하다 — 매 주기마다 ADC 변환을 기다리고, 제어 알고리즘을 계산하고, PWM 듀티를 갱신하는 데 소요되는 시간이 반드시 한 주기 안에 들어와야 하기 때문이다.

1장에서 우리는 C28x CPU 인터럽트의 최소 레이턴시가 14사이클(70ns)이라는 것을 확인했다. 이것은 기준점일 뿐, 실제 제어 루프의 지연은 ADC 변환시간(55ns, PRESCALE=0 12-bit 기준)과 제어 알고리즘 연산 시간이 더해진 총합이다. F28P65x가 이 한계를 어떻게 극복하는지에 대한 답이 이 장의 주제다.

F28P65x는 두 가지 핵심 하드웨어 가속기를 제공한다.

  • CLA(Control Law Accelerator): CPU와 완전히 독립적으로 동작하는 32-bit 부동소수점 코프로세서. CLA가 제어 루프를 전담하면 CPU는 통신·진단 같은 비실시간 작업을 병행할 수 있다.
  • DMA(Direct Memory Access): CPU 개입 없이 주변장치 ↔ RAM 간 데이터를 자동 전송. ADC 결과를 CPU가 직접 읽지 않아도 DMA가 버퍼에 쌓아두면 CPU 또는 CLA는 버퍼에서 일괄 처리할 수 있다.

이 두 가속기의 작동 원리와 설정 방법, 그리고 실제 20kHz~100kHz 제어 루프를 설계하는 방법론을 이 장에서 다룬다.

5.2 CLA — Control Law Accelerator

5.2.1 CLA의 위치와 역할

CLA는 독립적이고 완전히 프로그래밍 가능한 32-bit 부동소수점 수학 프로세서로, C28x 패밀리에 동시(concurrent) 제어 루프 실행 능력을 제공한다. CLA의 낮은 인터럽트 레이턴시는 CLA가 ADC 샘플을 "적시에(just-in-time)" 읽을 수 있게 하여, ADC 샘플링부터 출력까지의 지연을 크게 줄이고 더 빠른 시스템 응답과 높은 주파수의 제어 루프를 가능하게 한다. 시간에 민감한 제어 루프를 CLA가 전담하면, 메인 CPU는 통신·진단 같은 다른 시스템 작업을 자유롭게 수행할 수 있다.

F28P65x의 CLA 특성:

  • SYSCLK와 동일한 속도로 동작 (최대 200MHz)
  • IEEE 754 단정밀도(32-bit) 부동소수점 지원
  • 독립된 8단계 파이프라인 — CPU 파이프라인과 완전히 분리
  • 4개의 32-bit 결과 레지스터 (MR0~MR3)
  • 2개의 16-bit 보조 레지스터 (MAR0, MAR1)
  • 최대 8개의 독립 태스크 — 각 태스크는 별도의 벡터 주소에서 시작
  • 태스크 중첩(nesting) 없음 — 한 번에 하나의 태스크만 실행

5.2.2 CLA 메모리 구조

CLA는 세 종류의 메모리에 접근한다.

CLA 프로그램 메모리: LSxRAM 중 선택한 블록에 CLA 코드를 올린다. MemCfg_setLSRAMControllerSel()로 해당 LS 블록의 소유권을 CPU+CLA1으로 설정하고, MemCfg_setCLAMemType()으로 CLA 프로그램 메모리로 지정해야 한다.

CLA 데이터 메모리: 마찬가지로 LSxRAM에서 별도 블록을 CLA 데이터 영역으로 할당한다.

메시지 RAM (CLA ↔ CPU): CPU→CLA 방향과 CLA→CPU 방향으로 각각 하나씩 존재한다. 이 블록은 항상 CPU와 CLA 모두에 매핑되어 있으며, CPU는 CPU→CLA 블록에 쓰고 CLA→CPU 블록은 읽기만 가능하다. CLA는 반대다. 메시지 RAM은 제어 지령(setpoint 등)과 결과(출력 듀티 등)를 CPU와 CLA 사이에서 교환하는 핵심 경로다.

5.2.3 CLA와 CPU/DMA 간 중재 우선순위

CLA, DMA, CPU가 동시에 같은 메모리 또는 주변장치에 접근할 때 고정 우선순위 체계가 적용된다.

1. DMA 쓰기   (최고 우선순위)
2. DMA 읽기
3. CLA 쓰기
4. CLA 읽기
5. CPU 쓰기
6. CPU 읽기   (최저 우선순위)

주변장치 레지스터(예: ePWM CMPA)에 CLA와 CPU가 동시에 접근하면 CLA가 우선된다. 중요한 규칙: CPU가 read-modify-write 연산 중에 CLA가 같은 위치에 쓰면 CLA의 쓰기가 손실될 수 있으므로, 같은 레지스터를 CPU와 CLA가 함께 접근하는 설계는 피해야 한다.

5.2.4 태스크 트리거 소스

CLA 태스크는 주변장치 인터럽트, CPU 소프트웨어(IACK 명령어 또는 MIFRC 레지스터 쓰기), 또는 백그라운드 태스크 방식으로 트리거된다. CLA_setTriggerSource()로 각 태스크의 트리거 소스를 지정한다.

전력 제어에서 자주 쓰이는 트리거 소스는 다음과 같다.

CLA_Trigger 상수 트리거 소스
CLA_TRIGGER_SOFTWARE 0 소프트웨어 강제 트리거
CLA_TRIGGER_ADCA1 1 ADCAINT1
CLA_TRIGGER_ADCB1 6 ADCBINT1
CLA_TRIGGER_ADCC1 11 ADCCINT1
CLA_TRIGGER_EPWM1INT 36 EPWM1_INT
CLA_TRIGGER_EPWM2INT 37 EPWM2_INT

5.2.5 CLA 초기화 순서

CLA 초기화는 다음 순서를 따른다.

1. CLA 코드를 CLA 프로그램 RAM에 복사 (Flash 또는 CPU 데이터 메모리에서)
2. CLA 데이터 RAM 초기화 (계수, 룩업테이블 등)
3. CLA 레지스터 설정 (이 시점에서 MIER=0 유지):
   a. CLA1 주변장치 클록 활성화 (SYSCTL_PERIPH_CLK_CLA1)
   b. 태스크 인터럽트 벡터 설정 (MVECT1~MVECT8)
   c. 트리거 소스 설정 (CLA_setTriggerSource)
   d. CLA 프로그램 RAM 소유권 이전 (MemCfg_setLSRAMControllerSel → CLA1)
   e. CLA 프로그램 메모리 타입 지정 (MemCfg_setCLAMemType → PROGRAM)
4. PIE 벡터 테이블 및 레지스터 초기화
5. CLA 태스크 인터럽트 활성화 (MIER 비트 세트)
6. 주변장치 초기화 (ePWM, ADC 등)

중요: CLA 태스크는 설정된 인터럽트 소스의 레벨 천이(하강 에지)에서만 트리거된다. 주변장치가 먼저 활성화되어 CLA 설정이 끝나기 전에 인터럽트가 발생하면, CLA는 그 에지를 인식하지 못하고 응답하지 않는다. 따라서 CLA 설정이 완전히 끝난 후에 ePWM/ADC 등 주변장치를 활성화해야 한다.

5.2.6 CLA 파이프라인 — 쓰기 후 읽기 주의사항

CLA 파이프라인은 C28x CPU와 마찬가지로 읽기가 쓰기보다 먼저 일어난다. 즉 쓰기 명령 직후에 읽기 명령이 오면, 읽기가 먼저 완료된다. 쓰기 후 읽기가 의도한 순서대로 동작하려면 그 사이에 4개의 NOP 명령어를 삽입해야 한다.

이 제약은 C28x CPU에는 없다 — CPU는 write-followed-by-read 보호를 하드웨어로 처리하지만, CLA는 그렇지 않다. CLA C 코드에서는 컴파일러가 자동으로 처리하지만, CLA 어셈블리를 직접 작성할 때는 이 규칙을 수동으로 지켜야 한다.

5.2.7 Driverlib 코드 — CLA 초기화 (ADC 완료 트리거)

/*==============================================================================
 * 파일   : cla_init.c
 * 목적   : CLA Task 1을 ADCA INT1(ADC 변환 완료) 트리거로 설정
 *          LS4 = CLA 프로그램 메모리, LS5 = CLA 데이터 메모리
 *
 * CLA 태스크 함수 선언은 별도 .cla 또는 .c 파일에서 정의
 *   __attribute__((interrupt)) void cla_task1(void);
 *============================================================================*/

#include "driverlib.h"
#include "device.h"

/* CLA 태스크 함수 — 링커가 CLA 프로그램 섹션(.cla 섹션)에 배치 */
extern __attribute__((interrupt)) void cla_task1(void);

void CLA1_ControlLoopInit(void)
{
    /* CLA1 클록 활성화 */
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CLA1);

    /*------------------------------------------------------------------
     * LS4 — CLA 프로그램 메모리
     * LS5 — CLA 데이터 메모리
     * MemCfg_setLSRAMControllerSel: 소유권을 CPU+CLA1 공유로 설정
     * MemCfg_setCLAMemType: 프로그램/데이터 용도 지정
     *------------------------------------------------------------------*/
    MemCfg_setLSRAMControllerSel(MEMCFG_SECT_LS4,
                                  MEMCFG_LSRAMCONTROLLER_CPU_CLA1);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS4, MEMCFG_CLA_MEM_PROGRAM);

    MemCfg_setLSRAMControllerSel(MEMCFG_SECT_LS5,
                                  MEMCFG_LSRAMCONTROLLER_CPU_CLA1);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS5, MEMCFG_CLA_MEM_DATA);

    /* Task 1 벡터: CLA 태스크 함수 시작 주소 */
    CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_1,
                      (uint16_t)(&cla_task1));

    /* Task 1 트리거: ADCA INT1 (ADC 변환 완료) */
    CLA_setTriggerSource(CLA_TASK_1, CLA_TRIGGER_ADCA1);

    /* 하드웨어 트리거 활성화 */
    CLA_enableHardwareTrigger(CLA1_BASE);

    /* Task 1 인터럽트 활성화 — 태스크 완료 시 CPU에 알림 */
    CLA_enableTasks(CLA1_BASE, CLA_TASKFLAG_1);

    /* IACK 명령어로 소프트웨어 트리거 허용 */
    CLA_enableIACK(CLA1_BASE);
}

5.3 DMA — Direct Memory Access

5.3.1 DMA의 역할과 구조

DMA 모듈은 CPU 개입 없이 주변장치와 메모리 간에 데이터를 전송하는 하드웨어 방법을 제공하여, 다른 시스템 기능을 위한 대역폭을 확보한다. 추가로 DMA는 전송 중 데이터를 직교적으로 재배열하거나 버퍼 간 "핑퐁" 전송을 수행하는 능력을 가진다.

F28P65x DMA의 주요 특성:

  • 6개 독립 채널 — 각 채널에 독립 PIE 인터럽트
  • 다중 트리거 소스 — 채널마다 독립적으로 선택 가능
  • 전송 단위: 16-bit 또는 32-bit (SPI는 16-bit 전용)
  • 처리량: 중재 없을 시 3사이클/워드
  • 소스/목적지 주소 자동 증감 (burst step, transfer step)
  • 핑퐁(ping-pong) 버퍼링 지원 (wrap 기능)
  • Channel 1: 고우선순위 모드 가능 (다른 채널 진행 중에 즉시 선점)

5.3.2 DMA 전송 구조 — 중첩 루프

DMA의 전송 과정은 두 개의 중첩 루프로 구성된다.

버스트(내부 루프): 트리거 이벤트 1회당 BURST_SIZE + 1개의 워드를 전송한다. 버스트 크기는 최대 32워드이다.

트랜스퍼(외부 루프): TRANSFER_SIZE + 1개의 버스트가 모이면 전송 완료로 처리하고 PIE 인터럽트를 발생시킨다.

레지스터 값 규칙: SIZE 레지스터에 기록하는 값은 의도한 크기보다 1 작은 값이다. 예를 들어 16-bit 워드 3개를 전송하려면 SIZE 레지스터에 2를 기록한다. Driverlib DMA_configBurst()와 DMA_configTransfer()도 이 규칙을 따른다.

5.3.3 OneShot 모드와 Continuous 모드

OneShot 모드(기본값 비활성): OneShot이 비활성화된 상태(DMA_CFG_ONESHOT_DISABLE)에서는 트리거 1회당 버스트 1개만 전송된다. 트랜스퍼 전체를 완료하려면 TRANSFER_SIZE + 1번의 트리거가 필요하다. 이 방식은 단일 채널이 DMA 버스를 독점하지 못하게 하므로 다채널 운용 시 권장된다.

OneShot 활성화(DMA_CFG_ONESHOT_ENABLE) 시에는 트리거 1회에 트랜스퍼 전체를 한 번에 완료한다.

Continuous 모드(기본값 비활성): Continuous 비활성화 시 트랜스퍼 완료 후 채널이 자동으로 비활성화되며, 다음 전송을 시작하려면 DMA_startChannel()을 다시 호출해야 한다. Continuous 활성화 시에는 트랜스퍼 완료 후 채널이 계속 활성 상태를 유지하여 다음 트리거를 기다린다.

5.3.4 채널 우선순위

두 가지 우선순위 방식이 존재한다.

라운드로빈 모드: CH1→CH2→CH3→CH4→CH5→CH6→CH1… 순서로 동등 우선순위 처리.

Channel 1 고우선순위 모드: CH1이 가장 높은 우선순위를 가지며, CH2~6가 버스트 처리 중이더라도 현재 워드 전송 완료 직후 CH1을 선점하여 먼저 처리한다. ADC 결과 전송처럼 데이터 레이트가 높은 경우 CH1을 사용하는 것이 권장된다.

고우선순위 모드와 OneShot 모드는 Channel 1에서 동시에 사용할 수 없다.

5.3.5 처리량 계산 — 실제 사이클 수

16-bit, 16워드/버스트 × 8버스트(=128 워드) 전송:

$$8 \times [(3 \times 16) + 1] = 392 \text{ 사이클}$$

32-bit 전환 시(같은 데이터량):

$$8 \times [(3 \times 8) + 1] = 200 \text{ 사이클}$$

가능하면 32-bit 모드(DMA_CFG_SIZE_32BIT)를 사용하는 것이 효율적이다. ADC 결과 레지스터는 CPU, CLA, DMA 모두에게 복제되어 있어 세 컨트롤러가 동시에 읽어도 중재 없이 지연이 없다.

5.3.6 DMA 트리거 소스 (전력제어 관련 발췌)

DMA_Trigger 상수 트리거 소스
DMA_TRIGGER_SOFTWARE 0 소프트웨어 강제 트리거
DMA_TRIGGER_ADCA1 1 ADCAINT1_DMA
DMA_TRIGGER_EPWM1SOCA 36 EPWM1_SOCA
DMA_TRIGGER_EPWM1SOCB 37 EPWM1_SOCB
DMA_TRIGGER_EPWM2SOCA 38 EPWM2_SOCA
DMA_TRIGGER_EPWM17SOCA 71 EPWM17_SOCA
DMA_TRIGGER_EPWM18SOCA 73 EPWM18_SOCA

5.3.7 Driverlib 코드 — ADC 결과 자동 수집 (DMA, ADCA → RAM)

/*==============================================================================
 * 파일   : dma_init.c
 * 목적   : DMA CH1을 이용해 ADCA 결과 16개를 매 ePWM SOCA마다 RAM으로 자동 전송
 *          CH1 고우선순위 모드, 16-bit, Continuous
 *============================================================================*/

#include "driverlib.h"
#include "device.h"

/* ADC 결과 수집 버퍼 — 16개 SOC 결과 저장 */
#pragma DATA_SECTION(adcResultBuf, "adcBufSection")
volatile uint16_t adcResultBuf[16];

void DMA_CH1_ADCResultInit(void)
{
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DMA);
    DMA_initController();

    /* 소스: ADCARESULT0, 목적지: adcResultBuf */
    DMA_configAddresses(DMA_CH1_BASE,
                        (const void *)adcResultBuf,           /* 목적지 */
                        (const void *)ADCARESULT_BASE);        /* 소스   */

    /* 버스트: 16워드/버스트, 소스 주소 +1(다음 SOC 레지스터), 목적지 +1 */
    DMA_configBurst(DMA_CH1_BASE,
                    16U,    /* 버스트당 16 워드 */
                    1,      /* srcStep: +1 (SOC0~SOC15 순차 읽기) */
                    1);     /* destStep: +1 (버퍼 순차 쓰기) */

    /* 트랜스퍼: 버스트 1개로 트랜스퍼 완료, 주소 스텝=0(매번 처음부터) */
    DMA_configTransfer(DMA_CH1_BASE,
                       1U,    /* 트랜스퍼당 1 버스트 */
                       0,     /* srcStep: 트랜스퍼 완료 후 소스 주소 오프셋 0 */
                       0);    /* destStep: 목적지 주소 오프셋 0 */

    /* 트리거: ADCA INT1, 전송크기: 16-bit, OneShot OFF, Continuous ON */
    DMA_configMode(DMA_CH1_BASE,
                   DMA_TRIGGER_ADCA1,
                   DMA_CFG_ONESHOT_DISABLE  |
                   DMA_CFG_CONTINUOUS_ENABLE |
                   DMA_CFG_SIZE_16BIT);

    /* 트랜스퍼 완료 시 인터럽트 */
    DMA_setInterruptMode(DMA_CH1_BASE, DMA_INT_AT_END);
    DMA_enableInterrupt(DMA_CH1_BASE);

    DMA_enableTrigger(DMA_CH1_BASE);
    DMA_startChannel(DMA_CH1_BASE);
}

 

5.4 제어 루프 레이턴시 분석

5.4.1 ADC 샘플부터 PWM 갱신까지

전력 변환기 제어 루프의 실제 지연(sample-to-output delay)은 다음 단계들의 합으로 결정된다.

ADC 변환 완료
    │
    ├─ (경로 A: CPU ISR 방식)
    │   CPU 인터럽트 레이턴시              14 사이클 (70 ns)
    │   ADC 결과 읽기                      1 사이클  (5 ns)
    │   제어 알고리즘 연산                 N 사이클
    │   PWM CMPA 레지스터 갱신             1 사이클  (5 ns)
    │
    └─ (경로 B: CLA ADC "just-in-time" 방식)
        ADC 조기 인터럽트(샘플링 시작 직후 CLA 트리거)
        CLA 예비 연산 (ADC 변환 완료 대기 중)
        ADC 결과 읽기 (변환 완료 직후)
        CLA 나머지 연산
        PWM CMPA 레지스터 갱신

"just-in-time" 방식은, ADC가 조기 인터럽트(early interrupt) 펄스를 샘플링 시작 시점에 발생시키도록 설정하고, CLA가 그 인터럽트에 반응하여 변환 중에 미리 데이터를 로드하거나 예비 연산을 수행하다가 변환이 완료되는 순간 ADC 결과를 읽는 방식이다. 이렇게 하면 ADC 변환 시간(10.5 ADCCLK 사이클)이 제어 루프 레이턴시에서 사실상 사라진다.

5.4.2 제어 루프 주기 예산(Budget) — 개념적 예시

다음 표는 SYSCLK=200MHz, 목표 제어 루프 20kHz(주기 50μs=10,000사이클) 환경에서 각 단계가 차지하는 사이클 수의 개념적 구성을 보여준다. 인터럽트 레이턴시(14사이클)와 ADC 변환 대기(11사이클, PRESCALE=0·12-bit)는 확정값이지만, PID 연산 사이클 수는 실제 구현·컴파일러 최적화·연산 종류(고정소수점/부동소수점, TMU 사용 여부)에 따라 크게 달라지므로 일반적인 가늠값일 뿐 측정값이 아니다.

항목 사이클 수 근거
인터럽트 레이턴시 14 1장에서 확정
ADC 변환 대기(PRESCALE=0, 12-bit) 11 1장에서 확정
CLA 컨텍스트 저장 0 CLA는 컨텍스트 저장이 불필요한 구조
PID 연산(부동소수점, TMU 활용 가정) 추정치, 구현에 따라 가변 실측 필요 — 본서에서 코드를 작성·측정한 값이 아님
PWM 갱신 1 Driverlib 인라인 함수(2장 확인)

실제 설계 단계에서는 이 표의 PID 연산 항목을 추정치로 남겨두지 말고, CCS 프로파일러나 GPIO 토글 측정을 통해 작성한 알고리즘의 실제 사이클 수를 확인한 뒤 주기 예산을 산정해야 한다.

5.4.3 글로벌 로드(Global Load) — 다중 ePWM 동기 갱신

전력 변환기에서 여러 ePWM 모듈의 CMPA/CMPB를 동일 타이밍에 갱신하지 않으면, 게이트 신호 간 위상 관계가 틀어진다. ePWM의 글로벌 로드(Global Shadow-to-Active Load) 기능을 사용하면 모든 모듈의 쉐도우 레지스터를 한 번에 액티브로 전환할 수 있다.

1장에서 설정한 EPWM_setCounterCompareShadowLoadMode()는 이 글로벌 로드의 전제 조건이다 — 각 모듈이 카운터=0 시점에 쉐도우에서 액티브로 전환하도록 설정되어 있으면, 모든 모듈의 카운터=0이 동시에 발생하는 시점에 자동으로 동기 갱신된다. 2장에서 다룬 TBCLKSYNC 설정이 바로 이 카운터 동기화를 보장한다.

5.5 실전 코드 — CPU + CLA 병렬 제어 루프

/*==============================================================================
 * 파일   : main_cpu1_cla.c
 * 목적   : CPU1 메인 + CLA Task1 ADC 완료 기반 20kHz 제어 루프
 *          CPU: 통신, 진단, 상위 제어
 *          CLA: 전류/전압 피드백 → PID → PWM 듀티 갱신 (실시간)
 *
 * 메시지 RAM 교환 구조:
 *   CPU → CLA: 제어 목표값(setpoint), 제어기 파라미터
 *   CLA → CPU: 측정값(v_bus, i_L), 제어 출력(duty)
 *============================================================================*/

#include "driverlib.h"
#include "device.h"

/*--- CPU ↔ CLA 메시지 RAM 데이터 구조체 ---*/
/* CPU가 CLA에 쓰는 영역 (섹션 배치는 .cmd 파일에서 지정) */
#pragma DATA_SECTION(cpuToCla1, "CpuToCla1MsgRAM")
typedef struct {
    float  setpoint;    /* 전압/전류 목표값 */
    float  kp;          /* PID 비례 게인 */
    float  ki;          /* PID 적분 게인 */
    float  kd;          /* PID 미분 게인 */
} CpuToCla1_t;
volatile CpuToCla1_t cpuToCla1;

/* CLA가 CPU에 쓰는 영역 */
#pragma DATA_SECTION(cla1ToCpu, "Cla1ToCpuMsgRAM")
typedef struct {
    float  vBus;        /* 측정 버스 전압 [V] */
    float  iL;          /* 측정 인덕터 전류 [A] */
    float  duty;        /* 현재 듀티비 [0.0~1.0] */
    float  errIntegral; /* 적분 상태 변수 */
} Cla1ToCpu_t;
volatile Cla1ToCpu_t cla1ToCpu;

void main(void)
{
    Device_init();
    Device_initGPIO();

    Interrupt_initModule();
    Interrupt_initVectorTable();

    /* 주변장치 초기화 */
    SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    EPWM1_Init();   /* 1장 1.9.2절 코드 */
    ADCA_Init();    /* 1장 1.9.3절 코드 */
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

    /* CLA 초기화 — 반드시 주변장치 활성화 이전에 완료 */
    CLA1_ControlLoopInit();

    /* 초기 제어 파라미터 설정 */
    cpuToCla1.setpoint = 48.0f;  /* 목표 전압 48V */
    cpuToCla1.kp = 0.1f;
    cpuToCla1.ki = 0.01f;
    cpuToCla1.kd = 0.001f;

    Interrupt_enableGlobal();
    ERTM;

    /* CPU 백그라운드 루프 — 비실시간 작업 */
    while(1)
    {
        /* UART/CAN 통신, 진단, 상태 모니터링 등 */
        /* cla1ToCpu.vBus, cla1ToCpu.duty 모니터링 가능 */
    }
}

 

5.6 장 요약

본 장에서는 F28P65x 전력 변환기 펌웨어의 실시간 성능을 결정하는 두 핵심 가속기를 다루었다.

CLA는 CPU와 완전히 독립된 32-bit 부동소수점 코프로세서로, 최대 8개의 태스크를 주변장치 인터럽트에 반응해 실행한다. CPU와 CLA가 같은 메모리나 레지스터에 동시에 접근할 때는 고정 우선순위(DMA쓰기 > DMA읽기 > CLA쓰기 > CLA읽기 > CPU쓰기 > CPU읽기)가 적용된다. CLA 설정은 반드시 주변장치 활성화 이전에 완료해야 한다. 또한 CLA 어셈블리에서 쓰기 직후 읽기 시 4개 NOP이 필요하다는 파이프라인 규칙은 C28x CPU에는 없는 CLA 고유의 주의사항이다.

DMA는 트리거 1회당 BURST_SIZE+1개의 워드를 전송하는 버스트와, TRANSFER_SIZE+1개의 버스트로 구성된 트랜스퍼의 2중 루프 구조를 가진다. 레지스터에 기록하는 SIZE 값은 의도한 크기보다 1 작은 값이며, 32-bit 모드가 16-bit 모드보다 전송 사이클이 절반이다. ADC 결과 레지스터는 CPU, CLA, DMA에 각각 복제되어 있어 세 컨트롤러가 동시에 읽어도 중재 지연이 없다.

20kHz 제어 루프에서 인터럽트 레이턴시(14사이클)와 ADC 변환(11사이클)을 합쳐도 25사이클(125ns)에 불과하며, 이는 주기 10,000사이클 대비 0.25%다. 다만 PID 등 실제 알고리즘 연산 사이클은 구현에 따라 달라지므로, 최종 설계 시에는 반드시 프로파일링을 통한 실측이 필요하다.

참고문헌

  1. Texas Instruments, TMS320F28P65x Real-Time Microcontrollers Technical Reference Manual, SPRUIZ1B, July 2023 – Revised August 2024.
  2. Texas Instruments, CLA Software Development Guide, C2000Ware.
  3. Texas Instruments, Software Examples to Showcase Unique Capabilities of TI's C2000™ CLA, Application Report.
  4. Texas Instruments, Digital Control of Two Phase Interleaved PFC and Motor Drive Using MCU With CLA, Application Report.