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

ADC Triple Mode + DMA + TIM

Добрый день! Создал проект в кубе, в котором хочу реализовать измерение АЦП в режиме Triple Mode по таймеру (триггеру) с DMA. Может кто-то работал с похожей задачей? Одиночный АЦП нормально работает по таймеру с DMA. Включение же АЦП в режиме Triple Mode с DMA с помощью функции HAL_ADCEx_MultiModeStart_DMA не работает, не идёт запись по DMA данных в заданный массив из регистров АЦП (в регистрах АЦП (DR) значения есть) + АЦП срабатывают только один раз, далее не работают, но счётчик продолжает считать.
P.S. Я в этом деле человек относительно новый и хотел бы уточнить правильно ли я понимаю сам процесс работы такой связки АЦП + DMA + TIM, в данном случае это DMA контроллер срабатывает по триггеру с таймера (хотя он является триггером для АЦП?) и в свою очередь запускает АЦП или нет?
Спасибо за ответы!
Привожу скриншоты своего проекта в кубе + кусочек кода из main();
P.S.2
1 Прерывания АЦП и таймера выключены
2 В настройках АЦП2 куб почему то дублирует два ранга, всякие попытки изменить число каналов ни к чему ни привели, он всё равно дублирует два ранга, не знаю баг это или нет.














А так я запускаю АЦП в режиме Triiple Mode
Код
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
volatile uint16_t ADC_buffer[9];
/* USER CODE END PV */
HAL_TIM_Base_Start(&htim3);
HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t*)&ADC_buffer, 3);


Изменено пользователем Connor

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


Ссылка на сообщение
Поделиться на другие сайты
Помнится, что сначала надо ведомый запустить. Точно не помню дома.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Tanya @ Jan 3 2018, 01:18) <{POST_SNAPBACK}>
Помнится, что сначала надо ведомый запустить. Точно не помню дома.

Я читал Вашу тему, Вы отвечали одному человеку по вопросу Dual Mode, я пробовал запускать вначале третий АЦП и вроде второй тоже, не получилось и вопрос как к такому решению пришли? Где-то в документации или опытным путём? Просто в документации я такого не нашёл

Теперь я осознал глубинный смысл включения ведомых АЦП
Нашёл на гитхабе такой код, переделал со своими хэндлерами и всё заработало, действительно надо было включить вначале оба АЦП, которые работают в slave режиме
Код
/*##-8- Start ADC3 conversion process ######################################*/
  if(HAL_ADC_Start(&AdcHandle3) != HAL_OK)
  {
    /* Start Error */
    Error_Handler();
  }
  
  /*##-9- Start ADC2 conversion process ######################################*/
  if(HAL_ADC_Start(&AdcHandle2) != HAL_OK)
  {
    /* Start Error */
    Error_Handler();
  }
  
  /*##-10- Start ADC1 conversion process and enable DMA #######################*/  
  if(HAL_ADCEx_MultiModeStart_DMA(&AdcHandle1, (uint32_t*)aADCTripleConvertedValue, 3) != HAL_OK)
  {
    /* Start Error */
    Error_Handler();
  }

Другое дело что значения теперь записываются в первые три ячейки массива, а не в девять, как я предполагал (первые три для первых каналов АЦП1-3, вторые три для вторых каналов АЦП1-3, последние для третьих каналов АЦП1-3). И дело в том что включен режим scan mode, и получается, что по идее значения в первых трёх ячейках массива должны меняться местами (как меняются местами каналы АЦП), но такого не происходит
Дополнено: Сейчас в первые три ячейки массива записываются только данные с третьего АЦП (т.е канал 3, 1, 2), почему так???


После бесконечных минут ко мне явилось озарение, луч света ударил мне прямо в лицо и я услышал "Что ты творишь, ирод?! HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t*)&ADC_buffer, 3); Три, Карл, три!"
Вот поэтому и считает три канала, а надо записать 9
Изменено пользователем Connor

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


