20491|18

144

帖子

2

TA的资源

一粒金砂(高级)

楼主
 

STM32的ADC1和ADC2的采集问题 [复制链接]

试了一下STM32的ADC1和ADC2,调试时出现的问题让我不解:
(1)只使用STM32的ADC1采集信号,PA.0为其模拟输入通道;

将ADC1配置成独立模式、单通道单次转换、软件触发,

采集到的数据是正确的;

(2)只使用ADC2采集信号,与(1)中ADC1的设置完全相同,即

PA.0为其模拟输入通道;

将ADC2配置成横独立模式、单通道单次转换、软件触发,

却采集不到数据;

所以,想请教一个问题:

STM32的ADC2采集相较ADC1采集时,对ADC2的配置有什么特殊要求吗?

或者其ADC2只能在双AD模式中才能使用?




此帖出自stm32/stm8论坛

最新回复

uae
兄弟你可能永远也看不到了我也遇到了同样的问题,ADC1采集PA5正常,换成AD C2就不行了,能请教一下是咋解决的吗?  详情 回复 发表于 2021-9-6 21:35
点赞 关注
 

回复
举报

483

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
本帖最后由 yl20084784 于 2015-3-15 13:26 编辑

刚才,那个我没看仔细,你多半是,ADC2的RCC_APBXXXX这个函数里面没有对ADC2设置好

QQ图片20150315131210.png (67.16 KB, 下载次数: 2)

QQ图片20150315131210.png
此帖出自stm32/stm8论坛

点评

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2 , ENABLE ); 您具体指的是这个函数吗? ADC2是APB2总线上的外设,ADC2的时钟使能应该是没有问题的。  详情 回复 发表于 2015-3-15 14:06
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

板凳
 
yl20084784 发表于 2015-3-15 13:12
刚才,那个我没看仔细,你多半是,ADC2的RCC_APBXXXX这个函数里面没有对ADC2设置好
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2 , ENABLE );
您具体指的是这个函数吗?

ADC2是APB2总线上的外设,ADC2的时钟使能应该是没有问题的。






此帖出自stm32/stm8论坛

点评

void ADC2_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // Device header ADC_InitTypeDef ADC_InitStructure; //RCC_APB2PeriphClockCmd(RCC_AHBPer  详情 回复 发表于 2015-3-15 14:24
 
 

回复

483

帖子

0

TA的资源

纯净的硅(初级)

4
 
qiwan 发表于 2015-3-15 14:06
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2 , ENABLE );
您具体指的是这个函数吗?

ADC2是APB2总线上的外设,ADC2的时钟使能应该是没有问题的。



void ADC2_Init(void)

{



GPIO_InitTypeDef  GPIO_InitStructure;

               // Device header

ADC_InitTypeDef  ADC_InitStructure;





                //RCC_APB2PeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

                RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE);

                GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;        //PA0

                GPIO_InitStructure .GPIO_Mode=GPIO_Mode_AIN;//éèÖÃÎaÄ£Äaêäèë

                GPIO_Init(GPIOA,&GPIO_InitStructure);//PA02Îêy×°èëíê±Ï       

                RCC_ADCCLKConfig(RCC_PCLK2_Div6);//adcê±ÖóéèÖÃíê±Ï,ADC×î¸ß1¤×÷ÆμÂê14M£¬6·ÖÆμ¾íêÇ12M

       

                ADC_DeInit(ADC2);  //½«íaéè ADC2 μÄè«2¿¼Ä′æÆ÷ÖØéèÎaè±ê¡



                ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;

                ADC_InitStructure.ADC_ScanConvMode=DISABLE;//쥶à×a»»Ä£ê½

                ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//PA0á¬Dø×a»»

                ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//óò¶ÔÆë

                ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//èí¼t′¥·¢

                ADC_InitStructure.ADC_NbrOfChannel=1;        //í¬ê±×a»»í¨μàêyÎa1£¬èç1ûóD¶à¸öí¨μà½øDD×a»»£¬Ôù¶¨

                ADC_Init(ADC2,&ADC_InitStructure);//×°ÔØADC2Îêy

                                ADC_RegularChannelConfig(ADC2,ADC_Channel_0,1,ADC_SampleTime_41Cycles5);

                //adc2éóÃê±¼ät=2éÑùÖüÆú+12.5¸öÖüÆú



          ADC_Cmd(ADC2,ENABLE);

                ADC_ResetCalibration(ADC2);

                while(ADC_GetCalibrationStatus(ADC2));

                ADC_StartCalibration(ADC2);//D£×¼

                while(ADC_GetCalibrationStatus(ADC2));

                ADC_SoftwareStartConvCmd(ADC2,ENABLE);//Öƶ¨èí¼t′¥·¢×a»»

               

       

       

}

参考下这个
此帖出自stm32/stm8论坛

点评

很谢谢您的热心帮忙,其实我的程序就是您这样的。 奇了怪了  详情 回复 发表于 2015-3-15 15:01
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

5
 
