打印
[STM32F3]

4通道SDADC采集只能获取三个

[复制链接]
2374|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
宋倩2010|  楼主 | 2016-5-29 16:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用SDADC1的0P,SDADC2的0P,SDADC3的0P和1P,SDADC的0P(channel_0)没取得数据
沙发
chenho| | 2016-5-29 16:48 | 只看该作者
配置呢

使用特权

评论回复
板凳
宋倩2010|  楼主 | 2016-5-29 16:49 | 只看该作者

SDADC_AINStructTypeDef SDADC_AINStructure;
  GPIO_InitTypeDef   GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
        DMA_InitTypeDef     DMA_InitStructure;
  uint32_t SDADCTimeout = 0;
  
  /* HADA6017_SDADC APB2 interface clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDADC1|RCC_APB2Periph_SDADC2|RCC_APB2Periph_SDADC3, ENABLE);
  /* PWR APB1 interface clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  /* Enable HADA6017_SDADC analog interface */
  PWR_SDADCAnalogCmd(PWR_SDADCAnalog_1|PWR_SDADCAnalog_2|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_Div12);
        /* GPIOE Peripheral clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE|RCC_AHBPeriph_GPIOD, ENABLE);
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Pin   =  GPIO_Pin_12 | GPIO_Pin_15;
  GPIO_Init(GPIOE, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Pin   =  GPIO_Pin_14 | GPIO_Pin_13;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  SDADC_VREFSelect(SDADC_VREF_Ext);
  //---------------------------//
  Delay(5);
  
  /* Enable HADA6017_SDADC */
  SDADC_Cmd(SDADC1, ENABLE);
        SDADC_Cmd(SDADC2, ENABLE);
        SDADC_Cmd(SDADC3, ENABLE);
  /* Enter initialization mode */
  SDADC_InitModeCmd(SDADC1, ENABLE);
        SDADC_InitModeCmd(SDADC2, ENABLE);
        SDADC_InitModeCmd(SDADC3, ENABLE);
  SDADCTimeout = SDADC_INIT_TIMEOUT;
  /* wait for INITRDY flag to be set */
  while((SDADC_GetFlagStatus(SDADC1, SDADC_FLAG_INITRDY) == RESET) && (--SDADCTimeout != 0));
  if(SDADCTimeout == 0)
  {
    /* INITRDY flag is not set */
    return 1;
  }
        SDADC_AINStructure.SDADC_InputMode = SDADC_InputMode_SEZeroReference;//;SDADC_InputMode_SEOffset
  SDADC_AINStructure.SDADC_Gain = SDADC_Gain_1;
  SDADC_AINStructure.SDADC_CommonMode = SDADC_CommonMode_VSSA;
  SDADC_AINStructure.SDADC_Offset = 0;
  SDADC_AINInit(SDADC1, SDADC_Conf_0, &SDADC_AINStructure);
        SDADC_AINInit(SDADC2, SDADC_Conf_0, &SDADC_AINStructure);
        SDADC_AINInit(SDADC3, SDADC_Conf_0, &SDADC_AINStructure);
