江科大学习笔记 _9.模数转换


1. RCC时钟 ADC、GPIO,ADC分频器CLK配置
2. 配置GPIO,模拟输入
3. 配置多路开关
4. 配置ADC转换器
1.RCC时钟 ADC、GPIO,ADC分频器CLK配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
2.配置GPIO,模拟输入
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
3.配置多路开关
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
4.配置ADC转换器
ADC_InitTypeDef ADC_InitStruct;
ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//是否是连续转换模式
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//右对齐
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
//外部触发方式,不使用外部触发
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//单ADC
ADC_InitStruct.ADC_NbrOfChannel = 1; //通道数目,仅在扫描模式下有用
ADC_InitStruct.ADC_ScanConvMode = DISABLE; //是否是连续扫描模式
ADC_Init(ADC1, &ADC_InitStruct);
ADC_Cmd(ADC1, ENABLE);
开启ADC之后,根据手册建议,进行校准
ADC_ResetCalibration(ADC1);//复位校准
while(ADC_GetResetCalibrationStatus(ADC1) == SET);//等待复位校准完成
ADC_StartCalibration(ADC1);//启动校准
while(ADC_GetCalibrationStatus(ADC1) == SET);//等待校准完成
uint16_t AD_GetValue(uint8_t ADC_Channel)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}