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

查看: 10050|回复: 2

双ADC同步转换问题,请教

[复制链接]

1

主题

0

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2009-11-24 15:59:15 | 显示全部楼层 |阅读模式
最近在做双ADC采样时出现了一个问题。请教大家。
 
当将ADC1、ADC2都设置为独立模式时,可以各自独立工作。
当将ADC1、ADC2设置为同步模式,只有ADC1的数据,没有ADC2的数据,也就是说,ADC2没有工作。
 
资料上写ADC1 DUALMODE设置成同步模式后,ADC1启动的同时,ADC2同时启动,对不同通道进行采样,
ADC1、ADC2都完成采样后,EOC置位,数据寄存器DR 高半字是ADC2结果,低半字是ADC1结果。
 
我希望完成以下功能:
ADC1与ADC2在同一时刻采样,同时捕获两个输入端电平变化。
 
初始化部分:
  ADC_InitTypeDef   ADC_InitStructure; 
  ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;       //连续转换模式 
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; 
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   //数据右对齐 
  ADC_InitStructure.ADC_NbrOfChannel = 1;                  //1通道为A/D转换 
  ADC_Init(ADC1, &ADC_InitStructure);
  ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;                     
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;       //连续转换模式 
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; 
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   //数据右对齐 
  ADC_InitStructure.ADC_NbrOfChannel = 1;                  //1通道为A/D转换 
  ADC_Init(ADC2, &ADC_InitStructure); 
  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_1Cycles5); 
  ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 1, ADC_SampleTime_1Cycles5); 
  ADC_ExternalTrigConvCmd(ADC2, ENABLE);
  /* Enable ADC1 DMA */  
  ADC_DMACmd(ADC1, ENABLE); 
   
  /* Enable ADC1 */ 
  ADC_Cmd(ADC1, ENABLE); 
  /* Enable ADC1 reset calibaration register */    
  ADC_ResetCalibration(ADC1); 
  /* Check the end of ADC1 reset calibration register */ 
  while(ADC_GetResetCalibrationStatus(ADC1)); 
  /* Start ADC1 calibaration */ 
  ADC_StartCalibration(ADC1); 
  /* Check the end of ADC1 calibration */ 
  while(ADC_GetCalibrationStatus(ADC1)); 
      
  /* Start ADC1 Software Conversion */  
  ADC_SoftwareStartConvCmd(ADC1, ENABLE); 
 
  /* Enable ADC1 */ 
  ADC_Cmd(ADC2, ENABLE); 
  /* Enable ADC1 reset calibaration register */    
  ADC_ResetCalibration(ADC2); 
  /* Check the end of ADC1 reset calibration register */ 
  while(ADC_GetResetCalibrationStatus(ADC2)); 
  /* Start ADC1 calibaration */ 
  ADC_StartCalibration(ADC2); 
  /* Check the end of ADC1 calibration */ 
  while(ADC_GetCalibrationStatus(ADC2)); 
      
  ADC_SoftwareStartConvCmd(ADC2, ENABLE); 
 
===============================================
采集函数部分:
         ADC1->CR2 |= 0x01;  
         while((ADC1->SR&0x02)!=0x02);
         udr = ADC1->DR;
 
希望 udr 低半字是ADC1结果,高半字是ADC2结果。
上面代码哪里有问题?多谢了
 
<
回复

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2009-11-25 10:31:25 | 显示全部楼层

回复:双ADC同步转换问题,请教

此模式在规则通道组上执行。外部触发源来自ADC1的规则组多路器(由ADC1_CR2寄存器的EXTSEL[2:0]选择)。给ADC2提供同步触发。
注意: 不要在2个ADC上转换相同的通道(如果转换两个ADC的相同通道,不可能提供重叠的采样时间)。
在ADC1或ADC2的转换结束时:
●产生一个32位DMA传输请求(如果设置了DMA位),传输到SRAM的32位ADC1_DR寄存器的上半个字包含ADC2的转换数据,低半个字包含ADC1的转换数据。
●当所有ADC1/ADC2规则通道都被转换完时,产生EOC中断(如果任一ADC接口开放了中断的话)。
注: 在同步规则模式中,必须转换具有相同长度的序列,或保证触发的间隔比2个序列中较长的序列长,否则当较长序列的转换还未完成时,具有较短序列的ADC转换会被重启。
我认为你是不是没有设置DMA的问题。还有就是ADC通道开启时候,你可以看一下下面的例程
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
vu32 ADC_DualConvertedValueTab[16];
/* DMA channel1 configuration ----------------------------------------------*/
  DMA_DeInit(DMA_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)ADC1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_DualConvertedValueTab;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 16;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA_Channel1, &amp;DMA_InitStructure);
  /* Enable DMA Channel1 */
  DMA_Cmd(DMA_Channel1, ENABLE);
  /* ADC1 configuration ------------------------------------------------------*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 2;
  ADC_Init(ADC1, &amp;ADC_InitStructure);
  /* ADC1 regular channels configuration */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_239Cycles5);   
  ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 2, ADC_SampleTime_239Cycles5);
  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);
  /* ADC2 configuration ------------------------------------------------------*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 2;
  ADC_Init(ADC2, &amp;ADC_InitStructure);
  /* ADC2 regular channels configuration */
  ADC_RegularChannelConfig(ADC2, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5);
  ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 2, ADC_SampleTime_239Cycles5);
  /* Enable ADC2 external trigger conversion */
  ADC_ExternalTrigConvCmd(ADC2, ENABLE);
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);
  /* Enable Vrefint channel17 */
  ADC_TempSensorVrefintCmd(ENABLE);
  /* Enable ADC1 reset calibaration register */  
  ADC_ResetCalibration(ADC1);
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));
  /* Start ADC1 calibaration */
  ADC_StartCalibration(ADC1);
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));
  /* Enable ADC2 */
  ADC_Cmd(ADC2, ENABLE);
  /* Enable ADC2 reset calibaration register */  
  ADC_ResetCalibration(ADC2);
  /* Check the end of ADC2 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC2));
  /* Start ADC2 calibaration */
  ADC_StartCalibration(ADC2);
  /* Check the end of ADC2 calibration */
  while(ADC_GetCalibrationStatus(ADC2));
  /* Start ADC1 Software Conversion */
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  /* Test on Channel 1 DMA_FLAG_TC flag */
  while(!DMA_GetFlagStatus(DMA_FLAG_TC1));
  /* Clear Channel 1 DMA_FLAG_TC flag */
  DMA_ClearFlag(DMA_FLAG_TC1);
回复 支持 反对

使用道具 举报

0

主题

23

回帖

0

蝴蝶豆

初级会员

最后登录
2018-10-18
发表于 2011-12-22 14:13:08 | 显示全部楼层

RE:双ADC同步转换问题,请教

管理员正解!mark
回复 支持 反对

使用道具 举报

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