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

Когда выбирается второй канал 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

Разработка преобразователей на основе карбид-кремниевых приборов с помощью симулятора SpeedFit 2.0

Компания Wolfspeed разработала бесплатный онлайн симулятор SpeedFit 2.0, позволяющий разработчикам быстро и всесторонне оценить параметры основных процессов, происходящих в силовой части импульсных преобразователей электрической энергии, и сравнить между собой различные варианты реализации поставленного технического задания.

Подробнее

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

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

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

Link to comment
Share on other sites

Приглашаем на вебинар «Необычное в обычном. Сравнительный анализ современных решений Recom» (27.01.2022)

Приглашаем 27/01/2022 всех желающих посетить вебинар, посвященный двум наиболее растущим сегментам интегрированных источников питания – AC/DC малой мощности (1-20Вт) и сегменту решений PoL без изоляции. На вебинаре рассмотрим проблему выбора AC/DC в бюджетном сегменте и концепцию тестирования ускоренного старения, проведем сравнительный анализ подходов к интеграции AC/DC модулей. Сделаем обзор решений концепции POL с доисторических времен до современных технологий и средств для разработки и тестирования.

Подробнее

Способы повышения КПД и удельной мощности инверторов для солнечных электростанций

Какую элементную базу выбрать для проектирования инверторов для солнечных батарей – новую карбид-кремниевую или традиционную кремниевую? Специалисты Infineon приходят к неожиданному выводу: традиционная кремниевая может помочь достичь КПД 99%. Но для этого следует применить сравнительно новую схему многоуровневого преобразования, которая может оказаться непростой для начинающего разработчика.

Подробнее

Join the conversation

You are posting as a guest. 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
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.
  • Сообщения

  • Similar Content

    • By kirill.banakh
      Приветствую уважаемые дамы и господа!
      Занимаюсь разработкой носимого устройства с целью исследования технологий LoRaWAN и BLE 5.0. А также поработать с энергоэффективными режимами работы МК STM32L4-серии.
      Исходные данные:



      где - D3 микросхема зарядки Li-ion\Li-Pol аккумулятора (MCP73831),
               D4 - DC\DC преобразователь USB -> 3.3V (LM3671),
               D5 - DC\DC преобразователь VBAT -> 3.3V (LM3671).

      Суть моего вопроса:
      Если присутствует напряжение VBUS (USB), то необходимо выключать преобразователь D5 сигналом LM3671_BAT, но включать D4 сигналом LM3671_USB.
      Таким образом получается, что аккумулятор будет заряжаться, а питаться прибор будет от USB.

      Мои предположения, рассуждения и решения которые я вижу:
      Если управлять преобразователями при помощи GPIO портов МК, то получится, что как только питание по USB отключится, то прибор выключится быстрее, чем успеет включиться преобразователь работающий от VBAT, ввиду чего я такое решение и отмёл. Использовать небольшую схемку на двух полевых транзисторах в одном корпусе (p и n типа). В симуляторе вроде как всё работает, но вероятно может произойти та же ситуация, что и в случае 1;

        Использовать микросхему выполняющую данную задачу, но тут играет роль, что достать её сложно, стоит 7$ и выглядит как overkill для такой простой задачи. Покидайтесь, пожалуйста, камнями и критикой решений, своими вариантами решения задачи или же исправлениями к приложенным схемам.
      -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      Если вдруг кого-то заинтересует,
      то вот ссылка на GitHub проекта,
      а так же ссылка на GitHub библиотеки.
      Используются шрифты T-Flex GOST, можно получить по ссылке.
    • By Fordli
      Я написал программу последовательного порта с stm32, OP отправляет число, а затем возвращает число, но возвращаемое число - это какой-то неизвестный символ, скорость передачи синхронизирована 9608, стоп-биты данных и т.д. одинаковы, от tx до rx, все еще грязный код.
      Я поменял 3 помощника для отладки последовательного интерфейса, но они все одинаковые, кто-нибудь знает? Спасибо за ваш ответ.
    • By Solver
      Вопрос такой: как запросить содержимое корневого каталога при использовании библиотеки lfs.h. При этом я имею дело с чужим кодом и там файловая система уже отформатирована (когда-то) и смонтирована (при запуске устройства). Оперировать с каталогами и файлами имена которых я заведомо знаю (или сам создаю) у меня получатся, но для текущей задачи это мне никак не помогает.
      Вероятно мой вопрос очень простой и для многих очевидный, но я тем не менее не смог с наскока найти на него ответ ни в гугле, ни в lfs.h. Очень извиняюсь за невежество, я новичек
    • By hwmaker
      Добрый день.
      На проект требуется программист микроконтроллеров STM32 с пониманием Ethernet.
      Проект:
      плата работает под управлением STM32F413VGT6, представляет собой SIP-приставку для домофона.
      Для связи с Ethernet используется микросхема ENC424J600-I/P - мост SPI <-> Ethernet.
      Ниже приведено краткое описание функционала:
      Устройство должно обеспечивать:
          1.    Прием голоса из домофоной линии и оцифровка с помощью встроенного в контроллер АЦП.
          2.    Передача голоса по сети Ethernet по протоколу RTP. В качестве транспорта использовать UDP.
          3.    Прием голосовых сообщений по Ethernet по протоколу RTP и передачу их на встроенный ЦАП.
          4.    Микроконтроллер должен обеспечивать связь с внешним миром с помощью интерфейса Ethernet через микросхему ENC424J600-PT. 
          5.    Для установления соединения с сервером голосовых сообщений используется протокол SIP 2.0. с поддержкой методов, описанных в RFC 3261. 
          6.  Прием и отработку команд, приходящих по MQTT: открыть входную дверь, открыть шлагбаум и т.п.
          7.  WEB-интерфейс для удаленных настроект и мониторинга рабочих параметров устройства.
          8. Для работу через VPN-роутер контроллер должен поддерживать STUN.
          
      Есть проект для микроконтроллера для аналогичного устройства. Там используется STM32L475RET6.
      Для связи с Ethernet используется так же ENC424J600-I/P.
      Устройство успешно звонить по SIP на сервер. Выполняет приходящие MQTT-команды по открыванию дверей.
      Требуется: 
          поправить ПО под STM32F413VGT6, 
          добавить WEB-интерфейс, 
          добавить возможность удаленного обновления ПО через WEB-интерфейс,
          добавить возможность перезагрузки устройства через WEB-интерфейс,
          добавить возможность хранения данных абонентов во FLASH микроконтроллера и возможность синрохизации этих данных с сервером,
          добавить STUN, 
          исправить метод определения квартиры в которую звонят.
      Есть ТЗ на ПО.
    • By Uhbif
      Хочу сделать вольтамперметр на базе STM32L151, есть ли какие нибудь особенности при разводке платы? Свой вариант прикрепляю ниже. Буду благодарен за дельные комментарии. 
      ВА-30.dch
×
×
  • Create New...