Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 6
1

Порядок оцифровки групп регулярных каналов АЦП в режиме dual mode

20.04.2019, 15:49. Просмотров 788. Ответов 7
Метки нет (Все метки)

Ситуация... моделирую на плате stm32f103c8t6 режим АЦП dual regular simultaneous only. Настроил четыре канала (два для каждого АЦП):

АЦП1 АЦП2
IN1 Rank 1 IN2 Rank 2
IN3 Rank 2 IN4 Rank 1

оцифрованные значения получаю в прерывании от DMA по переполнению массива под все четыре канала. Всё работает корректно: в массив первыми заносятся значения каналов IN1 и IN2, затем IN3 и IN4. Однако, если работать с шестью каналами:

АЦП1 АЦП2
IN1 Rank 1 IN2 Rank 3
IN3 Rank 2 IN4 Rank 2
IN5 Rank 3 IN6 Rank 1

то происходит следующее: порядок оцифровки принимает непонятный для меня порядок IN5, IN4, IN1, IN2, IN3, IN6.
Т.е. фактически IN5 "толкает на преобразование IN4", а IN3 - IN6. И это не смотря на ранги каналов.
Пробовал настроить восемь каналов аналогичным образом - ситуация похожая, опрос каналов не соответствует настройкам рангов.
Повторюсь, что в случае четырёх каналов всё работает нормально.

Для настройки использую CubeMX, проекты создавались по десятку раз, пробовал менять настройки рангов. Никакой вариант не позволил получить порядок оцифровки соответствующий рангам. Нет проблемы, чтобы работать и так (экспериментально определить порядок оцифровки каналов и схему соответственно разрабатывать с учётом этого), но вопрос интересный и разобраться не могу уже две недели. Может кто-нибудь может объяснить от чего зависит порядок оцифровки в этом режиме. И как получить следующий порядок:
IN1 - IN2, IN3 - IN4, IN5 - IN6, IN7 - IN8?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.04.2019, 15:49
Ответы с готовыми решениями:

Discontinuous mode в dual режиме АЦП STM32
Здравствуйте! начинаю изучать программирование мк stm32 на базе китайской платки с контроллером...

Опрос нескольких регулярных каналов АЦП STM32F100
Всем привет! Проблема с опросом нескольких регулярных каналов АЦП STM32F100 (Отл плата STM32F100VL...

АЦП в Auto Trigger mode от таймера в CTC mode (atmega644)
Задача: прочитать данные с АЦП когда счетчик таймера совпадет со значением в регистре сравнения....

STM32F407IE, внешний АЦП отрабатывает 72 цикла оцифровки и останавливается)
Дратути) Была плата с STM32F407IET6 и внешним АЦП ADS8411, который по таймеру с частотой 200кГц...

7
108 / 80 / 15
Регистрация: 15.11.2012
Сообщений: 549
21.04.2019, 00:35 2
А что такое ранги каналов?
0
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 6
21.04.2019, 00:53  [ТС] 3
В этом режиме (dual regular simultaneous only) одновременно опрашиваются два канала, один настроен на оцифровку первым АЦП, другой - вторым АЦП. Например, IN0 - АЦП1, IN1 - АЦП2. В данном случае (когда используется по одному каналу на каждом АЦП) ранги и не нужны. А вот, если каналов больше, то можно указать с какого начинать преобразование. Например, в случае с четырьмя каналами Rank 1 для первого АЦП будет оцифрован первым. Для второго АЦП, наверное, наоборот: у Rank 2 приоритет выше. По крайней мере экспериментально проверено, что такой вариант работает по задуманной логике. А вот в случае с 6, 8 каналами эта логика не работает)
Появились некоторые мысли. Может нужно на втором АЦП выставить настройки рангов симметрично первому АЦП, не обращать внимание, что вроде как четыре канала работают. Такого я по крайней мере ещё не пробовал.
0
108 / 80 / 15
Регистрация: 15.11.2012
Сообщений: 549
21.04.2019, 01:08 4
Я специально просмотрел описание регистров АЦП, думаю может забыл чего... Но никаких рангов там нет.
Это не фича ли куба?
Ранги эти не нужны - порядок каналов задается настройками регистров и может быть любой без всяких рангов.
0
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 6
23.04.2019, 01:12  [ТС] 5
Ну по сути да, куб генерит следующий код для задания порядка оцифровки:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// для АЦП1
 
 sConfig.Channel = ADC_CHANNEL_4;
 sConfig.Rank = ADC_REGULAR_RANK_1; // это и есть настройка порядка опроса в регистре
