Mise en œuvre de l’ADC

Mise en oeuvre de l'ADC sans le DMA

Matériel requis

  • un ordinateur avec un terminal (putty, termite,...)
  • une carte nucleo-L073RZ ou STM32F446RE ou autre
  • Un potentiomètre de 10kOhm par exemple relié à PA0 ou la carte IHM (mbed-application-shield)

  • Création du projet - Côté configuration

    Configuration USART

    On configure l'USART2 en 115200 baud.

Configuration ADC

Les choses importantes ici sont la résolution (12 bits), on aurait pu prendre moins.
Les paramètre Continous conversion Mode et Discontinuous Conversion Mode peuvent être indifféremment Enable ou Disable.

Si on met Enable à Conversion Continuous Mode plus besoin de faire à chaque fois un ADC_Start(), on le fait au début une fois pour toute.
Evidemment, si on fait un ADC_Stop(), va falloir remettre un ADC_Start() quand on veut un nouvel échantillon.

Fonction main de main.c :

    MX_GPIO_Init();
    MX_DMA_Init();
    MX_USART2_UART_Init();
    MX_ADC_Init();
    HAL_UART_Transmit(&huart2, welcomeMessage , sizeof(welcomeMessage), HAL_MAX_DELAY);

    uint8_t pdata = 0;
    uint8_t message[5];
    HAL_ADC_Start(&hadc);
  while (1)
  {
        HAL_ADC_Start(&hadc);
        HAL_ADC_PollForConversion(&hadc, 1);
        pdata = HAL_ADC_GetValue(&hadc);
        sprintf(message,"%d\r\n",HAL_ADC_GetValue(&hadc));
        HAL_UART_Transmit(&huart2, message , sizeof(message), HAL_MAX_DELAY);
        HAL_ADC_Stop(&hadc);
        HAL_Delay(200);
  }
}

Fonction MX_ADC_Init de main.c :

static void MX_ADC_Init(void)
{
  ADC_ChannelConfTypeDef sConfig = {0};

  hadc.Instance = ADC1;
  hadc.Init.OversamplingMode = DISABLE;
  hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1;
  hadc.Init.Resolution = ADC_RESOLUTION_8B;
  hadc.Init.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ContinuousConvMode = ENABLE;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc.Init.DMAContinuousRequests = DISABLE;
  hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc.Init.LowPowerAutoWait = DISABLE;
  hadc.Init.LowPowerFrequencyMode = ENABLE;
  hadc.Init.LowPowerAutoPowerOff = DISABLE;
  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;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
}