dhhgvm 发表于 2019-3-20 23:24:41

STM32F030F4 adc采集出现神奇异常,求围观解决

单片机型号:STM32F030F4P6
问题:

做ADC采集时,如果不调用LED_Init()函数,ADC的读数最大值就会变成1024,只有10位精度,而且如果把LED 的初始化函数放在ADC初始化函数后面,读数也时最大1024,把LED 初始化函数放在ADC 初始化函数之前,读数就正常,精度变为12位,经排查,时钟源无异常,LED 初始化函数中,必须有GPIO_Init,其他的都可以没有,如果没有这个函数,ADC读数也会异常,求大神帮忙分析原因,感谢#include "ALL_Includes.h"//包含所需的头文件


/************************
函数功能:总初始化
输入参数:无
输出参数:无
备    注:无
************************/
void ALL_Config(void)
{
       
        USART1_Init(115200);
        Delay_Init(72);
        LED_Init();
        Adc_Init();
}

int main(void)
{       
        ALL_Config();
        while(1)
        {
               
                printf("PA1_IN1 = %d",Get_Adc1(1));
                printf("        PA2_IN2 = %d",Get_Adc1(2));
               
                delay_ms(50);
                printf("\r\n");
        }
}

#include "ADC.h"

//初始化ADC                                                                                                                          
voidAdc_Init(void)
{   
GPIO_InitTypeDefGPIO_InitStructure;
        ADC_InitTypeDef       ADC_InitStructure;
                               
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//使能GPIOA时钟
       
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC时钟

//先初始化ADC1通道1 IO口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//PA1 通道1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
       
//先初始化ADC1通道1 IO口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//PA2 通道2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
       
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);          //ADC1复位
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);        //复位结束       

       
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐       
ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;
ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化       

ADC_GetCalibrationFactor(ADC1);
       
        ADC_TempSensorCmd(ENABLE);       
       
ADC_Cmd(ADC1, ENABLE);//开启AD转换器       
       
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN ));
       
}       

u16 Get_Adc1(u8 ch)   
{
ADC_ChannelConfig(ADC1,1<<ch,ADC_SampleTime_239_5Cycles);
        ADC1->CHSELR = (u32)1<<ch;
       
        ADC_StopOfConversion(ADC1);//停止转换
        ADC_ClearFlag(ADC1, ADC_FLAG_EOC);//此处至关重要,一定要清除完成转换标志
       
        while (ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY) == RESET)
                ;
ADC_StartOfConversion(ADC1);       
       
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
       
        return ADC_GetConversionValue(ADC1);       
}


wenyangzeng 发表于 2019-3-21 10:01:53

不明白楼主为何在初始化完ADC后又来了这2句:
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);   
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);
貌似把初始化过程作废了。

dhhgvm 发表于 2019-3-21 12:53:25

wenyangzeng 发表于 2019-3-21 10:01
不明白楼主为何在初始化完ADC后又来了这2句:
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);   
R ...

据说时初始化ADC状态,我删掉这两句试试

dhhgvm 发表于 2019-3-21 17:51:36

wenyangzeng 发表于 2019-3-21 10:01
不明白楼主为何在初始化完ADC后又来了这2句:
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);   
R ...

这两句话没有产生任何影响

wenyangzeng 发表于 2019-3-21 17:54:18

dhhgvm 发表于 2019-3-21 17:51
这两句话没有产生任何影响

官方例程可以参考:

edmundlee 发表于 2019-3-21 19:36:07

我觉得楼主你先检查一下AVCC接没接到电源

dhhgvm 发表于 2019-3-22 12:11:38

edmundlee 发表于 2019-3-21 19:36
我觉得楼主你先检查一下AVCC接没接到电源

请问AVCC是什么?

edmundlee 发表于 2019-3-22 16:04:43

dhhgvm 发表于 2019-3-22 12:11
请问AVCC是什么?
写反了, 是VDDA

dhhgvm 发表于 2019-3-23 20:36:34

edmundlee 发表于 2019-3-22 16:04
写反了, 是VDDA

接了,但是没有什么效果

jensen169 发表于 2020-6-29 20:41:22

我测试了使用内部时钟就正常,不清楚原因,注释掉LED_Init();也正常
页: [1] 2
查看完整版本: STM32F030F4 adc采集出现神奇异常,求围观解决