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

Вебинар «Новые тенденции сетевых технологий: Ethernet по одной витой паре» (09.12.2021)

Приглашаем 9 декабря всех желающих посетить вебинар, посвященный технологии Ethernet и её новому стандарту 10BASE-T1S/L. Стандарт 802.3cg описывает передачу данных на скорости до 10 Мбит в секунду по одной витой паре. На вебинаре будут рассмотрены и другие новшества, которые недавно вошли в семейство технологий Ethernet: SyncE, PTP, TSN. Не останется в стороне и высокоскоростной 25G+ Ethernet от Microchip.

Подробнее

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

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

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

Link to comment
Share on other sites

DC/DC-преобразователи Mornsun со склада Компэл

В сложный период для рынка электронных компонентов, когда производители увеличивают сроки поставки продукции, со склада Компэл можно приобрести широкий ассортимент DC/DC-преобразователей производства компании Mornsun. На складе представлены наиболее популярные семейства изолированных и неизолированных DC/DC-преобразователей новых поколений R3 и R4, а также предыдущего, но по-прежнему востребованного поколения R2.

Подробнее

Теперь более 300 наименований: новое поступление Connfly на склад Компэл

Компэл объявляет о значительном расширении складского ассортимента продукции Connfly. Универсальные коммутирующие компоненты, соединители и держатели Connfly сочетают соответствие стандарту ISO9001:2008, высокую доступность и простоту использования. На текущий момент на складе Компэл – более 300 востребованных на рынке товарных наименований с гибкой ценовой политикой.

Подробнее

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.
  • Сообщения

    • Ну, теоретическая разница в искажениях и шумах между 24 и 32-разрядным ЦАПом съедается характеристиками операционников, разница будет определяться в основном их качеством. Хотя у M-Audio заявлено SNR -104dB, а у Fiio -123dB. Может у Fiio действительно ОУ лучше. Хотя не представляю, что сейчас туда могут поставить. Но если вы способны услышать разницу THD+N (заявленными в характеристиках) между 0.002% и 0,0004%, и отчётливо слышите шумы ниже -104dB, то конечно смысл есть.
    • А почему нет? Регулирующему транзистору десяток вольт не нужен. На схеме постом выше, с составным эмиттерным повторителем, на регулирующих транзисторах достаточно пары вольт падения, чтобы они были в нормальном активном режиме. Если на входе 30, на выходе 27-28 точно можно сделать. @Derian , чтобы не копаться глубоко в теме (лень, и никому кроме вас не надо), не можете на этой страничке продублировать именно ту схему, по которой собрали? Очень вероятно, что появятся идеи, почему так и как исправить. Второе соображение - вы относительно какой точки 30 В намеряли, и относительно какой - 20,5? Отрицательное напряжение питания в эти 30 В случайно не закралось? Должен, должен. Хотя и без них будет работать. Но не так надёжно и хорошо.
    • ой да то дяДько просто кЫно на трубе для клЫентов крутЫть. одну рабочую деталь снял, другую поставил  прозвон симистора: из коробки, новый,  не паяный , ещё ни разу не работал = 44.7ом и да форум: не является  тех.поддержкой клиентов СЦ по ремонту быт.техники
    • Приветствую! Приобрел недавно наушники Sennheiser HD 660S для целей использования в прожект-студии звукозаписи в качестве контрольных. В качестве источника имеется звуковая карта M-Audio Fast Track Ultra - это довольно уже старый девайс, разработанный Avid (авторы DAW ProTools) и выпущенная под маркой М-Audio. Если верить сторонним тестам, карта довольно неплохая по уровню (понятно, что не топ, но тем не менее). Внутрянка, если будет интерес, показана здесь: https://www.youtube.com/watch?v=69juNIZaTKQ Помимо наушников используются также и студийные мониторы, но речь сейчас не о них. Дело в том, что мысли приобрести более качественный ЦАП/усилитель наушников, само-собой есть. Особенно на фоне того, что раскачки данных наушников не всегда хватает, ее вполне достаточно для записей мастер-уровня, но для работы в процессе тиховато-слабовато. Рассматриваю, как вариант Fiio K9 PRO. Насколько есть информация, M-Audio построена на ЦАП AK4384 и на борту для ушей используются усилители NJM4556. В Fiio, соответственно, это AK4499EQ и THX AAA 788+ Посему вопрос: насколько будет существенна разница в качестве звука при подобном апгрейде, есть ли смысл заморачиваться? Понятно, что проще всего послушать, но возможности в наших краях категорически нет. Может у кого-то был опыт сравнения нечто подобного. Стоит ли ожидать сколь-нибудь существенной прибавки от подобного апгрейда или закатать обратно губу и успокоиться?
    • В основном, - да, смешно. Но вот этот вариант по-моему вообще великолепен. Если уж носки в сапог уедут...
    • +I x +U = +P   и -I x -U = +P  - так что ... нет аномалии - и нобелевка не светит (

  • Модуль усилителя звука PAM8403

  • 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...