//        SDADC_AINInit(SDADC3, SDADC_Conf_1, &SDADC_AINStructure);
        
  SDADC_ChannelConfig(SDADC1, SDADC_Channel_0, SDADC_Conf_0);
        SDADC_ChannelConfig(SDADC2, SDADC_Channel_0, SDADC_Conf_0);
        SDADC_ChannelConfig(SDADC3, SDADC_Channel_0, SDADC_Conf_0);
        SDADC_ChannelConfig(SDADC3, SDADC_Channel_1, SDADC_Conf_0);
  /* select channel 0 */
  SDADC_InjectedChannelSelect(SDADC1, SDADC_Channel_0);
        SDADC_InjectedChannelSelect(SDADC2, SDADC_Channel_0);
        SDADC_InjectedChannelSelect(SDADC3, SDADC_Channel_0);
        SDADC_InjectedChannelSelect(SDADC3, SDADC_Channel_1);
  /* Select an external trigger */
  SDADC_ExternalTrigInjectedConvConfig(SDADC1, SDADC_ExternalTrigInjecConv_T19_CC2);
        SDADC_ExternalTrigInjectedConvConfig(SDADC2, SDADC_ExternalTrigInjecConv_T19_CC3);
        SDADC_ExternalTrigInjectedConvConfig(SDADC3, SDADC_ExternalTrigInjecConv_T19_CC4);
  /* Select rising edge */
  SDADC_ExternalTrigInjectedConvEdgeConfig(SDADC1, SDADC_ExternalTrigInjecConvEdge_Rising);
        SDADC_ExternalTrigInjectedConvEdgeConfig(SDADC2, SDADC_ExternalTrigInjecConvEdge_Rising);
        SDADC_ExternalTrigInjectedConvEdgeConfig(SDADC3, SDADC_ExternalTrigInjecConvEdge_Rising);
  /* Exit initialization mode */
  SDADC_InitModeCmd(SDADC1, DISABLE);
        SDADC_InitModeCmd(SDADC2, DISABLE);
        SDADC_InitModeCmd(SDADC3, DISABLE);
  /* Enable end of injected conversion interrupt */
  SDADC_ITConfig(SDADC1, SDADC_IT_JEOC, ENABLE);
        SDADC_ITConfig(SDADC3, SDADC_IT_JEOC, ENABLE);
        SDADC_ITConfig(SDADC2, SDADC_IT_JEOC, ENABLE);

  /* NVIC Configuration */
  NVIC_InitStructure.NVIC_IRQChannel = SDADC1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
        
        NVIC_InitStructure.NVIC_IRQChannel = SDADC2_IRQn;
  NVIC_Init(&NVIC_InitStructure);
        
        NVIC_InitStructure.NVIC_IRQChannel = SDADC3_IRQn;
  NVIC_Init(&NVIC_InitStructure);

  /* configure calibration to be performed on conf0 */
  SDADC_CalibrationSequenceConfig(SDADC1, SDADC_CalibrationSequence_1);
        SDADC_CalibrationSequenceConfig(SDADC2, SDADC_CalibrationSequence_1);
        SDADC_CalibrationSequenceConfig(SDADC3, SDADC_CalibrationSequence_1);
  /* start HADA6017_SDADC Calibration */
  SDADC_StartCalibration(SDADC1);
        SDADC_StartCalibration(SDADC2);
        SDADC_StartCalibration(SDADC3);
  /* Set calibration timeout: 5.12 ms at 6 MHz in a single calibration sequence */
  SDADCTimeout = SDADC_CAL_TIMEOUT;
  /* wait for HADA6017_SDADC Calibration process to end */
  while((SDADC_GetFlagStatus(SDADC1, SDADC_FLAG_EOCAL) == RESET) && (--SDADCTimeout != 0));

  if(SDADCTimeout == 0)
  {
    /* EOCAL flag can not set */
    return 2;
  }
SDADC_SoftwareStartInjectedConv(SDADC3);

中断处理:
if(SDADC_GetFlagStatus(SDADC3, SDADC_FLAG_JEOC) != RESET)//SDADC_FLAG_JEOC
  {
    nAdVal= SDADC_GetInjectedConversionValue(SDADC3, &ChannelIndex);
                if(ChannelIndex == 1)
                {
                        adValue[2][ad2cnt]=nAdVal;ad2cnt++;
                        if(ad2cnt>=para[SAMP_NUM].i1)
                        {
                                ad2cnt = 0;dis[31].i1++;
                        }
                }
                if(ChannelIndex == 0x10002)
                {
                        adValue[3][ad3cnt]=nAdVal;ad3cnt++;
                        if(ad3cnt>=para[SAMP_NUM].i1)
                        {
                                ad3cnt = 0;
                        }
                }

  }

使用特权

评论回复
地板
gongche| | 2016-5-29 16:51 | 只看该作者
看不懂。。。

使用特权

评论回复
5
宋倩2010|  楼主 | 2016-5-29 16:52 | 只看该作者
找到原因了

使用特权

评论回复
6
huwr| | 2016-5-29 16:53 | 只看该作者
什么原因?也给大家分享一下吧。

使用特权

评论回复
7
宋倩2010|  楼主 | 2016-5-29 16:53 | 只看该作者
SDADC_InjectedChannelSelect(SDADC3, SDADC_Channel_0);
SDADC_InjectedChannelSelect(SDADC3, SDADC_Channel_1);
改为
SDADC_InjectedChannelSelect(SDADC3, SDADC_Channel_0|SDADC_Channel_1);

使用特权

评论回复
8
huanghuac| | 2016-5-29 16:56 | 只看该作者
强啊

使用特权

评论回复
9
宋倩2010|  楼主 | 2016-5-29 16:57 | 只看该作者
呵呵,结贴了啊

使用特权

评论回复
10
yehss| | 2017-1-13 10:47 | 只看该作者
请问一下,您在SDADC配置中只写了SDADC_SoftwareStartInjectedConv(SDADC3);这一句吗?不用配置1和2吗?还有是不是对应SDADC1 2 3分别写了3个中断处理函数?

使用特权

评论回复
11
Crystal6927| | 2017-2-9 10:21 | 只看该作者
感谢楼主,我之前也遇到这样多通道采集的问题,看到你的代码,发现问题出现在中断程序了,问题现在已经解决了

使用特权

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

本版积分规则

322

主题

3217

帖子

2

粉丝