Jump to content

STM32L010RB как правильно использовать ADC несколько каналов одновременно


Serhii Serheiev
 Share

Recommended Posts

Помогите пожалуйста советом. Бьюсь несколько дней с опцией ADC.

Я использую двухканальный АЦП IN0 и IN1 на микроконтроллере STM32L010RB через библиотеку HAL.

Если проверять по отдельности, все в порядке, но когда я проверяю вместе, у меня все время одна и та же проблема: первый канал перезаписывает данные на втором канале, и у меня одинаковые данные на IN0 и IN1 в терминале

Функция для выбора IN0.

void ADC_Select_CH0(void) 
{ 
ADC_ChannelConfTypeDef sConfig_0 = {0}; 
sConfig_0.Channel = ADC_CHANNEL_0; 
sConfig_0.Rank = 0; 
 if (HAL_ADC_ConfigChannel(&hadc, &sConfig_0) != HAL_OK) 
 { 
  Error_Handler(); 
 } 
}

Функция для выбора IN1

void ADC_Select_CH1(void) 
{ 
ADC_ChannelConfTypeDef sConfig_1 = {0}; 
sConfig_1.Channel = ADC_CHANNEL_1; 
sConfig_1.Rank = 0; 
 if (HAL_ADC_ConfigChannel(&hadc, &sConfig_1) != HAL_OK) 
 { 
  Error_Handler(); 
 } 
}

основной цикл

while(1)
{
  ADC_Select_CH0();
    HAL_ADC_Start(&hadc);
    HAL_ADC_PollForConversion(&hadc, 100);
  Axis[0] = HAL_ADC_GetValue(&hadc);
    HAL_ADC_Stop(&hadc);

  ADC_Select_CH1();
    HAL_ADC_Start(&hadc);
    HAL_ADC_PollForConversion(&hadc, 100);
  Axis[1] = HAL_ADC_GetValue(&hadc);
    HAL_ADC_Stop(&hadc);

  sprintf(Tx_Data, "Axis X: %d;\r\nAxis Y: %d;\r\n\n\n", Axis[0], Axis[1]);
    HAL_UART_Transmit(&huart2, (uint8_t*)Tx_Data, strlen(Tx_Data), 1000);
}

ADC конфигурация:

static void MX_ADC_Init(void)
{
  hadc.Instance = ADC1;
  hadc.Init.OversamplingMode = DISABLE;
  hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
  hadc.Init.Resolution = ADC_RESOLUTION_12B;
  hadc.Init.SamplingTime = ADC_SAMPLETIME_160CYCLES_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 = DISABLE;
  hadc.Init.LowPowerAutoPowerOff = DISABLE;
  if (HAL_ADC_Init(&hadc) != HAL_OK)
  {
    Error_Handler();
  }
}

 

Link to comment
Share on other sites

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Когда выбирается второй канал ADC_CHANNEL_1 - он просто добавляется к уже выбранному первому каналу ADC_CHANNEL_0, первый канал остаётся включённым при этом. Так уж устроен HAL. Поэтому преобразование всегда начинается с первого канала.

Надо при выборе второго сначала загасить первый. Для этого используем константу ADC_RANK_NONE.

sConfig_0.Channel = ADC_CHANNEL_0;
sConfig_0.Rank = ADC_RANK_NONE;
if (HAL_ADC_ConfigChannel(&hadc, &sConfig_0) != HAL_OK)
{
	Error_Handler(); 
}

а потом уже выбирать второй канал с константой ADC_RANK_CHANNEL_NUMBER

sConfig_0.Channel = ADC_CHANNEL_1;
sConfig_0.Rank = ADC_RANK_CHANNEL_NUMBER;
if (HAL_ADC_ConfigChannel(&hadc, &sConfig_0) != HAL_OK)
{
	Error_Handler(); 
}

То же самое надо добавить и в функцию выбора первого канала: сначала гасим второй, затем добавляем первый.

Link to comment
Share on other sites

Зачем включать / отключать

Есть режим инжекции и перебора

каждый канал записывает свои данные в свой регистр

есть прерывание, в котором можно определить с какого канала прилетели данные

есть DMA

Читайте статьи коих в инете как "ГАВНА"

А лучше читайте PDF на контроллер от STM

Edited by hasl
Link to comment
Share on other sites

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Инжектированный режим вам в помощь.

Если не ошибаюсь , можно заюзать до 4 каналов, и данные будут сохраняться в свои регистры .

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Link to comment
Share on other sites

Как измерить внутреннее сопротивление литиевого аккумулятора. Измеряем правильно

Внутреннее сопротивление – один из наиболее значимых параметров, от которого напрямую зависят другие характеристики литиевого аккумулятора. От этого параметра зависят такие характеристики источника питания, как напряжение на выходе под нагрузкой, максимальный выходной ток и коэффициент полезного действия (КПД). Рассмотрим как измерить действительное значение внутреннего сопротивления АКБ, используя определенные методики. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...