
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 정도의 오차가 있다고 한다.
반응형