[Aurix TC275] Background ADC with Interrupt

사이킷·2025년 1월 18일

AURIX MCU

목록 보기
8/13

지금까지는 Task에서 주기적으로 ADC 변환 값을 읽어오는 형태였다.

static void AppTask10ms(void)
{
    
    stTestCnt.u32nuCnt10ms++;
    Unit_Mode();  

    /*ADC Test*/
    Driver_Adc0_DataObtain();
    Driver_Adc0_ConvStart();
}

그 다음으로는 Interrupt를 사용해 ADC 변환 값을 읽고 Task에서는 변환 요청만 주었다.

static void AppTask10ms(void)
{
    
    stTestCnt.u32nuCnt10ms++;
    Unit_Mode();  

    /*ADC Test*/
    //Driver_Adc0_DataObtain();
    Driver_Adc0_ConvStart();
}

이번에는 Background Scan 을 이용하여 Task에서 요청도 안하고 ADC 변환값도 Interrupt 발생했을때 읽는 방식으로 해보겠다.

Module 초기화는 그대로다.

Group Configuration 변경점

    /* enable background scan source */
    adcGroupConfig.arbiter.requestSlotBackgroundScanEnabled = TRUE;

    /* enable background scan */
    adcGroupConfig.backgroundScanRequest.autoBackgroundScanEnabled = TRUE;

    /* enable all gates in "always" mode (no edge detection) */
    adcGroupConfig.backgroundScanRequest.triggerConfig.gatingMode = IfxVadc_GatingMode_always;

Configuration이 모두 바뀌었다. 전부 Background Scan을 위한 값으로 변경되었다.

Channel Configurion 변경점

    /* channel init */
    for (chnIx = 0; chnIx < 5; ++chnIx) {
        IfxVadc_Adc_initChannelConfig(&adcChannelConfig[chnIx], &g_VadcAutoScan.adcGroup);

        adcChannelConfig[chnIx].channelId = (IfxVadc_ChannelId)(chnIx);
        adcChannelConfig[chnIx].resultRegister = (IfxVadc_ChannelResult)(chnIx);
        adcChannelConfig[chnIx].backgroundChannel = TRUE;
        adcChannelConfig[chnIx].resultSrcNr = IfxVadc_SrcNr_group1;

        /* initialize the channel*/
        IfxVadc_Adc_initChannel(&adcChannel[chnIx], &adcChannelConfig[chnIx]);

        /* add to scan */
        unsigned channels = ( 1 << adcChannelConfig[chnIx].channelId);
        unsigned mask = channels;
        IfxVadc_Adc_setBackgroundScan(&g_VadcAutoScan.vadc,&g_VadcAutoScan.adcGroup, channels, mask);
    }

adcChannelConfig[chnIx].backgroundChannel = TRUE; 이 추가되었다.
IfxVadc_Adc_setBackgroundScan(&g_VadcAutoScan.vadc,&g_VadcAutoScan.adcGroup, channels, mask); 로 변경되었다.

start scan 변경점

void Driver_Adc0_ConvStart(void)
{
    IfxVadc_Adc_startBackgroundScan(&g_VadcAutoScan.vadc);
}

IfxVadc_Adc_startBackgroundScan 로 변경되었다.

Task 변경점

static void AppTask10ms(void)
{
    
    stTestCnt.u32nuCnt10ms++;
    Unit_Mode();  

}

이제 Task에서는 어떠한 일도 하지않는다.

RUN


Potentionmeter를 돌렸을때 잘 변경되는것을 확인할 수 있다.

profile
공부한거 정리, 잘못된 정보 태클은 언제나 환영입니다.

0개의 댓글