ADC_Channel_0与实际的adc用管脚PA0不一致

2019-07-14 16:52发布

我没有用dma,直接调用ADC1_GetVol( 1 , ADC_Channel_9),我的adc用管脚PB1,按理应该是ADC_Channel_9。实际上却在ADC_Channel_0;adc用管脚PA0,按理应该是ADC_Channel_0。实际上却在ADC_Channel_9,怎么会变了?
更郁闷的是程序修改了其它与这个调用ADC1_GetVol无关的地方,原来的adc用ADC_Channel_0,却没有跟随变化了?而adc用管脚PA0,按理应该是ADC_Channel_0。还在ADC_Channel_9。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
nvywerwrq
1楼-- · 2019-07-15 14:05
管脚肯定没有错  初始化如下:
        /* Enable  GPIOA clock */
          RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  /* ADC1 Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  /* DMA1 clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , DISABLE);

  /* Configure PA.01  as analog input */
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;// ;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOA, &GPIO_InitStruct);                               
nvywerwrq
2楼-- · 2019-07-15 19:44
直接调用ADC1_GetVol( 1 , ADC_Channel_9),我的adc用管脚PB1,按理应该是ADC_Channel_9。实际上却在ADC_Channel_0;adc用管脚PA0,按理应该是ADC_Channel_0。实际上却在ADC_Channel_9,怎么会变了?但是还是能够用,一直没有管它,将错就错。可以现在启动了时钟TIM3和加了一些与adc无关的程序。ADC1_GetVol( 1 , ADC_Channel_0)就没有了?
   以前用过很多stm32f103stm32f107,都没有这个问题。
nvywerwrq
3楼-- · 2019-07-16 01:21
单独只使用一个channel,是正确的,可是用了3个channel,切换后就是不对。
  ADCx->CHSELR = (uint32_t)ADC_Channel;        //

不向stm32f103107
        ADC1->SQR3|=ch;                  //这个是正确的,很容易
请教大侠指点。                            
nvywerwrq
4楼-- · 2019-07-16 04:17
微笑的绽放 发表于 2018-10-16 16:40
这种情况那就排除看看喽,是不是原理图上面连接有错或者是标错了了,或者查一下端口复用之类的,最好重新建立一个单独工程看看。芯片一般是不会有问题,估计原理图可能性比较大

单独用一个channel adc是正确的,用3个,作channel切换就不对了?请指点:
  /* Convert the selected Channel Vref  with 55.5 Cycles as sampling time */
  ADC_ChannelConfig(ADC1, ADC_Channel, ADC_SampleTime_239_5Cycles);
//  ADC_ChannelConfig(ADC1, ADC_Channel_0  , ADC_SampleTime_55_5Cycles);
//  cda_value=2;
  /* ADC Calibration */
  ADC_GetCalibrationFactor(ADC1);
//   ADC_DMACmd(ADC1, DISABLE);
  /* Enable ADC1 */
//  ADC_Cmd(ADC1, ENABLE);     
  
  /* Wait the ADCEN falg */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
  /* ADC1 regular Software Start Conv */
  ADC_StartOfConversion(ADC1);
        if(cda_value==1) RegularConvData_Tab1 = ADC_GetConversionValue(ADC1);
        else if(cda_value==2) RegularConvData_Tab2 = ADC_GetConversionValue(ADC1);
        else if(cda_value==3) RegularConvData_Tab3 = ADC_GetConversionValue(ADC1);
nvywerwrq
5楼-- · 2019-07-16 07:14
 精彩回答 2  元偷偷看……
nvywerwrq
6楼-- · 2019-07-16 07:36
  ADC_ChannelConfig(ADC1, ADC_Channel, ADC_SampleTime_239_5Cycles);
  /* ADC Calibration */
  ADC_GetCalibrationFactor(ADC1);
  
  /* Wait the ADCEN falg */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
  /* ADC1 regular Software Start Conv */
  ADC_StartOfConversion(ADC1);
        if(ADC_Channel==ADC_Channel_0) RegularConvData_Tab1 = ADC_GetConversionValue(ADC1);
        else if(ADC_Channel==ADC_Channel_1) RegularConvData_Tab2 = ADC_GetConversionValue(ADC1);
        else if(ADC_Channel==ADC_Channel_9) RegularConvData_Tab3 = ADC_GetConversionValue(ADC1);

一周热门 更多>