Ir ao conteúdo

STM32 ADC não le divisor de tensão


Ir à solução Resolvido por Valdir Tech,

Posts recomendados

Postado

Prezados, estou tentando ler uma gama de botões via ADC (por conta de limitação de pinos que tenho na placa), assim, usando 1 pinos ADC para ler 5 botões.

Consigo ler o pull-up, mas quando aperto o botão, o valor lido é 0 e não o resultado de um divisor de tensão.

Segue esta parte do esquemático:

image.png.41fecd38cd2d86c35946a28df7059315.png

 

  • Membro VIP
Postado

Considerando que o setup de porta, rotina de leitura an e etc tá tudo certo... seu divisor tá meio perturbador ... 100000..4700.. quantos V acha que 560 ia quebrar de 3.3V pra entrada an?

Dica: considere 6 resistores iguais (10K) pra ter 5 tensões diferentes e equidistantes

 

Postado

@vtrx Segue abaixo o que foi feito:

@.if obrigado, vou considerar os 10k para teste e validação:

 

Inicialização da ADC_IN0 via STM32CubeIDE:

image.png.80066d717d1696650569636999da4a55.png

 

O código gerado por este HAL fica assim:

 

static void MX_ADC_Init(void)
{

  /* USER CODE BEGIN ADC_Init 0 */

  /* USER CODE END ADC_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC_Init 1 */

  /* USER CODE END ADC_Init 1 */
  /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
  */
  hadc.Instance = ADC1;
  hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc.Init.Resolution = ADC_RESOLUTION_12B;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
  hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc.Init.LowPowerAutoWait = DISABLE;
  hadc.Init.LowPowerAutoPowerOff = DISABLE;
  hadc.Init.ContinuousConvMode = DISABLE;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.DMAContinuousRequests = DISABLE;
  hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  if (HAL_ADC_Init(&hadc) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure for the selected ADC regular channel to be converted.
  */
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC_Init 2 */

  /* USER CODE END ADC_Init 2 */

}

 

No while(1), está assim:

 

     hadc.Instance->CHSELR |= ADC_CHSELR_CHANNEL(ADC_CHANNEL_0);
     HAL_ADC_Start(&hadc);
     HAL_ADC_PollForConversion(&hadc,10);
     value_adc=HAL_ADC_GetValue(&hadc);

 

O código rodando, o valor de value_adc fica assim:

image.png.455f064e11d1357946323acc17b77014.png

 

Apertando qualquer botão, a variável é zerada:

image.png.ded45dca0b51a5ba19c79b9dfacffcc3.png

 

  • Solução
Postado

Acabei constatando que era problema no HW.

Possivelmente um curto de solfa abaixo do micro SMD que tirando-o, limpando a placa e colocando ele novamente, funcionou. Agora com os 10k.

 

Tks

  • Amei 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!