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

双路ADC采样 一路数据正确另一路怎么不对啊

[复制链接]
spasma 提问时间:2014-7-16 15:17 /
源代码如下
 
 GPIO_InitTypeDef GPIOA_ADC01;
  DMA_InitTypeDef DMA_ADC01;
  ADC_InitTypeDef ADC_ADC01;
  //NVIC_InitTypeDef NVIC_DMA1 ;
 
     RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //72M/6=12,ADC最大时间不能超过14M
        /* Enable DMA clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);         
        /* Enable ADC1 and ADC2 and GPIOA          clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 |  RCC_APB2Periph_ADC2|RCC_APB2Periph_GPIOA, ENABLE);
 
 
 //初始化GPIO
  /* PA0,PA1*/
  GPIOA_ADC01.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  GPIOA_ADC01.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIOA_ADC01);       
  
  //初始化DMA
   DMA_DeInit(DMA1_Channel1);                 //设置的时候首先要 复位。 ADC1 采用DMA1, 通道1
  DMA_ADC01.DMA_PeripheralBaseAddr = ADC1_DR_Address;         //ADC外设地址+偏移
 
  DMA_ADC01.DMA_MemoryBaseAddr = (uint32_t)&ADC_BBiqValue; //内存地址          会变化
  DMA_ADC01.DMA_DIR = DMA_DIR_PeripheralSRC;                          //方向:外设是源,即从外设读
  DMA_ADC01.DMA_BufferSize = BBIQ_DATA_SIZE;                                                  //100个数
  DMA_ADC01.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   //外设增量模式
  DMA_ADC01.DMA_MemoryInc = DMA_MemoryInc_Enable;                 //内存增量模式         使能的
  DMA_ADC01.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word ;          // 32位
  DMA_ADC01.DMA_MemoryDataSize = DMA_MemoryDataSize_Word ;
  DMA_ADC01.DMA_Mode = DMA_Mode_Circular;                           //循环模式
  DMA_ADC01.DMA_Priority = DMA_Priority_High;                        //优先级
  DMA_ADC01.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_ADC01);
  
  DMA_ITConfig(DMA1_Channel1,DMA1_IT_TC1,ENABLE);        //使能传输完成中断
 
  /* Enable DMA channel1 */
  DMA_Cmd(DMA1_Channel1, ENABLE);
 
 //初始化ADC
     
  /* ADC1 configuration */
  ADC_DeInit(ADC1);                           //复位ADC1
  ADC_ADC01.ADC_Mode = ADC_Mode_RegSimult;         //同步规则模式
  ADC_ADC01.ADC_ScanConvMode = ENABLE;                 //         支持扫描
  ADC_ADC01.ADC_ContinuousConvMode = ENABLE;          //   连续采样
  ADC_ADC01.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;          //        不支持触发
  ADC_ADC01.ADC_DataAlign = ADC_DataAlign_Right;           //          右对齐
  ADC_ADC01.ADC_NbrOfChannel = 1;                   //
  ADC_Init(ADC1, &ADC_ADC01);
 
  /* ADC2 configuration */
   ADC_DeInit(ADC2);                           //复位ADC2
  ADC_ADC01.ADC_Mode = ADC_Mode_RegSimult;         //同步规则模式
  ADC_ADC01.ADC_ScanConvMode = ENABLE;                 //         支持扫描
  ADC_ADC01.ADC_ContinuousConvMode = ENABLE;          //   连续采样
  ADC_ADC01.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;          //        不支持触发
  ADC_ADC01.ADC_DataAlign = ADC_DataAlign_Right;           //          右对齐
  ADC_ADC01.ADC_NbrOfChannel = 1;                   //
  ADC_Init(ADC1, &ADC_ADC01);
 
  /* ADC1 regular channe0和1 configuration */ 
  //一条命令只能设置一个ADC的某个channel 在序列中的位置和时钟
  /*
  采样时钟为12MHz, 
  分频比 可以为   1,   7,      13,        28,   41,        55,     71,   239
  对应采样时钟为 8MHz, 1.6MHz, 0.89MHz, 420kHz,        290kHz,         216kHz, 168kHz, 50kHz
 
  ADC0 对应IQB,                ADC1 对应IQA
  不要在2个ADC上转换相同的通道?
  */
 
  ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);
  ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5); 
  
 
  ADC_DMACmd(ADC1, ENABLE);           /* Enable ADC1 DMA */  
  ADC_Cmd(ADC1, ENABLE);     /* Enable ADC1 */
  ADC_ResetCalibration(ADC1);           /* Enable ADC1 reset calibaration register */ 
  while(ADC_GetResetCalibrationStatus(ADC1));           /* Check the end of ADC1 reset calibration register */  
  ADC_StartCalibration(ADC1);           /* Start ADC1 calibaration */   
  while(ADC_GetCalibrationStatus(ADC1));          /* Check the end of ADC1 calibration */
  
  
  /* Enable ADC2 external trigger conversion */
  ADC_ExternalTrigConvCmd(ADC2, ENABLE);  //ADC2是由ADC1触发的,需要支持外部触发
  ADC_Cmd(ADC2, ENABLE);     /* Enable ADC2 */
  ADC_ResetCalibration(ADC2);           /* Enable ADC1 reset calibaration register */ 
  while(ADC_GetResetCalibrationStatus(ADC2));           /* Check the end of ADC1 reset calibration register */  
  ADC_StartCalibration(ADC2);           /* Start ADC1 calibaration */   
  while(ADC_GetCalibrationStatus(ADC2));          /* Check the end of ADC1 calibration */
 
