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

STM32F429 ADC 结果超过4096

[复制链接]
bigvan2012 提问时间:2015-7-16 21:04 /
诸君:
       使用STM32F429,选择ADC1 PA0作为输入。
       所得结果都是大于4096,求解!
       另外,试了下将结果与0x0fff,屏蔽最高4位,得出了正确结果,这个是什么道理?
       程序都是按照 原子F407 的程序对照修改的。
收藏 评论17 发布时间:2015-7-16 21:04

举报

17个回答
bigvan2012 回答时间:2015-7-17 11:55:44
/**
  * @brief  ADC1 Init
  * @param  None
  * @retval None
  */
void stm32f4xx_ADC1_Init(void)
{
       
/*【Step 1:定义结构体】↓----------------------------------------------------*/        
        GPIO_InitTypeDef  GPIO_InitStructure;
        ADC_CommonInitTypeDef ADC_CommonInitStructure;
        ADC_InitTypeDef       ADC_InitStructure;
/*【Step 1:结束】↑---------------------------------------------------------*/
       
/*【Step 2:开启PA口时钟和ADC1时钟,设置PA0为模拟输入】↓----------------------*/
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化  
/*【Step 2:结束】↑---------------------------------------------------------*/
       
/*【Step 3:ADC1复位】↓-----------------------------------------------------*/
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);          
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);       
/*【Step 3:结束】↑---------------------------------------------------------*/

/*【Step 4:设置ADC的CCR,配置ADC输入时钟分频,模式为独立模式等】↓------------*/
        ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
        ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
        ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
        ADC_CommonInit(&ADC_CommonInitStructure);
/*【Step 4:结束】↑---------------------------------------------------------*/

/*【Step 5:初始化ADC1参数,设置分辨率,转换方式,对齐方式,规则序列】↓-------*/
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐       
  ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 也就是只转换规则序列1
  ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
/*【Step 5:结束】↑---------------------------------------------------------*/

/*【Step 6:开启AD转换器】↓-------------------------------------------------*/        
        ADC_Cmd(ADC1, ENABLE);
/*【Step 6:结束】↑---------------------------------------------------------*/

}

/**
  * @brief  获得ADC值
  * @param  ADC_Channel
  * @retval ADC一次转换结果数据
  */
uint16_t Get_ADC(uint8_t ADC_Channel)   
{

        ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_480Cycles);                             
        ADC_SoftwareStartConv(ADC1);                //使能指定的ADC1的软件转换启动功能                 
        while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC))//等待转换结束
        {
        }
                return ADC_GetConversionValue(ADC1);//返回最近一次ADC1规则组的转换结果
       
}

/**
  * @brief  获取通道ADC_Channel的转换值,取times次,然后平均
  * @param  ADC_Channel,times
  * @retval 平均值
  */
uint16_t Get_ADC_Average(uint8_t ADC_Channel,uint8_t times)
{
        uint32_t sum=0;
        uint8_t n;
        for(n=0;n<times;n++)
        {
                sum+=Get_ADC(ADC_Channel);
                Delay_ms(5);
        }
        return sum/times;
}
watershade 回答时间:2015-7-16 23:22:14
很可能你将ADC的输出值强制设置成int16或者其他无符号形了吧。或者你数据经过实木处理了。检查一下代码。如果你的信息输出连接的ADC输出没问题那就应该是代码数据格式的错误。不要怀疑429,它也是12bits的,但是你可以设置成10bits和8bits
taozi1112 回答时间:2019-8-27 16:34:09
问题解决了,ADC虽然设定的是右对齐,但是调试的时候发现ADC的CR2寄存器中数据对齐位还是1,也就是竟然是左对齐!!!!把转换的结果右移四位,接着按照4096计算就是正确的结果。但是为什么ADC初始化中数据右对齐设置不成功,还是没找到原因。。
yvonn 回答时间:2015-7-16 21:37:28
429没用过,但是407用了很多次,ADC没出现过这个问题。估计多数情况还是配置有问题,检查GPIO配置,ADC初始化,DMA初始化等。ADC参电压,输入电压。采集间隔等。
sacq12 回答时间:2015-7-16 21:38:34
只有12位是有效的,详细的可参看相应的文档
creep 回答时间:2015-7-16 22:09:47
难道输入0也得到结果大于4096?
在用429,ADC没发现你说的这个问题,方便的话可以把代码贴出看看!
stary666 回答时间:2015-7-17 09:37:31
没遇到过,,,,
JackieLaura 回答时间:2015-7-17 10:04:59
按照water兄的方法检查哈,应该能解决你的问题吧
废鱼 回答时间:2015-7-17 10:58:42
楼主把配置代码发一下。读取AD结果的代码也发一下。
bigvan2012 回答时间:2015-7-17 11:56:17
安 发表于 2015-7-17 10:58
楼主把配置代码发一下。读取AD结果的代码也发一下。

谢谢,程序贴在9楼。
bigvan2012 回答时间:2015-7-17 11:56:39
creep 发表于 2015-7-16 22:09
难道输入0也得到结果大于4096?
在用429,ADC没发现你说的这个问题,方便的话可以把代码贴出看看! ...

谢谢,程序贴在9楼。
废鱼 回答时间:2015-7-17 15:33:25
从手册看。楼主进入了Injected group模式。前面4位自动补齐了。
废鱼 回答时间:2015-7-17 15:37:49
楼主仿真一下,配置完ADC以后,ADC-CR1寄存器的值。
misteryrui 回答时间:2016-4-27 19:47:42
我也遇到这情况,stm32f429,adc配置的是12位,但是数据大于4096,接到3.3V上计算,值接近65535,也就是16位了。不知道怎么回事。然后过了一段时间,又回到12位了。。。很神奇
honorsix 回答时间:2018-8-24 11:34:57
楼主,你的ADC采集值大于4096是什么原因,解决了吗?
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版