Ссылка на сообщение
Поделиться на другие сайты
Нет, про предварительный запуск ведомого я не открыла, а прочла.

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


Ссылка на сообщение
Поделиться на другие сайты
Всё же не подскажете где Вы это прочли? Я уже обкурился мануалами, и нигде не видел, чтобы было написано запустить слэйв АЦП вначале, в том же HAL_drivers_STM32F4, так вообще про это ни слова

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Connor @ Jan 4 2018, 17:32) <{POST_SNAPBACK}>
Всё же не подскажете где Вы это прочли? Я уже обкурился мануалами, и нигде не видел, чтобы было написано запустить слэйв АЦП вначале, в том же HAL_drivers_STM32F4, так вообще про это ни слова

В документе RM0090 на странице 429 (описание общих регистров АЦП) есть фраза:
Note: In multi mode, a change of channel configuration generates an abort that can cause a
loss of synchronization. It is recommended to disable the multi ADC mode before any
configuration change.
На мой взгляд это однозначно говорит о том, что прежде чем включать любой мульти-режим, нужно сначала настроить отдельные АЦП.
И не важно master или slave.
Я эти режимы использовал, поэтому могу подтвердить, что при включении АЦП нужно действовать именно так, а при отключении в обратном порядке.
А документы, что Вы приводите в качестве примера ("HAL_drivers_STM32F4"), вряд ли могут относится к документации на МК.
Ведь эти прослойки между пользователем и МК пишутся в первую очередь для неспециалистов.
А такие люди не используют специфичные режимы, как dual или triple mode. И есть очень большая вероятность, что в HAL такие режимы не тестировались на достаточном уровне.
Шаг вправо или влево от рекомендованных примеров, и у Вас уже ничего не работает.
Рано или поздно придётся читать первоисточники. Лучше раньше, меньше времени потратите бесцельно.
Изменено пользователем amiller

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(amiller @ Jan 4 2018, 23:15) <{POST_SNAPBACK}>
В документе RM0090 на странице 429 (описание общих регистров АЦП) есть фраза:
Note: In multi mode, a change of channel configuration generates an abort that can cause a
loss of synchronization. It is recommended to disable the multi ADC mode before any
configuration change.
На мой взгляд это однозначно говорит о том, что прежде чем включать любой мульти-режим, нужно сначала настроить отдельные АЦП.
И не важно master или slave.
Я эти режимы использовал, поэтому могу подтвердить, что при включении АЦП нужно действовать именно так, а при отключении в обратном порядке.
А документы, что Вы приводите в качестве примера ("HAL_drivers_STM32F4"), вряд ли могут относится к документации на МК.
Ведь эти прослойки между пользователем и МК пишутся в первую очередь для неспециалистов.
А такие люди не используют специфичные режимы, как dual или triple mode. И есть очень большая вероятность, что в HAL такие режимы не тестировались на достаточном уровне.
Шаг вправо или влево от рекомендованных примеров, и у Вас уже ничего не работает.
Рано или поздно придётся читать первоисточники. Лучше раньше, меньше времени потратите бесцельно.

Спасибо! Но всё же не понятно, настройка-настройкой, а функции, которые включают АЦП (в моём случае это HAL_ADC_Start()) сами АЦП не инициализируют, а всего лишь выставляют пару бит, которые включают и запускают режим преобразования.
Изменено пользователем Connor

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Connor @ Jan 5 2018, 09:25) <{POST_SNAPBACK}>
Спасибо! Но всё же не понятно, настройка-настройкой, а функции, которые включают АЦП (в моём случае это HAL_ADC_Start()) сами АЦП не инициализируют, а всего лишь выставляют пару бит, которые включают и запускают режим преобразования.

Смотрите, что конкретно делают эти функции и как это соотносится с теорией.
dual and triple mode целесообразно рассматривать только с внешней синхронизацией на достаточно высокой частоте, например от таймера. Иначе вообще зачем использовать этот режим?
Поэтому запуск преобразования должен происходить не по команде, а автоматически. А для этого нужны соответствующие настройки.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация