STM32F103 ADC初始化函数

//ADC初始化
void ADCx_Init(void)
{
    //定义结构体
    GPIO_InitTypeDef      GPIO_InitStructure;
    ADC_InitTypeDef       ADC_InitStructure;
    
    //使能 GPIOA 端口时钟和 ADC1 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
    
    //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    
    //设置 GPIOA
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;    //模拟输入
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    //初始化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;//1个转换在规则序列中 也就是只转换规则序列1
    ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
    
    ADC_Cmd(ADC1, ENABLE);//开启AD转换器
    
    ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器
    while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态
    
    ADC_StartCalibration(ADC1);//开始指定ADC的校准状态
    while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序
    
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的ADC的软件转换启动功能
}

//获取通道 ch 的转换值,取 times 次,然后平均
//ch:通道编号
//times:获取次数
//输出: 通道 ch 的 times 次转换结果平均值
u16 Get_ADC_Value(u8 ch,u8 times)
{
    u32 temp_val=0;
    u8 t;
    
    //设置指定ADC的规则组通道,一个序列,采样时间
    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);    //ADC1,ADC通道,239.5个周期,提高采样时间可以提高精确度                
    
    for(t=0;t<times;t++)
    {
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的软件转换启动功能    
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
        temp_val+=ADC_GetConversionValue(ADC1);
        delay_ms(5);
    }
    return temp_val/times;
}


版权声明:本文为weixin_32093149原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。