新手求指导!我使用F407的ADC1对电位器采样,5K欧电位器两端分别连vcc3.3和GND,中间的连在PA0上,采集到的值只有0,1023,4095三个,电位器调到300欧以下的时候采样到的是1023偶尔会是0值,大于300欧采集到的值只有4095了,源程序没有使用DMA,用了systick做定时,每300毫秒开始一次转换,直接读取ADC寄存器的采样值,以下贴上源码,求帮助。PA0也没做任何复用。
MCU频率设置成168MHZ,首先 |
- RCC_HCLKConfig(RCC_HCLK_Div1);
- RCC_PCLK2Config(RCC_HCLK_Div2);
- RCC_PCLK1Config(RCC_HCLK_Div4);
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG | RCC_APB2Periph_ADC1, ENABLE);
复制代码- ADC_CommonInitTypeDef ADC_CommonInitStructure;
- ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
- ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div8;
- ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
- ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
- ADC_CommonInit(&ADC_CommonInitStructure);
复制代码 然后
- ADC_InitTypeDef ADC_InitStructure;
- ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
- ADC_InitStructure.ADC_ScanConvMode = DISABLE;
- ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//单次采用转换不使用连续
- ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
- ADC_InitStructure.ADC_NbrOfConversion = 1;
- ADC_Init(ADC1, &ADC_InitStructure);
- ADC_Cmd(ADC1, ENABLE);
复制代码 接着
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
复制代码 获取采样值
- uint16_t value = 0;
- ADC_RegularChannelConfig(ADC_DEVICE, ADC_Channel_0, 1, ADC_SampleTime_15Cycles);
-
- ADC_SoftwareStartConv(ADC1);
- while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ) != SET);
- value = ADC_GetConversionValue(ADC1);
- ADC_ClearFlag(ADC1, ADC_FLAG_EOC );
- return value;
复制代码 求大神指点错误!
|
这句好像错了,不知道编译有否提示错:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
应该是:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
评分
查看全部评分
这个两个是一样的,标准库文件是 #define GPIO_Mode_AIN GPIO_Mode_AN
评分
查看全部评分
搞硬件的新手不懂怎么量ADC引脚的电压,一支笔插电位器VCC点,另一只插电位器中点?
可以测GND和电位器中点的电压;最好是测量GND和ADC对应引脚之间的电压。
测量GND和ADC引脚电压没问题,扭动电位器,电压变化在0~3.3v内,同时调试发现0V时是1023,大于0V都是4095
评分
查看全部评分
照着ST标准库的例程和网上找到的例子写的,对比 几十遍了也找不到问题,调试一步一步状态査寄存器的值也都是对的
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
改成
ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_None;试试
评分
查看全部评分
再看看寄存器的值或者直接测量引脚电压吧
评分
查看全部评分