Перейти к содержанию
    

Настройка и запуск АЦП в Runtime c помощью HAL в STM32CubeIDE

Здравствуйте.
Мне нужно в RunTime настроить заданный пин (например A1) для работы с ацп, запустить преобразование ,получить результат, применяя HAL    (чип stm32F401)
Логика работы такая:
по требованию начинается цикл измерений (несколько преобразований для усреднения) - каждую секунду запускается измерение напряжение на заданном пине (А1)
по окончанию преобразования, результат суммируется с предыдущим для последующего усреднения
Напомню,При запуске МС этот заданный пин неизвестен и должен находиться в Reset_State

Чтобы заставить STM32CubeIDE сгенерировать начальный код настройки АЦП, использование колбэк функций и тд,    и при этом не указывать конкретный пин,
я задаю использование для АЦП встроенного температурного датчика на кристалле, ставлю галочки прерывание на окончание АЦП..
кстати, в будущем этот датчик планирую использовать

вот вообщем код инициализации  - генерирует STM32CubeIDE
включить тактирование порта А я не забыл   __HAL_RCC_GPIOA_CLK_ENABLE(); - вызваю ранее

void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
  if(hadc->Instance==ADC1)
  {
    __HAL_RCC_ADC1_CLK_ENABLE();
    HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(ADC_IRQn);
  }

}

static void MX_ADC1_Init(void)
{

  ADC_ChannelConfTypeDef sConfig = {0};
  ADC_InjectionConfTypeDef sConfigInjected = {0};

  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV8;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

 /*вот я даже пробовал использовать InjectedChannel - 
  sConfigInjected.InjectedChannel = ADC_CHANNEL_TEMPSENSOR;
  sConfigInjected.InjectedRank = 1;
  sConfigInjected.InjectedNbrOfConversion = 1;
  sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_3CYCLES;
  sConfigInjected.ExternalTrigInjecConvEdge = ADC_EXTERNALTRIGINJECCONVEDGE_NONE;
  sConfigInjected.ExternalTrigInjecConv = ADC_INJECTED_SOFTWARE_START;
  sConfigInjected.AutoInjectedConv = DISABLE;
  sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
  sConfigInjected.InjectedOffset = 0;
  if (HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected) != HAL_OK)
  {
    Error_Handler();
  }
  */
} 

когда становится известно какой пин нужен, пишу:

GPIO_InitTypeDef GPIO_InitStruct = {0};
 GPIO_InitStruct.Pin = 1<<(uint16_t)Line;
 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 

запуск преобразования делаю так, к этому времени какой пин нужен стало уже известно (A1)


sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {Error_Handler();}
HAL_ADC_Start(&hadc1);//начать АЦП преобразование


написал колбэк по окончанию

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) //окончание АЦП преобразования
{
adc_data = HAL_ADC_GetValue(&hadc1);
.....

 

Вообщем похоже что прерывание не наступает, флаг туда еще не ставил для проверки....
но мне нужно узнать правильно ли я настроил АЦП, ПОМОГИТЕ

работоспособен ли такой вариант
не особо понимаю смысл всех этих Rank,InjectedChannel,SamplingTime

 

 

Изменено пользователем user_stm
случайно нажал enter

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В пакете HAL для F4 есть примеры

ADC_DualModeInterleaved
ADC_InjectedConversion_Interrupt
ADC_RegularConversion_DMA
ADC_RegularConversion_Interrupt
ADC_RegularConversion_Polling
ADC_TriggerMode
ADC_TripleModeInterleaved

Посмотрите, запустите и будет понимание

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, user_stm сказал:

не особо понимаю смысл всех этих Rank,InjectedChannel,SamplingTime

Для понимания производитель чипа написал для вас юзер.мануал. Попробуйте всё-таки открыть его.

PS: Работать с какой-то периферией МК не читая юзер.мануал, это всё равно, что играть в пинг-понг с закрытыми глазами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...