你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

新人求助!stm32f407的ADC采样值总是固定值

[复制链接]
xcasdvdasvsaeva 提问时间:2018-6-27 17:17 /


新手求指导!我使用F407的ADC1对电位器采样,5K欧电位器两端分别连vcc3.3和GND,中间的连在PA0上,采集到的值只有0,1023,4095三个,电位器调到300欧以下的时候采样到的是1023偶尔会是0值,大于300欧采集到的值只有4095了,源程序没有使用DMA,用了systick做定时,每300毫秒开始一次转换,直接读取ADC寄存器的采样值,以下贴上源码,求帮助。PA0也没做任何复用。
MCU频率设置成168MHZ,首先
  1. RCC_HCLKConfig(RCC_HCLK_Div1);
  2. RCC_PCLK2Config(RCC_HCLK_Div2);
  3. RCC_PCLK1Config(RCC_HCLK_Div4);
  4. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG | RCC_APB2Periph_ADC1, ENABLE);
复制代码
  1.         ADC_CommonInitTypeDef ADC_CommonInitStructure;
  2.         ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  3.   ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div8;
  4.   ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  5.   ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  6.   ADC_CommonInit(&ADC_CommonInitStructure);
复制代码
然后
  1. ADC_InitTypeDef ADC_InitStructure;

  2.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  3.   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  4.   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//单次采用转换不使用连续
  5.   ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  6.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  7.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  8.   ADC_InitStructure.ADC_NbrOfConversion = 1;
  9.   ADC_Init(ADC1, &ADC_InitStructure);
  10.         ADC_Cmd(ADC1, ENABLE);
复制代码
接着
  1. GPIO_InitTypeDef GPIO_InitStructure;
  2. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  3. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  4.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
  5.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  6.   GPIO_Init(GPIOA, &GPIO_InitStructure);
复制代码
获取采样值
  1.         uint16_t value = 0;
  2.         ADC_RegularChannelConfig(ADC_DEVICE, ADC_Channel_0, 1, ADC_SampleTime_15Cycles);
  3.         
  4.         ADC_SoftwareStartConv(ADC1);
  5.         while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ) != SET);
  6.         value = ADC_GetConversionValue(ADC1);
  7.         ADC_ClearFlag(ADC1, ADC_FLAG_EOC );
  8.         return value;
复制代码
求大神指点错误!
<
收藏 评论11 发布时间:2018-6-27 17:17

举报

11个回答
wenyangzeng 回答时间:2018-6-27 21:41:34
本帖最后由 wenyangzeng 于 2018-6-27 21:42 编辑

这句好像错了,不知道编译有否提示错:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;

应该是:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

xcasdvdasvsaeva 回答时间:2018-6-28 16:54:32
wenyangzeng 发表于 2018-6-27 21:41
这句好像错了,不知道编译有否提示错:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;

这个两个是一样的,标准库文件是 #define GPIO_Mode_AIN           GPIO_Mode_AN
xcasdvdasvsaeva 回答时间:2018-6-30 11:22:17
难道就没一个人知道么
子曰好人 回答时间:2018-6-30 16:12:33
既然发现采样出来的值不对,就用万用表测量一下ADC引脚上的电压嘛,首先保证硬件上没有问题,再从软件上去找问题,问题总是会一个一个解决的

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

xcasdvdasvsaeva 回答时间:2018-7-3 09:17:00
子曰好人 发表于 2018-6-30 16:12
既然发现采样出来的值不对,就用万用表测量一下ADC引脚上的电压嘛,首先保证硬件上没有问题,再从软件上去 ...

搞硬件的新手不懂怎么量ADC引脚的电压,一支笔插电位器VCC点,另一只插电位器中点?
子曰好人 回答时间:2018-7-3 09:53:35
xcasdvdasvsaeva 发表于 2018-7-3 09:17
搞硬件的新手不懂怎么量ADC引脚的电压,一支笔插电位器VCC点,另一只插电位器中点? ...

可以测GND和电位器中点的电压;最好是测量GND和ADC对应引脚之间的电压。
xcasdvdasvsaeva 回答时间:2018-7-6 16:27:49
子曰好人 发表于 2018-7-3 09:53
可以测GND和电位器中点的电压;最好是测量GND和ADC对应引脚之间的电压。

测量GND和ADC引脚电压没问题,扭动电位器,电压变化在0~3.3v内,同时调试发现0V时是1023,大于0V都是4095
幸福好嘞 回答时间:2018-7-7 13:32:42
你既然是新手的话,应该用的是开发板咯,用例程测试,如果例程没问题,那就专心找你的程序问题咯

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

xcasdvdasvsaeva 回答时间:2018-7-7 14:07:28
幸福好嘞 发表于 2018-7-7 13:32
你既然是新手的话,应该用的是开发板咯,用例程测试,如果例程没问题,那就专心找你的程序问题咯 ...

照着ST标准库的例程和网上找到的例子写的,对比 几十遍了也找不到问题,调试一步一步状态査寄存器的值也都是对的
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版