数据用串口打印出来,第一路正常;第二路不变。 (应该和第一路差不多是变化的)。   每次测试第二路值都不一样。 这次是1558, 下次可能是就是1660了。似乎第二路只采了一个值,没有采样
       1753        1558
        1550        1558
        1591        1558
        1668        1558
        1709        1558
        1781        1558
        1823        1558
        1795        1558
        1789        1558
        1736        1558
        1661        1558
        1641        1558
        1605        1558
        1604        1558
        1665        1558
        1695        1558
        1753        1558

     
收藏 评论5 发布时间:2014-7-16 15:17

举报

5个回答
spasma 回答时间:2014-7-16 15:20:17

回复:双路ADC采样 一路数据正确另一路怎么不对啊

中断函数源代码
void DMA1_Channel1_IRQHandler(void)
{
extern __IO uint8_t State_Adc1_TC;
if (DMA_GetITStatus(DMA1_IT_TC1) != RESET)
         {
        State_Adc1_TC=1;                  
        ADC1->CR2&=~(1
巅峰残狼 回答时间:2014-7-16 20:17:55

RE:双路ADC采样 一路数据正确另一路怎么不对啊

可能原因:1.采集的电压值已经超过了可以采集的最大电压值(3.3V)
2.对应1558数字量转化为模拟电压正好在1.25V左右,这是个巧合吗?这是AD的基准吧还是什么啊?
spasma 回答时间:2014-7-16 20:21:40

回复:双路ADC采样 一路数据正确另一路怎么不对啊

串口输出的已经是实际电压了。即*3300/4096。单位为mV
程序设计连续同步采样二路信号电压, 从数据看 第一次都对了。  但第二次以及以后的。 第一路信号是对的(在变化),第二路信号值维持不变(不正确)
spasma 回答时间:2014-7-17 10:45:28

回复:双路ADC采样 一路数据正确另一路怎么不对啊

弄好了。 程序有个bug
初始化ADC2的时候 初始化ADC1了。
ADC_Init(ADC1, &ADC_ADC01);
相思谷 回答时间:2014-7-17 12:16:53

RE:双路ADC采样 一路数据正确另一路怎么不对啊

恭喜恭喜

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版