rav38 0 20 июля, 2020 Опубликовано 20 июля, 2020 · Жалоба Здравствуйте все! Прошу совета. Есть 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); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spirit_1 5 26 августа, 2020 Опубликовано 26 августа, 2020 · Жалоба Добрый день. Смещение относительно чего? У вас простейший софтовый старт через Хал. Если хотите точно то надо запускать через какой то тригер, тогда выборки будут именно в конеретное время Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 26 августа, 2020 Опубликовано 26 августа, 2020 · Жалоба Я так понимаю, что смещение относительно нуля. вход закорочен на 0 - результат 1987 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spirit_1 5 26 августа, 2020 Опубликовано 26 августа, 2020 · Жалоба 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 26 августа, 2020 Опубликовано 26 августа, 2020 · Жалоба 40 минут назад, spirit_1 сказал: А вообще юзал F0, F4, F7 по одному и по два ацп. никаких смещений никогда не было... Да ладно... АЦП в F0 имеет смещение без калибровки. Возможно, в G-серии тоже надо как-то калибровать. P.S. Вижу, что у ТС вроде что-то как-то калибруется. Но правильно ли... P.S. Errat-у на контроллер смотрели? Ничего по сабжу? P.S. Errata все-таки впечатляет... Зато рекламщики нахваливают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 26 августа, 2020 Опубликовано 26 августа, 2020 · Жалоба 20.07.2020 в 23:47, rav38 сказал: Прошу совета. Есть STM32G431KB (UFQFPN-32). Несколько каналов ацп. Разведены на adc1 и на adc2. Все каналы работают независимо. Каналы на adc1 измеряют корректно. Каналы на adc2 с очень большим смещением. Притом разным на разных каналах. Ситуация идентична на двух платах. Проверить правильно ли выставлена частота. У ADC1 и ADC2 настройки частоты и делителя одинаковы? И кстати макс. рабочая частота АЦП зависит от режима Voltage Regulator(Range1 и Range2). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 26 августа, 2020 Опубликовано 26 августа, 2020 · Жалоба Какие внутренние, заранее известные, для АЦП сигналы есть (опора, пол-питания); на него переключиться, чтоб проверить, что внешний вход без ошибок настроен. Ну дичь: 1987 при входе на "0". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться