OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10413|回复: 1

关于stm32f373的sdadc采样问题

[复制链接]

4

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-9-9
在线时间
0 小时
发表于 2015-4-24 09:33:27 | 显示全部楼层 |阅读模式
5金钱
配置了sdadc  基本都是参考st官方固件的   但是官方的例程中用的中断读取采样的值,但是又没有写中断,不知道adc返回的值是怎么弄的,我配置好之后读取的值都是-32768,不知道怎么回事。。我用的查询的方式读取的,请大神们看看怎么回事
void SDADC3_Config(void)
{
  

  SDADC_AINStructTypeDef SDADC_AINStructure;
  GPIO_InitTypeDef   GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
// DMA_InitTypeDef   DMA_InitStructure;
//  SDADC_InitTypeDef SDADC_InitStructure;
  
  uint32_t SDADCTimeout = 0;
  
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
  /* MPX2102_SDADC APB2 interface clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDADC3, ENABLE);

  /* PWR APB1 interface clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  /* Enable MPX2102_SDADC analog interface */
  WR_SDADCAnalogCmd(PWR_SDADCAnalog_3, ENABLE);

  /* Set the SDADC divider: The SDADC should run @6MHz */
  /* If Sysclk is 72MHz, SDADC divider should be 12 */
  RCC_SDADCCLKConfig(RCC_SDADCCLK_SYSCLK_Div8);

  /* GPIOE Peripheral clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);

  /* MPX2102_SDADC channel D8 */
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Pin   =   GPIO_Pin_8 ;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /* Select External reference: The reference voltage selection is available
     only in SDADC1 and therefore to select the VREF for SDADC2/SDADC3, SDADC1
     clock must be already enabled */
  SDADC_VREFSelect(SDADC_VREF_Ext );

  
  /* Enable MPX2102_SDADC */
  SDADC_Cmd(SDADC3, ENABLE);

  /* Enter initialization mode */
  SDADC_InitModeCmd(SDADC3, ENABLE);
  SDADCTimeout = 30;
  /* wait for INITRDY flag to be set */
  while(SDADC_GetFlagStatus(SDADC3, SDADC_FLAG_INITRDY) == RESET );

//  if(SDADCTimeout == 0)
//  {
//    /* INITRDY flag is not set */
//    return 1;
//  }

  /* Analog Input configuration conf0: use differential mode and gain = 4 */
  SDADC_AINStructure.SDADC_InputMode = SDADC_InputMode_SEZeroReference;
  SDADC_AINStructure.SDADC_Gain = SDADC_Gain_1  ;
  SDADC_AINStructure.SDADC_CommonMode = SDADC_CommonMode_VSSA;
  SDADC_AINStructure.SDADC_Offset = 0;
  SDADC_AINInit(SDADC3, SDADC_Conf_0, &SDADC_AINStructure);

  /* Enable DMA transfer for injected conversions */
  //SDADC_DMAConfig(SDADC3, SDADC_DMATransfer_Injected, ENABLE);
  
  /* select MPX2102_SDADC channel 6 to use conf0 */
  SDADC_ChannelConfig(SDADC3, SDADC_Channel_6, SDADC_Conf_0);

//  /* select channel 8 */
  SDADC_InjectedChannelSelect(SDADC3, SDADC_Channel_6);
  SDADC_InjectedContinuousModeCmd(SDADC3,ENABLE);
  
//      /* Channel configuration for regular conversion*/
//        SDADC_InitStructure.SDADC_Channel = SDADC_Channel_6;
//        SDADC_InitStructure.SDADC_ContinuousConvMode = DISABLE;
//        SDADC_InitStructure.SDADC_FastConversionMode = DISABLE;
//        SDADC_Init(SDADC3, &SDADC_InitStructure);
//  
//        SDADC_RegularSynchroSDADC1(SDADC3,ENABLE);
          
  /* Select an external trigger */
SDADC_ExternalTrigInjectedConvConfig(SDADC3, SDADC_ExternalTrigInjecConv_T19_CC4);
//  /* Select rising edge */
  SDADC_ExternalTrigInjectedConvEdgeConfig(SDADC3, SDADC_ExternalTrigInjecConvEdge_Rising);

  /* Exit initialization mode */
  SDADC_InitModeCmd(SDADC3, DISABLE);

//  /* Enable end of injected conversion interrupt */
//  SDADC_ITConfig(SDADC3, SDADC_IT_JEOC, ENABLE);
//
// // SDADC_SoftwareStartInjectedConv(SDADC3);
//  
//  /* NVIC Configuration */
//  NVIC_InitStructure.NVIC_IRQChannel = SDADC3_IRQn;
//  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
//  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//  NVIC_Init(&NVIC_InitStructure);

  /* configure calibration to be performed on conf0 */
  SDADC_CalibrationSequenceConfig(SDADC3, SDADC_CalibrationSequence_1);
  /* start MPX2102_SDADC Calibration */
  SDADC_StartCalibration(SDADC3);
  /* Set calibration timeout: 5.12 ms at 6 MHz in a single calibration sequence */
  SDADCTimeout = 4*30720;
  /* wait for MPX2102_SDADC Calibration process to end */
  while(SDADC_GetFlagStatus(SDADC3, SDADC_FLAG_EOCAL) == RESET);
}

在main中 一直读取返回值
while(1)
{
       if(SDADC_GetFlagStatus(SDADC3, SDADC_FLAG_JEOC) != RESET)
    {
        /* Get the converted value */
        ChannelIndex=SDADC_Channel_6;
        InjectedConvData = SDADC_GetInjectedConversionValue(SDADC3, &ChannelIndex);        }
}
并且上面SDADC_GetInjectedConversionValue函数的通道参数选择不能直接用SDADC_Channel_6  不知所以然。。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-4-24 23:44:08 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 12:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表