본문 바로가기

WCH/CH32V20x

CH32V208 SSM - ADC 테스트, 내부 온도센서 출력

 

CH32V208은 의 ADC를 테스트 해보자.

CH32V208 SSM에 실장된 CH32V208GBL6는 QFN28 핀 페키지로 총 8개의 ADC 입력을 받을 수 있다.

  • PA0 (ADC_IN0 / AIN0)
  • PA1 (ADC_IN1 / AIN1)
  • PA2 (ADC_IN2 / AIN2)
  • PA3 (ADC_IN3 / AIN3)
  • PA4 (ADC_IN4 / AIN4)
  • PA5 (ADC_IN5 / AIN5)
  • PA6 (ADC_IN6 / AIN6)
  • PA7 (ADC_IN7 / AIN7)

아래와 같이 CH32V208의 ADC 초기화 함수를 이용하여 기본 설정을 할수 있다.

void ADC_Function_Init(void)
{
    ADC_InitTypeDef  ADC_InitStructure = {0};
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_ADCCLKConfig(RCC_PCLK2_Div8);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    ADC_DeInit(ADC1);
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStructure);

    ADC_Cmd(ADC1, ENABLE);

    ADC_BufferCmd(ADC1, DISABLE); //disable buffer
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
    Calibrattion_Val = Get_CalibrationValue(ADC1);

    ADC_BufferCmd(ADC1, ENABLE); //enable buffer

    ADC_TempSensorVrefintCmd(ENABLE);
}

 

 

SSM 확장 테스트 보드를 이용하여 ADC에 연결된 가변저항의 전압값을 출력 하는 예제

int main(void)
{
    u16 ADC_val;
    s32 val_mv;

    Delay_Init();
    USART_Printf_Init(115200);
    printf("SystemClk:%d\r\n", SystemCoreClock);

    ADC_Function_Init();
    printf("CalibrattionValue:%d\n", Calibrattion_Val);

    while(1)
    {
        ADC_val = Get_ADC_Val(ADC_Channel_0);
        ADC_val = Get_ConversionVal(ADC_val);

        val_mv = (ADC_val * 3300 / 4096);

        printf("%d,%d\n", ADC_val, val_mv);

        Delay_Ms(100);
    }
}

 

 


CH32V208 내장 온도 센서 테스트

CH32V208 은 내장 온도 센서를 포함하고 있다. 칩 내부의 온도를 측정하는 데 사용되며, ADC 모듈의 내부 채널에 연결된다.

 

이번에는 CH32V208의 ACD 채널을 설정해서 ADC값을 읽어오는 함수 Get_ADC_Val() 함수를 만들어서 좀더 유연하게 코드를 작성해 보자.

u16 Get_ADC_Val(u8 ch)
{
    u16 val;

    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);

    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

    val = ADC_GetConversionValue(ADC1);

    return val;
}

u16 Get_ConversionVal(s16 val)
{
    if((val + Calibrattion_Val) < 0)
        return 0;
    if((Calibrattion_Val + val) > 4095)
        return 4095;
    return (val + Calibrattion_Val);
}

 

 

 

 

내장 온도 센서는 ADC16, ADC17을 이용해서 온도 값을 읽어 올수 있다. 내부 온도 센서와 참조 전압을 사용하려면 ADC_TempSensorVrefintCmd(ENABLE) 함수를 호출해야 한다.

 

  • ADC_IN16: 내장 온도 센서 (Internal Temperature Sensor)
  • ADC_IN17: 내부 참조 전압 (Internal Reference Voltage)
void ADC_Internal_Init(void) {
    ADC_InitTypeDef ADC_InitStructure = {0};

    // 1. ADC 클럭 및 전원 활성화
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_ADCCLKConfig(RCC_PCLK2_Div8); // ADC 클럭 설정

    // 2. ADC 기본 설정
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStructure);

    // 3. 내부 온도 센서 및 Vrefint 활성화
    ADC_TempSensorVrefintCmd(ENABLE); 

    // 4. ADC 활성화 및 교정(Calibration)
    ADC_Cmd(ADC1, ENABLE);
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
}

 

 

ADC_Channel_TempSensor 채널을 선택해서 TempSensor_Volt_To_Temper 함수로 칩 내부 온도 값을 출력하는 예제를 작성해 보자.

 

 

 

int main(void)
{
    u16 ADC_val;
    s32 val_mv;

    Delay_Init();
    USART_Printf_Init(115200);
    printf("SystemClk:%d\r\n", SystemCoreClock);

    ADC_Function_Init();
    printf("CalibrattionValue:%d\n", Calibrattion_Val);

    while(1)
    {
        ADC_val = Get_ADC_Val(ADC_Channel_TempSensor);
        Delay_Ms(500);

        ADC_val = Get_ConversionVal(ADC_val);
        val_mv = (ADC_val * 3300 / 4096);

        printf("%d, mv-T-%d,%0d\n", ADC_val, val_mv, TempSensor_Volt_To_Temper(val_mv));

        Delay_Ms(2);
    }
}

 

 

코드를 구동해 보면 온도 값을 출력하긴 하는데... 실제 대기 온도와는 차이가 많은것 같다.
주변 환경 온도가 아이고 칩 자체의 코어 온도를 측정하는 용도 인것 같다. 스펙에는 ±5°C 정도의 오차가 있다고 한다.

반응형