본문 바로가기

[TI]/MSP0M

[MSPM0L1306 SSM] PWM 테스트

 

MSPM0L1306의 PWM 테스트를 해 보자. 

MSPM0 는 아날로그 기능도 좋지만 PWM도 다양한 설정으로 세팅할 수 있기 때문에 모터 제어나 전력 제어용으로 사용하기 좋을것 같다. 

 

 

syscfg 파일에서 TIMER를 추가 하고 PWM 관련 다양한 옵션을 추가 할 수 있다.

 

 

우선 TIMER 기능중 가장 간단한 TIMG0을 사용하여 고정 주파수와 듀티 사이클을 갖는 에지 정렬 PWM 파형 출력을 해 보자

 

 

syscfg 로 생성된 코드에서 DL_TimerG_startCounter() 함수를 호출 하면 PWM 출력이 50%로 출력 되는것을 확인 할 수 있다.

int main(void)
{
    SYSCFG_DL_init();
    NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);

    DL_TimerG_startCounter(PWM_0_INST);

    while (1) 
    {
        __WFE();
    }
}

 

 

PWM주파수는 DL_TimerG_setCaptureCompareValue() 함수를 이용해서 변경 가능하다.

 

 


MSPM0L1306 SSM 보드를 이용한 ADC 테스트 예제 코드를 이용하여 가변저항 값에 따라 PWM출력을 변경하는 코드를 테스트 해 보자. 

volatile bool gCheckADC;
volatile uint16_t gADCResult;
volatile uint32_t gCCV;

void ADC12_0_INST_IRQHandler(void)
{
    switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST)) {
        case DL_ADC12_IIDX_MEM0_RESULT_LOADED:
            gCheckADC = true;
            break;
        default:
            break;
    }
}


unsigned int GetADC(void)
{
    unsigned int adc = 0;

    DL_ADC12_startConversion(ADC12_0_INST);

    while (false == gCheckADC) {
        __WFE();
    }

    adc = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);

    gCheckADC = false;
    DL_ADC12_enableConversions(ADC12_0_INST);

    return adc;
}


int main(void)
{
    SYSCFG_DL_init();
    NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);
    
    DL_TimerG_startCounter(PWM_0_INST);

    printf("ADC- PWM Test\r\n");
    while (1) {
        gADCResult = GetADC();
        gCCV = DL_Timer_getLoadValue(PWM_0_INST)*gADCResult/4096;
        DL_TimerG_setCaptureCompareValue(PWM_0_INST, DL_Timer_getLoadValue(PWM_0_INST)-gCCV, DL_TIMER_CC_0_INDEX);
        
        printf("%d\r\n", gADCResult);
    }
}

 

 

 

 

 

반응형