打印

版主看看,是不是stm32的adc有问题

[复制链接]
3834|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fubin|  楼主 | 2008-7-24 12:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是stm32fvbt6 72M 我发现ADC有问题,我用的是ADC1和ADC2同时转换,同步规则模式,
ADC0接ADC_Channel_0,ADC_Channel_0通过5.1k电阻连gnd
ADC1接ADC_Channel_,ADC_Channel_通过5.1k电阻连到3.3v
下面是我用不同的采样时间得到的结果
ADC_SampleTime_1Cycles5:ADC0(269-272),ADC1(3530-3532)    
ADC_SampleTime_7Cycles5:ADC0(57-63),ADC1(3970-3976)
ADC_SampleTime_13Cycles5:ADC0(10-17),ADC1(4060-4067)
ADC_SampleTime_28Cycles5:ADC0(0-4),ADC1(4090-4095)
ADC_SampleTime_41Cycles5:ADC0(0-1),ADC1(4091-4095)
ADC_SampleTime_55Cycles5:ADC0(0-1),ADC1(4093-4095)
ADC_SampleTime_71Cycles5:ADC0(0-1),ADC1(4092-4095)
ADC_SampleTime_239Cycles5:ADC0(0-3),ADC1(4090-4095)
虽然数据可能有些误差,但是还是可以说明问题,采样时间短时不能得到正确
的结果,我选这个芯片主要是用比较高速ADC,麻烦版主看看。
沙发
fubin|  楼主 | 2008-7-24 12:59 | 只看该作者

adc部分设置

      DMA_DeInit(DMA_Channel1);
      DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)ADC1_DR_Address;
      DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DualConvertedValue.ADC_DualConvertedValueTab;
      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
      DMA_InitStructure.DMA_BufferSize = 1;
      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, &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 = DISABLE;
      ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
      ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
      ADC_InitStructure.ADC_NbrOfChannel = 1;
      ADC_Init(ADC1, &ADC_InitStructure);
      /* ADC1 regular channels configuration */ 
      ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);    
      /* Enable ADC1 DMA */
      ADC_DMACmd(ADC1, ENABLE);
      /* Enable ADC1 external trigger conversion */
      ADC_ExternalTrigConvCmd(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));



      /* ADC2 configuration ------------------------------------------------------*/
      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;
      ADC_Init(ADC2, &ADC_InitStructure);
      /* ADC2 regular channels configuration */ 
      ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5);    

      /* Enable ADC2 DMA */
//      ADC_DMACmd(ADC2, ENABLE);
      /* Enable ADC2 external trigger conversion */
      ADC_ExternalTrigConvCmd(ADC2, ENABLE);
       /* 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));

使用特权

评论回复
板凳
leebai_001| | 2008-7-24 13:14 | 只看该作者

AD时钟问题

检查AD的时钟设置。RCC内AD的分频系数。
72M的主时钟,对AD分频系数有要求,最少也得4分频。

使用特权

评论回复
地板
fubin|  楼主 | 2008-7-24 13:23 | 只看该作者

阿对此

RCC_PCLK2_Div4: ADC clock = PCLK2/4
RCC_PCLK2_Div6: ADC clock = PCLK2/6
RCC_PCLK2_Div8: ADC clock = PCLK2/8
我都试了,在RCC_PCLK2_Div8时
ADC_SampleTime_1Cycles5:ADC0(175-181),ADC1(3705-3713)

使用特权

评论回复
5
香水城| | 2008-7-24 14:54 | 只看该作者

请注意ADC管脚的等效输入阻抗

详见STM32的数据手册。

使用特权

评论回复
6
fubin|  楼主 | 2008-7-24 15:53 | 只看该作者

adc

使用特权

评论回复
7
fubin|  楼主 | 2008-7-24 15:56 | 只看该作者

adc

不好意思,没有仔细看文档,只为了赶进度,麻烦你了版主,谢谢。

使用特权

评论回复
8
lianshumou| | 2008-7-25 09:05 | 只看该作者

做高速采样时你的ADC输入最好是要用运放缓冲的!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