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);
}
}
반응형