STM32
直播中

贺楠

8年用户 1026经验值
私信 关注
[问答]

STM32f103zet6 ADC测量范围不对是怎么回事?

使用ADC1 通道11的测量0-3.3v 当输入电压到70mv时测量到的电压显示3.3V

请问这个是配置问题还是什么问题?


源码:
#include "ADC.h"
ADC_InitTypeDef  ADC_InitStructure;
void ADCInit(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
        GPIO_InitStructure.GPIO_Pin  =GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AIN;
//        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOAtiNG;
        GPIO_Init(GPIOC, GPIO_InitStructure);
}

void ADC_ChannelConfig(void)
{
        ADC_InitStructure.ADC_Mode= ADC_Mode_Independent;  
        ADC_InitStructure.ADC_ScanConvMode=DISABLE;     
        ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;   
        ADC_InitStructure.ADC_ExternalTrigConv= ADC_ExternalTrigConv_None;
        ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;  
        ADC_InitStructure.ADC_NbrOfChannel=1;
        ADC_Init(ADC1, ADC_InitStructure);
        ADC_RegularChannelConfig(ADC1,ADC_Channel_11, 1,ADC_SampleTime_1Cycles5);
        ADC_Cmd(ADC1,ENABLE);         
        ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}

u16 READAdc(void)
{
        u16 adc;
        while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET);
        adc=ADC_GetConversionValue(ADC1);
        return adc;
}



回帖(1)

王璐

2024-5-16 17:47:08


1. ADC通道配置:确保您已经正确配置了ADC通道11。在STM32F103ZET6中,通道11对应于PC.0引脚。

```c
ADC_InitStructure.ADC_Channel = ADC_Channel_11;
```

2. ADC分辨率:STM32F103ZET6的ADC分辨率为12位,最大值为0xFFF(即4095)。这意味着输入电压范围为0-3.3V,对应的数字值为0-4095。请确保您在计算实际电压时使用了正确的分辨率。

3. ADC时钟配置:确保您已经正确配置了ADC的时钟。在STM32F103ZET6中,ADC时钟应为PCLK2的1/6。

```c
RCC_ADCCLKConfig(RCC_ADCCLK_PCLK2_Div6);
```

4. ADC采样时间和扫描模式:根据您的应用需求,您可能需要调整ADC的采样时间和扫描模式。采样时间越长,测量结果越精确,但会降低ADC的转换速度。

```c
ADC_InitStructure.ADC_SampleTime = ADC_SampleTime_3Cycles;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
```

5. 校准:在开始测量之前,您可能需要对ADC进行校准。这可以通过调用`ADC_Cmd(ENABLE)`和`ADC_ResetCalibration(ENABLE)`函数来实现。

```c
ADC_Cmd(ADC1, ENABLE);
while (ADC_GetResetCalibrationStatus(ADC1) != RESET);
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1) != RESET);
```

6. 检查输入电压:确保您的输入电压确实为70mV。使用一个外部参考或示波器来验证输入电压。

7. 检查硬件连接:确保您的STM32开发板的PC.0引脚与输入电压正确连接。

如果在检查了以上所有方面之后,问题仍然存在,请尝试使用STM32CubeMX工具生成ADC初始化代码,以确保所有配置都是正确的。此外,您还可以查阅STM32F103ZET6的数据手册,以获取有关ADC配置的更多详细信息。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分