...
 sConfig.Channel = ADC_CHANNEL_2;
 sConfig.Rank = ADC_REGULAR_RANK_2;
...
 sConfig.Channel = ADC_CHANNEL_0;
 sConfig.Rank = ADC_REGULAR_RANK_3;
 
// для АЦП2
 
 sConfig.Channel = ADC_CHANNEL_1;
 sConfig.Rank = ADC_REGULAR_RANK_1;
...
 sConfig.Channel = ADC_CHANNEL_3;
 sConfig.Rank = ADC_REGULAR_RANK_2;
...
 sConfig.Channel = ADC_CHANNEL_5;
 sConfig.Rank = ADC_REGULAR_RANK_3;
При такой настройке первой оцифровывается пара CHANNEL_0 и CHANNEL_1, что вобщем-то логично и правильно.
А дальше начинается "магия": преобразования по следующему каналу первого АЦП (ADC_CHANNEL_2) не происходит, а второй АЦП оцифровывает CHANNEL_3, при этом его значение оказывается ещё и в последний элементе массива, куда собираются результаты преобразований.
Третье преобразование начинается с ADC_CHANNEL_2, что вообще окончательно ставит меня в тупик; следом за ним снова CHANNEL_3.
Каналы CHANNEL_4 и CHANNEL_5 вообще пропущены... наверное.

Опять же сокращение проекта до четырёх каналов даёт абсолютно рабочий проект с логичным порядком опроса всех каналов.
0
108 / 80 / 15
Регистрация: 15.11.2012
Сообщений: 549
23.04.2019, 01:14 6
Так может ну его, куб этот? Там код для настройки АЦП займет как бы не меньше строк чем для куба.
0
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 6
23.04.2019, 01:56  [ТС] 7
Немного не понял вас: займет не меньше места? )

Вообще говоря, похоже нашел правильную настройку порядка опроса каналов. Но проверить до конца смогу только завтра, нужна заведомо рабочая плата. Есть подозрение, что один из каналов накрылся, да ещё и его вывод коротит на другой канал. А порядок опроса верный.

Только начинаю серьезно с МК работать. Советуете не начинать с куба?
0
108 / 80 / 15
Регистрация: 15.11.2012
Сообщений: 549
23.04.2019, 02:33 8
Ну, места точно меньше -)). Причем проблема не столько в памяти FLASH (ее в контроллерах обычно сравнительно много), сколько в RAM, которой сильно меньше. Но и строк тоже.

В данном случае советую провести инициализацию АЦП посредством регистров этого АЦП, а не процедур куба.

Начинать работать с кубом вообще или нет - я не знаю. Я им не пользуюсь, но это каждый сам решает конечно.
Основной (и как бы ни единственный) аргумент любителей куба - "программы становятся переносимыми между разными линейками контроллеров ST". Что пишут эти любители и зачем им так нужна эта "переносимость", я не знаю. Тем более что писанины куб почти не убавляет.
Однако никакой переносимости там нет и это не может не понимать любой, кто реально поработал с разными линейками их контроллеров, поскольку сама их периферия разная, порой - абсолютно, инициализация и работа этой периферии тоже разная, поэтому никакой куб здесь не поможет.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2019, 02:33

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

АЦП несколько каналов
Нужно замерять сигналы с трех выводов АЦП МК, как это сделать грамотно?

Trace Mode и привязка каналов
задача тривиальная. есть лампочка, которая меняет свой цвет в зависимости от поступающего значения...

Использование нескольких каналов АЦП
Всем привет. Пишу небольшую прогу для ATmega8, и возник вопрос как считывать данные сразу с двух...

Большое количество АЦП каналов
Здравствуйте! Подскажите микроконтроллеры с количеством АЦП 50 или больше каналов. И есть ли...

Переключение каналов АЦП atmega88
Добрый день. В который раз сталкиваюсь с АЦП на меге и никак не могу понять как правильно...

ХР нормально работает в режиме Safe Mode. Почему она виснет в обычым режиме?
ХР нормально работает в режиме Safe Mode. Зачем он виснет в обычым режиме?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.