13284|4

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32F030的ADC严重问题 [复制链接]

在使用STM32F030K6T6时,现在只使用了ADC0ADC1PA0PA1两个引脚),发现只要置位具有ADC功能的其他IO口中的任意一个(设置为推挽输出),正在采样的ADC引脚(PA0PA1)就会被附加上一个26K左右的方波信号,幅值大概在2~3V
将选中的ADC引脚(PA0PA1引脚)悬空,这个现象照样存在。ADC,DMA的代码使用DISCOVERY的例程,初始化如下:
void ADC_CH_DMA_Config(void)
{
  ADC_InitTypeDef     ADC_InitStructure;
  DMA_InitTypeDef     DMA_InitStructure;
  GPIO_InitTypeDef    GPIO_InitStructure;
  /* ADC1 DeInit */  
  ADC_DeInit(ADC1);
  
  /* ADC1 Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  /* DMA1 clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
  
         GPIO_InitStructure.GPIO_Pin   =  GPIO_Pin_0 | GPIO_Pin_1 ;
  GPIO_InitStructure.GPIO_Mode  =  GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
  //GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA,  &GPIO_InitStructure);
         
         GPIO_InitStructure.GPIO_Pin   =  GPIO_Pin_2 | GPIO_Pin_3 ;
  GPIO_InitStructure.GPIO_Mode  =  GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType =  GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_2MHz;
  //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA,  &GPIO_InitStructure);
         
         
  /* DMA1 Channel1 Config */
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RegularConvData_Tab;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 2;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  
  /* DMA1 Channel1 enable */
  DMA_Cmd(DMA1_Channel1, ENABLE);
  
  /* ADC DMA request in circular mode */
  ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
  
  /* Enable ADC_DMA */
  ADC_DMACmd(ADC1, ENABLE);  
  /* Initialize ADC structure */
  ADC_StructInit(&ADC_InitStructure);
  
  /* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits  */
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;
  ADC_Init(ADC1, &ADC_InitStructure);
  /* Convert the ADC1 temperature sensor  with 55.5 Cycles as sampling time */
  ADC_ChannelConfig(ADC1, ADC_Channel_0 , ADC_SampleTime_55_5Cycles);  
  ADC_TempSensorCmd(ENABLE);
  
  /* Convert the ADC1 Vref  with 55.5 Cycles as sampling time */
  ADC_ChannelConfig(ADC1, ADC_Channel_0 , ADC_SampleTime_55_5Cycles);
  ADC_VrefintCmd(ENABLE);
  
  /* ADC Calibration */
  ADC_GetCalibrationFactor(ADC1);
  
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);     
  
  /* Wait the ADRDY falg */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));
  
  /* ADC1 regular Software Start Conv */
  ADC_StartOfConversion(ADC1);
}
我只要将PA2,或者PA3在初始化时做如下置位:
  ADC_CH_DMA_Config();
  GPIO_SetBits(GPIOA, GPIO_Pin_3);
PA0PA1引脚上就会出现方波信号。
此帖出自stm32/stm8论坛

最新回复

从“STM32F030F4P6多通道ADC DMA采样数值为4095问题总结”(https://bbs.eeworld.com.cn/thread-1108176-1-1.html)过来的,遇到了类似的问题。   以下是解决过程,希望帮助遇到类似问题的小伙伴:   感谢博主分享经验,最近在使用32的ad也遇到了这样的问题,首先是在stm32f103c8t6上进行测试,没有问题,adc可以正常读取,然后把代码移植到stm32f103zet6,程序就出现了类似的问题,要么是0,要么是4095,悬空时值是随机的,一旦想要去读取需要的电压时就出现问题,一度怀疑人生,后来查看了博主上边给的链接(原文连接 https://bbs.eeworld.com.cn/thread-464556-1-1.html ),里边的条评论是“问题解决了 硬件设计时在VDDA引脚上的供电与VDDC不一致 VDDC用的是3.3V VDDA用的是2.5V  导致内部的模拟电路不稳定 将VDDA换成3.3V就OK了”,仔细看了看两颗芯片的引脚,发现确实在ad的参考电平上有些不同,随后又查看这些个引脚的用法(参考1:https://blog.csdn.net/m0_38106923/article/details/103488569  参考2:https://blog.csdn.net/guoguo123a/article/details/121997746),于是做出了一个违背祖宗的决定,将zet6板子上的verf+与板子上的vcc3.3短接,ad采集正确!!!(稍有些噪声,估计是vcc3.3电平不稳,参考野火的原理图,VDDA与verf+短接,而VDDA是由vcc3.3经过磁珠以及一些电容滤波后得到的)     详情 回复 发表于 2023-12-15 22:53
点赞 关注
 

回复
举报

16

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
好东西就应该与大家分享,共同进步共同提高,独乐不如众乐乐,接收新知识,学习新技术。
此帖出自stm32/stm8论坛
 
 

回复

1

帖子

1

TA的资源

一粒金砂(初级)

板凳
 
楼主解决了吗,我也碰到这个问题了
此帖出自stm32/stm8论坛
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 
千杯叹 发表于 2015-8-4 20:54
楼主解决了吗,我也碰到这个问题了

问题解决了 硬件设计时在VDDA引脚上的供电与VDDC不一致 VDDC用的是3.3V VDDA用的是2.5V  导致内部的模拟电路不稳定 将VDDA换成3.3V就OK了
此帖出自stm32/stm8论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

5
 

从“STM32F030F4P6多通道ADC DMA采样数值为4095问题总结”(https://bbs.eeworld.com.cn/thread-1108176-1-1.html)过来的,遇到了类似的问题。

 

以下是解决过程,希望帮助遇到类似问题的小伙伴:

 

感谢博主分享经验,最近在使用32的ad也遇到了这样的问题,首先是在stm32f103c8t6上进行测试,没有问题,adc可以正常读取,然后把代码移植到stm32f103zet6,程序就出现了类似的问题,要么是0,要么是4095,悬空时值是随机的,一旦想要去读取需要的电压时就出现问题,一度怀疑人生,后来查看了博主上边给的链接(原文连接 https://bbs.eeworld.com.cn/thread-464556-1-1.html ),里边的条评论是“问题解决了 硬件设计时在VDDA引脚上的供电与VDDC不一致 VDDC用的是3.3V VDDA用的是2.5V  导致内部的模拟电路不稳定 将VDDA换成3.3V就OK了”,仔细看了看两颗芯片的引脚,发现确实在ad的参考电平上有些不同,随后又查看这些个引脚的用法(参考1:https://blog.csdn.net/m0_38106923/article/details/103488569  参考2:https://blog.csdn.net/guoguo123a/article/details/121997746),于是做出了一个违背祖宗的决定,将zet6板子上的verf+与板子上的vcc3.3短接,ad采集正确!!!(稍有些噪声,估计是vcc3.3电平不稳,参考野火的原理图,VDDA与verf+短接,而VDDA是由vcc3.3经过磁珠以及一些电容滤波后得到的)

 

此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表