CH32X035 는 12bit ADC가 11채널 (내부 1채널) 있다.
터치 키 정전 용량 감지 장치도 ADC로 처리 할수 있다고 한다.
참고: ADC의 채널 3, 채널 7, 채널 11 및 채널 15 기능은 제품에 사용할 수 없다. (로트번호의 끝에서 두 번째 5자리가 0이 되는 것)
일단 기본 예제로 테스트 해보자
CH32X035 ADC 초기화 함수
void ADC_Function_Init(void)
{
ADC_InitTypeDef ADC_InitStructure = {0};
GPIO_InitTypeDef GPIO_InitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
ADC_DeInit(ADC1);
ADC_CLKConfig(ADC1, ADC_CLK_Div6);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
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 변환 함수
u16 Get_ADC_Val(u8 ch)
{
u16 val;
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_11Cycles);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
val = ADC_GetConversionValue(ADC1);
return val;
}
기본 예제는 잘 동작 한다. 나머지 예제들도 테스트 해 볼 필요가 있을것 같다.
int main(void)
{
u16 i;
SystemCoreClockUpdate();
Delay_Init();
USART_Printf_Init(115200);
printf("SystemClk:%d\r\n", SystemCoreClock);
printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
ADC_Function_Init();
while(1)
{
printf("%d, ", Get_ADC_Val(ADC_Channel_8));
printf("%d\r\n", Get_ADC_Val(ADC_Channel_9));
Delay_Ms(100);
}
}
반응형