ADC1采集建立project1,ADC2采集建立project2;
针对ADC1:

  1. //ADC1的模拟输入端PA.5
复制代码
针对ADC2:


  1. <font color="#0000ff">//ADC2的模拟输入端PA.5</font>
复制代码
针对ADC1:
  1. void  Adc_Init(void)
  2. {        
  3.         ADC_InitTypeDef ADC_InitStructure;
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE );
  5.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);                                       //72M/6=12,ADC最大时间不能超过14M
  6.        
  7.         ADC_DeInit(ADC1);
  8.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;           //独立模式
  9.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;                    //单通道
  10.     ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;         //单次转换
  11. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;       
  12.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;       
  13.         ADC_InitStructure.ADC_NbrOfChannel = 1;  
  14.         ADC_Init(ADC1, &ADC_InitStructure);          

  15.     ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_71Cycles5 );
  16.         ADC_Cmd(ADC1, ENABLE);

  17.         ADC_ResetCalibration(ADC1);
  18.         while(ADC_GetResetCalibrationStatus(ADC1));
  19.         ADC_StartCalibration(ADC1);
  20.         while(ADC_GetCalibrationStatus(ADC1));
  21. }
复制代码
针对ADC2:
  1. <font color="#0000ff">void  Adc_Init(void)
  2. {        
  3.         ADC_InitTypeDef ADC_InitStructure;
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2 , ENABLE );
  5.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);                                           //72M/6=12,ADC最大时间不能超过14M
  6.        
  7.         ADC_DeInit(ADC2);
  8.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;              //独立模式
  9.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;                       //单通道
  10.     ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;            //单次转换
  11.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None ;
  12.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;       
  13.         ADC_InitStructure.ADC_NbrOfChannel = 1;   
  14.         ADC_Init(ADC2, &ADC_InitStructure);         

  15.         ADC_RegularChannelConfig(ADC2, ADC_Channel_5, 1, ADC_SampleTime_71Cycles5 );
  16.         ADC_Cmd(ADC2, ENABLE);       

  17.         ADC_ResetCalibration(ADC2);
  18.         while(ADC_GetResetCalibrationStatus(ADC2));
  19.         ADC_StartCalibration(ADC2);
  20.         while(ADC_GetCalibrationStatus(ADC2));       
  21. }        </font>
