单片机型号: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
- void Adc_Init(void)
- {
- GPIO_InitTypeDef GPIO_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);
- }
复制代码
|
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);
貌似把初始化过程作废了。
评分
查看全部评分
据说时初始化ADC状态,我删掉这两句试试
这两句话没有产生任何影响
官方例程可以参考:
评分
查看全部评分
请问AVCC是什么?
写反了, 是VDDA
接了,但是没有什么效果