[STM32] STM32的ADC1和ADC2的采集问题

[复制链接]
7534|12
 楼主| Mobile1991 发表于 2015-3-15 10:39 | 显示全部楼层 |阅读模式
试了一下STM32的ADC1和ADC2,调试时出现的问题让我不解:
(1)只使用STM32的ADC1采集信号,PA.0为其模拟输入通道;

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

采集到的数据是正确的;

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

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

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

却采集不到数据;

所以,想请教一个问题:

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

或者其ADC2只能在双AD模式中才能使用?
yangwenguan 发表于 2015-3-15 13:55 | 显示全部楼层
adc2试试看PA.1
yangwenguan 发表于 2015-3-15 13:56 | 显示全部楼层
应该都可以用, 但是adc精度那就呵呵了
 楼主| Mobile1991 发表于 2015-3-15 14:18 | 显示全部楼层

您好,试了一下PA.5,结果仍然是ADC1可以采,ADC2采不到
 楼主| Mobile1991 发表于 2015-3-15 15:19 | 显示全部楼层
ADC1采集建立project1,ADC2采集建立project2针对ADC1:
               PA.5作为模拟输入端
  1. void Gpio_Init(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
  5.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  6.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
  7.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  8. }               
针对ADC2:
              同样:PA.5作为模拟输入端
  1. <font color="#0000ff">void Gpio_Init(void)
  2. {
  3.        
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
  6.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  7.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
  8.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  9.          
  10. }        </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();                  //系统时钟初始化
  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>
然后ADC1采集3.3V电压,此时DR为:0x0fff;
                       3.3/2时,         DR:0x07ff;
                             0时,         DR:0x0000.
但ADC2却采不到数据。
真的是奇了怪了
 楼主| Mobile1991 发表于 2015-3-15 15:55 | 显示全部楼层
大家平常使用的一般都是ADC1,不论是单通道或多通道、软件触发或定时器中断触发。
而ADC是很少被单独使用的。
现在将程序呈上,希望有兴趣讨论的坛友可以帮忙运行一下,看看到底怎样。
我现在觉得,ADC2不能像ADC1那样单独使用,好像只能配合ADC1使用,比如双AD模式。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
yangwenguan 发表于 2015-3-15 16:14 | 显示全部楼层
知道了, adc2时不要使用独占模式.
mmuuss586 发表于 2015-3-15 21:22 | 显示全部楼层
ADC2改用,中断采样试下;
什么型号的芯片啊
foxglove 发表于 2015-3-16 08:22 | 显示全部楼层
STM32F103VET6  ADC2不能工作在单独模式 关注
 楼主| Mobile1991 发表于 2015-3-19 16:59 | 显示全部楼层
foxglove 发表于 2015-3-16 08:22
STM32F103VET6  ADC2不能工作在单独模式 关注

抱歉  误导您了   ADC1和ADC2是一样的   都可以工作在独立模式
 楼主| Mobile1991 发表于 2015-3-19 17:00 | 显示全部楼层
yangwenguan 发表于 2015-3-15 16:14
知道了, adc2时不要使用独占模式.

很抱歉   有可能误导您了   ADC2可以工作在独立模式的  现在程序都是可行的
yangwenguan 发表于 2015-3-20 08:13 | 显示全部楼层
Mobile1991 发表于 2015-3-19 17:00
很抱歉   有可能误导您了   ADC2可以工作在独立模式的  现在程序都是可行的 ...

规格书说的很清楚, 虽然最大是三路, 但是只有一个adc模块, 所以...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

45

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部