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

stm32g4 ADC2

Здравствуйте все!

Прошу совета. Есть STM32G431KB (UFQFPN-32). Несколько каналов ацп. Разведены на adc1 и на adc2. Все каналы работают независимо. Каналы на adc1 измеряют корректно. Каналы на adc2 с очень большим смещением. Притом разным на разных каналах.  Ситуация идентична на двух платах. Пробовал упрощать, работать только с одним каналом, с dma или без - постоянно одно и тоже.

Если детальнее пример PA4, ADC_CHANNEL_17:

1) вход закорочен на 0 -  результат 1987

2) 0,27В на входе  - результат 2150

3) 2,2В на входе - результат  3358

Нигде не увидел такого, что adc2 не может работать независимо. Каких-то особенностей в инициализации ADC2 не нашел.  Ткните носом в очевидное пожалуйста.

Если верно понимаю stm32f4 аналогичен полностью. 

 

Самый упрощенный листинг прилагаю:


void ADC2_Init (void)
{
  ADC_ChannelConfTypeDef sConfig = {0};

  hadc2.Instance = ADC2;
  hadc2.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
  hadc2.Init.Resolution = ADC_RESOLUTION_12B;
  hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc2.Init.LowPowerAutoWait = DISABLE;
  hadc2.Init.ContinuousConvMode = ENABLE;
  hadc2.Init.NbrOfConversion = 1;
  hadc2.Init.DiscontinuousConvMode = DISABLE;
  hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc2.Init.DMAContinuousRequests = DISABLE;
  hadc2.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  hadc2.Init.OversamplingMode = DISABLE;
  if (HAL_ADC_Init(&hadc2) != HAL_OK)
  {
    Error_Handler();
  }
    
  sConfig.Channel    = ADC_CHANNEL_17;
  sConfig.Rank        = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;
  if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
}


int main (void)
{

    HAL_Init();

    SystemClock_Config();
    Device_EnterActiveMode    ();
    ADC2_Init ();
  
  if (HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED) != HAL_OK)
  {
    Error_Handler();
  }

  if (HAL_ADC_Start(&hadc2) != HAL_OK)
  {
    Error_Handler();
  }
  
  if (HAL_ADC_PollForConversion(&hadc2, 2) != HAL_OK)
  {
    Error_Handler();
  }
  
  while (1)
  {
    adcConvertedData = HAL_ADC_GetValue(&hadc2);
  }  
}

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


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

Добрый день.

Смещение относительно чего? У вас простейший софтовый старт через Хал.  Если хотите  точно то надо запускать через какой то тригер,  тогда выборки будут именно в  конеретное время

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


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

Я так понимаю, что смещение относительно нуля.

вход закорочен на 0 -  результат 1987

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


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

10 minutes ago, Aleksandr Baranov said:

Я так понимаю, что смещение относительно нуля.

вход закорочен на 0 -  результат 1987

да, похоже. 

Попробуйте как то так, это на F4 работало, А вообще юзал F0, F4, F7   по одному и по два ацп. никаких смещений никогда не было 

while (1)
  {
  
	  HAL_Delay(200);
	  HAL_ADC_Start_DMA(&hadc1,(uint32_t*) &ADC1_Data,4);
	  HAL_ADC_Start_DMA(&hadc2,(uint32_t*) &ADC2_Data,4);
	  HAL_Delay(20);	

 
}

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


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

40 минут назад, spirit_1 сказал:

А вообще юзал F0, F4, F7 по одному и по два ацп. никаких смещений никогда не было...

Да ладно... АЦП в F0 имеет смещение без калибровки.

Возможно, в G-серии тоже надо как-то калибровать.

P.S. Вижу, что у ТС вроде что-то как-то калибруется. Но правильно ли...
P.S. Errat-у на контроллер смотрели? Ничего по сабжу?
P.S. Errata все-таки впечатляет... Зато рекламщики нахваливают.

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


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

20.07.2020 в 23:47, rav38 сказал:

Прошу совета. Есть STM32G431KB (UFQFPN-32). Несколько каналов ацп. Разведены на adc1 и на adc2. Все каналы работают независимо. Каналы на adc1 измеряют корректно. Каналы на adc2 с очень большим смещением. Притом разным на разных каналах.  Ситуация идентична на двух платах.

Проверить правильно ли выставлена частота.

У ADC1 и ADC2 настройки частоты и делителя одинаковы?

И кстати макс. рабочая частота АЦП зависит от режима Voltage Regulator(Range1 и Range2).

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


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

Какие внутренние, заранее известные, для АЦП сигналы есть (опора, пол-питания); на него переключиться, чтоб проверить, что внешний вход без ошибок настроен. Ну дичь: 1987 при входе на "0".

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


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

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

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

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

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

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

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

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

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

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