芯片型号:STM32F071CBU6
问题:
使用PA7,PB0(ADC_IN7, ADC_IN8)作为 ADC的输入引脚,检测电压。但获取的ADC值一直都是4095,仿真跟踪ADCx->DR值一直为
0x00000FFF
使用过hal 库,DMA 方式。标准库。并且使用 众拳f0教程里的 《09. 电位器ADC模拟量输入》源码(修改ADC 输入IO) 结果都一样。值都是4095. 硬件也检查过VDDA的电压也是3.295V ,VSSA 接地良好。也将ADC引脚换PA0,PA1,结果也是一直为4095。这个问题困扰了好久了,各位帮忙指点一下。
谢谢了!
硬件电路图如下:
代码如下:
/********************************* adc.c ******************************************/
void DWQ_ADC_GPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //声明结构变量
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //定义PB0,ADC_IN8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //IO口为模拟输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //AD口设置为浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void DWQ_ADC_Config(void)
{
ADC_InitTypeDef ADC_InitStuctrue; //声明ADC结构变量
RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4) ; //时钟分频48M/4=12M 最大时钟不超过14M
ADC_DeInit(ADC1); //ADC复位
ADC_DMACmd(ADC1, DISABLE); //禁止DMA
ADC_StructInit(&ADC_InitStuctrue); //根据ADC_InitStuctrue中指定参数初始化ADC1的寄存器
ADC_InitStuctrue.ADC_Resolution=ADC_Resolution_12b; //采集设为12位精度即4095
// ADC_InitStuctrue.ADC_ContinuousConvMode=DISABLE; //禁止持续ADC,设为单次ADC采集
ADC_InitStuctrue.ADC_ContinuousConvMode = ENABLE; //持续ADC采集
ADC_InitStuctrue.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None; //不用外部触发,软件触发转换
ADC_InitStuctrue.ADC_DataAlign=ADC_DataAlign_Right; //数据右对齐
ADC_InitStuctrue.ADC_ScanDirection=ADC_ScanDirection_Backward; //数据覆盖/浏览方向
ADC_Init(ADC1,&ADC_InitStuctrue); //按以上参数设置ADC1
ADC_ChannelConfig(ADC1,ADC_Channel_8,ADC_SampleTime_239_5Cycles); //配置ADC1通道1即PA1,/采样周期239.5个周期
ADC_GetCalibrationFactor(ADC1); //校准ADC1
ADC_Cmd(ADC1,ENABLE); //使能ADC1
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_ADEN)==RESET); //等待ADC准备
ADC_StartOfConversion(ADC1); //软件启动ADC转换
}
void DWQ_ADC_Demo(void)
{
uint32_t ad=0;
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
ad=ADC_GetConversionValue(ADC1);
printf("adc_val = %d\r\n",ad);
}
/********************* main.c ****************************************************/
void RCC_Configuration(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}
void BSP_Configuration(void)
{
RCC_Configuration();
RS232_GPIO();
RS232_Configuration();
DWQ_ADC_GPIO();
DWQ_ADC_Config();
}
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// rs232
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
int main(void)
{
BSP_Configuration();
NVIC_Configuration();
printf("init done!\r\n");
while(1)
{
DWQ_ADC_Demo();
delay_ms(1000);
}
}