¿Cómo configurar ADC multicanal correctamente? Actualmente dos valores diferentes almacenados en la misma variable.

0

Quiero usar ADC multicanal con el STM32F4, así que quiero leer dos señales de CA diferentes en dos pines / canales diferentes. Un valor de señal de CA se debe almacenar en ADCConvertedValue [0] y el otro en ADCConvertedValue [1].

El problema es que ambos pines almacenan su valor en ADCConvertedValue [0]. Me salté el código de inicialización y puse la parte importante a continuación. ¿Alguien ve el problema?

  __IO uint16_t ADCConvertedValue[2]; 

  ADC_HandleTypeDef    AdcHandle;

  AdcHandle.Instance          = ADC2;
  AdcHandle.Init.ClockPrescaler        = ADC_CLOCKPRESCALER_PCLK_DIV4;
  AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
  AdcHandle.Init.ScanConvMode          = ENABLE;          
  AdcHandle.Init.ContinuousConvMode    = ENABLE;                      
  AdcHandle.Init.DiscontinuousConvMode = DISABLE;                      
  AdcHandle.Init.NbrOfDiscConversion   = 0;
  AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;      
  AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
  AdcHandle.Init.NbrOfConversion       = 2; 
  AdcHandle.Init.DMAContinuousRequests = ENABLE;
  AdcHandle.Init.EOCSelection          = EOC_SEQ_CONV;

  sConfig.Channel      = ADC_CHANNEL_1;
  sConfig.Rank         = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; 

  if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  sConfig.Channel      = ADC_CHANNEL_2;
  sConfig.Rank         = 2;

  if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

 if(HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&ADCConvertedValue, 2) != HAL_OK) 
  {
    Error_Handler();
  }
    
pregunta User 450

1 respuesta

0

No sé si resolvió el problema, pero como veo, debe cambiar

AdcHandle.Init.EOCSelection = ADC_EOC_SEQ_CONV;

a

AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;

Debido a que el indicador ADC_EOC_SEQ_CONV se eleva después de que finalizan todas las conversiones (se pasan todos los canales), pero necesita mover los datos del ADC a la memoria después de cada conversión, así que use ADC_EOC_SEQ_CONV .

Si no funciona, ¿puede publicar su configuración de DMA?

    
respondido por el Mike

Lea otras preguntas en las etiquetas