复制代码
针对ADC1:

  1. int main(void)
  2. {
  3.            SystemInit();    //系统时钟初始化:72M
  4.         Gpio_Init();
  5.         Adc_Init();
  6.         while(1)
  7.         {
  8.          ADC_SoftwareStartConvCmd(ADC1, ENABLE );
  9.         }
复制代码

针对ADC2:


  1. <font color="#0000ff">int main(void)
  2. {
  3.            SystemInit();                  //系统时钟初始化
  4.         Gpio_Init();
  5.         Adc_Init();
  6.         while(1)
  7.         {
  8.                  ADC_SoftwareStartConvCmd(ADC2, ENABLE );
  9.         }</font>
复制代码

此帖出自stm32/stm8论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

6
 
yl20084784 发表于 2015-3-15 14:24
void ADC2_Init(void)

{



GPIO_InitTypeDef  GPIO_InitStructure;

               // Device header

ADC_InitTypeDef  ADC_InitStructure;





                //RCC_APB2PeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

                RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE);

                GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;        //PA0

                GPIO_InitStructure .GPIO_Mode=GPIO_Mode_AIN;//éèÖÃÎaÄ£Äaêäèë

                GPIO_Init(GPIOA,&GPIO_InitStructure);//PA02Îêy×°èëíê±Ï        

                RCC_ADCCLKConfig(RCC_PCLK2_Div6);//adcê±ÖóéèÖÃíê±Ï,ADC×î¸ß1¤×÷ÆμÂê14M£¬6·ÖÆμ¾íêÇ12M

        

                ADC_DeInit(ADC2);  //½«íaéè ADC2 μÄè«2¿¼Ä′æÆ÷ÖØéèÎaè±ê¡



                ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;

                ADC_InitStructure.ADC_ScanConvMode=DISABLE;//쥶à×a»»Ä£ê½

                ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//PA0á¬Dø×a»»

                ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//óò¶ÔÆë

                ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//èí¼t′¥·¢

                ADC_InitStructure.ADC_NbrOfChannel=1;        //í¬ê±×a»»í¨μàêyÎa1£¬èç1ûóD¶à¸öí¨μà½øDD×a»»£¬Ôù¶¨

                ADC_Init(ADC2,&ADC_InitStructure);//×°ÔØADC2Îêy

                                ADC_RegularChannelConfig(ADC2,ADC_Channel_0,1,ADC_SampleTime_41Cycles5);

                //adc2éóÃê±¼ät=2éÑùÖüÆú+12.5¸öÖüÆú



          ADC_Cmd(ADC2,ENABLE);

                ADC_ResetCalibration(ADC2);

                while(ADC_GetCalibrationStatus(ADC2));

                ADC_StartCalibration(ADC2);//D£×¼

                while(ADC_GetCalibrationStatus(ADC2));

                ADC_SoftwareStartConvCmd(ADC2,ENABLE);//Öƶ¨èí¼t′¥·¢×a»»

               

        

        

}

参考下这个

很谢谢您的热心帮忙,其实我的程序就是您这样的。
奇了怪了


此帖出自stm32/stm8论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

7
 

ADC1采集3.3V电压,DR的值是0xfff;

              3.3V/2时,DR的值是0x7fff;

                  0V时,DR的值是0x0000;

ADC2采不到数据。
STM32单片机使用的是STM32VET6,现在将程序呈上,
坛友要是有时间的或有兴趣一起讨论的话,麻烦也帮忙运行一下,看看结果到底是怎样的。

因为不论是多通道采集还是单通道采集,是软件触发或定时器中断触发,大家要么单独使用

ADC1,要么双ADC,很少会单独使用ADC2的。

我还是觉得ADC2不能单独使用,它好像只能配合ADC1使用,比如在双AD模式中。


此帖出自stm32/stm8论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

8
 
程序呈上:

单路ADC采集:ADC1.rar

4.38 MB, 下载次数: 207

单路ADC采集:ADC2.rar

4.38 MB, 下载次数: 175

此帖出自stm32/stm8论坛
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

9
 
每一个AD是一样的,注意时钟、管脚等的配置。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 
 

回复

55

帖子

0

TA的资源

一粒金砂(中级)

10
 
请问一下,ADC1采集3.3V电压,DR的值是0xfff,是如何读取ADC_DR??
又ACD2的DR,是如何读取?
此帖出自stm32/stm8论坛

点评

view->system viewer ->ADC1 ,然后弹出ADC各寄存器的状态  详情 回复 发表于 2015-3-17 11:22
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

11
 
sting_yang 发表于 2015-3-17 08:51
请问一下,ADC1采集3.3V电压,DR的值是0xfff,是如何读取ADC_DR??
又ACD2的DR,是如何读取?
view->system viewer ->ADC1 ,然后弹出ADC各寄存器的状态



1.PNG (65.34 KB, 下载次数: 0)

1.PNG

11.PNG (14.12 KB, 下载次数: 0)

11.PNG
此帖出自stm32/stm8论坛
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(中级)

12
 
可否试试ADC3?
此帖出自stm32/stm8论坛
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(中级)

13
 
使用f103c8,adc同你的配置,输入为PA0,adc转换值由uart1输入到pc,结果:adc1跟adc2都正常
此帖出自stm32/stm8论坛

点评

我也尝试着使用了f103c8,观察ADC的DR寄存器,结果还是:ADC1可行,ADC2不行; 真的搞不懂了  详情 回复 发表于 2015-3-18 11:35
为什么还是不行  详情 回复 发表于 2015-3-18 11:18
谢谢 不过我的还是不行,这次是真的奇怪了。 我换个系统板试试  详情 回复 发表于 2015-3-18 10:20
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

14
 
sting_yang 发表于 2015-3-18 00:02
使用f103c8,adc同你的配置,输入为PA0,adc转换值由uart1输入到pc,结果:adc1跟adc2都正常

谢谢    不过我的还是不行,这次是真的奇怪了。
我换个系统板试试


此帖出自stm32/stm8论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

15
 
sting_yang 发表于 2015-3-18 00:02
使用f103c8,adc同你的配置,输入为PA0,adc转换值由uart1输入到pc,结果:adc1跟adc2都正常
为什么还是不行



此帖出自stm32/stm8论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

16
 
sting_yang 发表于 2015-3-18 00:02
使用f103c8,adc同你的配置,输入为PA0,adc转换值由uart1输入到pc,结果:adc1跟adc2都正常
我也尝试着使用了f103c8,观察ADC的DR寄存器,结果还是:ADC1可行,ADC2不行;
真的搞不懂了



此帖出自stm32/stm8论坛
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(中级)

17
 
刚又试了一下,一样是F103C8,这次直接使用你的adc2,只是将mcu 主频改为4M,由USART1传送ADC2_DR给PC,输入一样改为PA0(ADC_Channel_0),其他都没变动,PC可以正确得到转换值
此帖出自stm32/stm8论坛

点评

恩 谢谢大家的帮忙 现在都好了 附件中的程序都是可行的  详情 回复 发表于 2015-3-19 16:55
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

18
 
sting_yang 发表于 2015-3-18 22:25
刚又试了一下,一样是F103C8,这次直接使用你的adc2,只是将mcu 主频改为4M,由USART1传送ADC2_DR给PC,输入一样改为PA0(ADC_Channel_0),其他都没变动,PC可以正确得到转换值
恩    谢谢大家的帮忙   现在都好了   附件中的程序都是可行的
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

19
 
qiwan 发表于 2015-3-19 16:55 恩 谢谢大家的帮忙 现在都好了 附件中的程序都是可行的

兄弟你可能永远也看不到了
我也遇到了同样的问题,ADC1采集PA5正常,换成AD C2就不行了,能请教一下是咋解决的吗?

此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表