Connor 0 3 января, 2018 Опубликовано 3 января, 2018 (изменено) · Жалоба Добрый день! Создал проект в кубе, в котором хочу реализовать измерение АЦП в режиме 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); Изменено 3 января, 2018 пользователем Connor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 3 января, 2018 Опубликовано 3 января, 2018 · Жалоба Помнится, что сначала надо ведомый запустить. Точно не помню дома. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Connor 0 3 января, 2018 Опубликовано 3 января, 2018 (изменено) · Жалоба Помнится, что сначала надо ведомый запустить. Точно не помню дома. Я читал Вашу тему, Вы отвечали одному человеку по вопросу 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 Изменено 3 января, 2018 пользователем Connor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 3 января, 2018 Опубликовано 3 января, 2018 · Жалоба Нет, про предварительный запуск ведомого я не открыла, а прочла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Connor 0 4 января, 2018 Опубликовано 4 января, 2018 · Жалоба Всё же не подскажете где Вы это прочли? Я уже обкурился мануалами, и нигде не видел, чтобы было написано запустить слэйв АЦП вначале, в том же HAL_drivers_STM32F4, так вообще про это ни слова Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amiller 2 5 января, 2018 Опубликовано 5 января, 2018 (изменено) · Жалоба Всё же не подскажете где Вы это прочли? Я уже обкурился мануалами, и нигде не видел, чтобы было написано запустить слэйв АЦП вначале, в том же 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 такие режимы не тестировались на достаточном уровне. Шаг вправо или влево от рекомендованных примеров, и у Вас уже ничего не работает. Рано или поздно придётся читать первоисточники. Лучше раньше, меньше времени потратите бесцельно. Изменено 5 января, 2018 пользователем amiller Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Connor 0 5 января, 2018 Опубликовано 5 января, 2018 (изменено) · Жалоба В документе 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()) сами АЦП не инициализируют, а всего лишь выставляют пару бит, которые включают и запускают режим преобразования. Изменено 5 января, 2018 пользователем Connor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amiller 2 5 января, 2018 Опубликовано 5 января, 2018 · Жалоба Спасибо! Но всё же не понятно, настройка-настройкой, а функции, которые включают АЦП (в моём случае это HAL_ADC_Start()) сами АЦП не инициализируют, а всего лишь выставляют пару бит, которые включают и запускают режим преобразования. Смотрите, что конкретно делают эти функции и как это соотносится с теорией. dual and triple mode целесообразно рассматривать только с внешней синхронизацией на достаточно высокой частоте, например от таймера. Иначе вообще зачем использовать этот режим? Поэтому запуск преобразования должен происходить не по команде, а автоматически. А для этого нужны соответствующие настройки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться