Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: АЦП в xmegaA
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
_Артём_
Задача такая нужно оцифровывать все каналы АЦП А и B поочереди, например сначала каналы 0-3, затем 4-7 и так по циклу. Очевидный вариант: по прерыванию АПЦ считывать значения, устанавливать новые значения MUX и запуск след. преобразования.
Какие есть способы сделать оцифровку, минимально используя процессор? Можно как-то задействовать ДМА или систему событий и разгрузить ЦПУ? Или такой возможности нет.
Спасибо.
bob1
Через прерывания нерационально!!! ДЛя одного канала АЦП делал так. Все работает в режиме IDle.
1. Счетчик через систему событий запускает Каналы 0-3 Ацп.
2. DMA настраиваем на передачу по 8 бит в ОЗУ(RAM) по команде от 3 или 2 канала АЦП.
По аналогии можно думаю сделать и для двух АЦП.
Успехов!!


_Артём_
Цитата(bob1 @ Feb 2 2012, 13:18) *
Через прерывания нерационально!!!

Конечно нерационально, потому и спрашиваю.

Цитата(bob1 @ Feb 2 2012, 13:18) *
1. Счетчик через систему событий запускает Каналы 0-3 Ацп.
2. DMA настраиваем на передачу по 8 бит в ОЗУ(RAM) по команде от 3 или 2 канала АЦП.
По аналогии можно думаю сделать и для двух АЦП.


Проблема в том как загрузить в MUX другое значение. И возможно ли это.
Kovrov
Может поможет...
недавно у себя делал так...
дма работает на буфер передача 128+ N преобразований
по прерыванию с дма обрабатываю массив полученных данных
переключаю мукс на другой канал...
Феничка в том , что не заморачиваюсь с косячными преобразованиями при переключениями мультиплексора АЦП - просто пропускаю эти N преобразований в начале буфера и работаю только с актуальными данными.. (обычно N при F=32 мгц и Fadc = F/64 это 4- подбиралось опытным путем)
_Артём_
Цитата(Kovrov @ Feb 2 2012, 19:12) *
дма работает на буфер передача 128+ N преобразований
по прерыванию с дма обрабатываю массив полученных данных
переключаю мукс на другой канал...

массив 128*sizeof(unsigned short)? Много занимает, однако.

Цитата(Kovrov @ Feb 2 2012, 19:12) *
переключаю мукс на другой канал...

То есть переключать можно только вручную (периферия не может переключить)?
Это и плохо...

Цитата(Kovrov @ Feb 2 2012, 19:12) *
Феничка в том , что не заморачиваюсь с косячными преобразованиями при переключениями мультиплексора АЦП - просто пропускаю эти N преобразований

А они косячные? Незаметил.
Что у вас в качестве опоры? И какой разброс в результатах преобразования.
Сколько виртуальных каналов используете?

V_G
Читайте мануал.
В версии мануала от 12/09 на с 299 (п.25.9.6) - пример работы 4 каналов в free running mode без всяких прерываний, просто достаете измеренные значения из памяти нужных каналов
Другой вариант - п. 25.16.4 - настройка регистра EVCTRL на Sweep Channels - изучите и этот вариант ( не пробовал, но вроде должно отвечать вашим потребностям)
_Артём_
Цитата(V_G @ Feb 3 2012, 04:52) *
Читайте мануал.
В версии мануала от 12/09 на с 299 (п.25.9.6) - пример работы 4 каналов в free running mode без всяких прерываний, просто достаете измеренные значения из памяти нужных каналов
Другой вариант - п. 25.16.4 - настройка регистра EVCTRL на Sweep Channels - изучите и этот вариант ( не пробовал, но вроде должно отвечать вашим потребностям)

free running mode недостаточно - нужно ещё MUX перегружать, и тут я не виду средств как это может быть сделано.

Цитата(V_G @ Feb 3 2012, 04:52) *
Другой вариант - п. 25.16.4 - настройка регистра EVCTRL на Sweep Channels - изучите и этот вариант ( не пробовал, но вроде должно отвечать вашим потребностям)


Посмотрю. Спасибо, вдруг - оно.
bob1
В MUX можете также грузить посредством DMA из оперативки. Кто мешает?!!??!!
Прога критична по времени?? Может можно обойтись 1 каналом!!
_Артём_
Цитата(bob1 @ Feb 3 2012, 17:32) *
В MUX можете также грузить посредством DMA из оперативки.

Как?
Буду искать...

Цитата(bob1 @ Feb 3 2012, 17:32) *
Кто мешает?!!??!!

Нужно грузить не просто MUX, а четыре MUX.

Цитата(bob1 @ Feb 3 2012, 17:32) *
Прога критична по времени??

Критична - много команд получается.

Цитата(bob1 @ Feb 3 2012, 17:32) *
Может можно обойтись 1 каналом!!

Тогда уже некритична, но результат медленный (не удовлетворяет TЗ)

Цитата(bob1 @ Feb 3 2012, 17:32) *
Может можно обойтись 1 каналом!!

Давайте может тогда на бейсике писать будем, получим 1 8-битный отсчёт в секунду и хватит?
Зачем тогда 12-бит АЦП с четерьмя параллельными каналами?
bob1
Было проще общаться было бы тех задание или хотя бы скорость опроса !!???
Насчет MUx погорячился!! Адреса регистров 4 MUX идут не один за другим и продеться использовать 4 канала DMA.
Если использовать 1 канал АЦП, то MUX этого канала можно изменить.( совпадение (переполнение) в счетчике через канал событий инициирует передачу через DMA из ячеек RAM в 1 регистр MUX).
_Артём_
Цитата(bob1 @ Feb 3 2012, 20:01) *
Было проще общаться было бы тех задание или хотя бы скорость опроса !!???

Вродь в первом посте ТЗ.
Скорость оцифровки 16-20 кГц.
Ещё можно тут посмотреть (тема по сути таже): АЦП?С++


Цитата(bob1 @ Feb 3 2012, 20:01) *
Насчет MUx погорячился!!

Похоже на то.

Цитата(bob1 @ Feb 3 2012, 20:01) *
Адреса регистров 4 MUX идут не один за другим и продеться использовать 4 канала DMA.

Так ДМА не напасёшься (хотя и не исплользую из, но жалко отдавать сразу все).

Цитата(bob1 @ Feb 3 2012, 20:01) *
Если использовать 1 канал АЦП, то MUX этого канала можно изменить.( совпадение (переполнение) в счетчике через канал событий инициирует передачу через DMA из ячеек RAM в 1 регистр MUX).

Интересно.
А запуск следущего кто сделает и результат считает?

bob1
Скорость небольшая!!
1 канал DMa настраиваем на запуск скажем от переполнения счетчика. Он будет передавать по 2 байта из RAM сначала в регистр MUX и потом регистр CTRL и тем самым запустит начало преобразования. В RAM лежат 16 байт. Это 8 значений для MUX и 8 значений для регистра CTRL. Их положить через один. По передачи 16 байт сделать , чтобы адрес принял начальное значение. Счетчик каждый раз переполняясь запустит DMA, а тот по очереди АЦП для 8 разных выводов.
2 канал DMA настраиваем на запуск от АЦП канал СH0. Канал DMA будет передавать значения АЦП( по 2байта) в RAM.
_Артём_
Цитата(bob1 @ Feb 3 2012, 21:30) *
Скорость небольшая!!


Ничего себе небольшая: если программно делать, то загрузка меги 20-30 % на 29,5 МГц.


Цитата(bob1 @ Feb 3 2012, 21:30) *
1 канал DMa настраиваем на запуск скажем от переполнения счетчика. Он будет передавать по 2 байта из RAM сначала в регистр MUX и потом регистр CTRL и тем самым запустит начало преобразования. В RAM лежат 16 байт. Это 8 значений для MUX и 8 значений для регистра CTRL. Их положить через один. По передачи 16 байт сделать , чтобы адрес принял начальное значение. Счетчик каждый раз переполняясь запустит DMA, а тот по очереди АЦП для 8 разных выводов.
2 канал DMA настраиваем на запуск от АЦП канал СH0. Канал DMA будет передавать значения АЦП( по 2байта) в RAM.

Но используется 1 виртуальный канал? 8 отсчётов за раз не получим?
Только если все ДМА на это дело израсходовать.
И то не уверен что получится...сложно как то...
V_G
Цитата(_Артём_ @ Feb 4 2012, 00:38) *
free running mode недостаточно - нужно ещё MUX перегружать, и тут я не виду средств как это может быть сделано.

Еще раз настаиваю на вдумчивом чтении мануала, в частности, п. 25.4 ADC Сhannels. Каждый канал - это сочетание состояния MUX и ячеек результата. Таким образом, переключение каналов - это и переключение MUX. А если вы все 4 канала запускаете во free running mode, они постоянно обновляют свои ячейки результата, переключая за вас MUX. Отказываться от free running mode имеет смысл только в том случае, если вы хотите четкую временную привязку результатов измерений (например, для оцифровки и последующей цифровой фильтрации)
bob1
Цитата(_Артём_ @ Feb 4 2012, 01:37) *
Ничего себе небольшая: если программно делать, то загрузка меги 20-30 % на 29,5 МГц.
Но используется 1 виртуальный канал? 8 отсчётов за раз не получим?
Только если все ДМА на это дело израсходовать.
И то не уверен что получится...сложно как то...

8 отчетов за раз не получим. Опрос 8 выводов по кругу.
С 4 каналами можно получить скорость оцифровки 500кГц. У Вас на порядок меньше!!!
По поводу DMA --второй канал ( результат перекидывающий в RAM)можете не использовать. Программно считывать значения и обрабатывать их.
Итого получаем затраты 2 канала DMA на каждый АЦП (А и В) , 1 счетчик.
Что за виртуальный канал??


Цитата(V_G @ Feb 4 2012, 07:29) *
Еще раз настаиваю на вдумчивом чтении мануала, в частности, п. 25.4 ADC Сhannels. Каждый канал - это сочетание состояния MUX и ячеек результата. Таким образом, переключение каналов - это и переключение MUX. А если вы все 4 канала запускаете во free running mode, они постоянно обновляют свои ячейки результата, переключая за вас MUX. Отказываться от free running mode имеет смысл только в том случае, если вы хотите четкую временную привязку результатов измерений (например, для оцифровки и последующей цифровой фильтрации)

Так канала 4 и 4 MUX , а снимать результат нужно с 8 выводов. Переключать 1 раз MUX для каждого канала все равно надо.!!!
V_G
Цитата(bob1 @ Feb 4 2012, 17:27) *
Так канала 4 и 4 MUX , а снимать результат нужно с 8 выводов. Переключать 1 раз MUX для каждого канала все равно надо.!!!

Это уже следующий уровень после того, как врубишься в работу pipeline ADC. MUX вручную (или через DMA, можно еще поковыряться в мануале) при этом требуется менять в 4 раза реже, причем на каждый канал нужно иметь только 2 настройки MUX. Запустил сразу 4 канала на единичное преобразование, после получения результата поменял настройки всех каналов, и следующие 4 входа снова обрабатываешь параллельно.
bob1
Цитата(V_G @ Feb 4 2012, 14:07) *
Это уже следующий уровень после того, как врубишься в работу pipeline ADC. MUX вручную (или через DMA, можно еще поковыряться в мануале) при этом требуется менять в 4 раза реже, причем на каждый канал нужно иметь только 2 настройки MUX. Запустил сразу 4 канала на единичное преобразование, после получения результата поменял настройки всех каналов, и следующие 4 входа снова обрабатываешь параллельно.

Не пробовали подключить 4 канала к одному выводу ???!! Результат получается разный. Разница в 3-4 единички последнего разряда.!!!! Если конечно потом охота калибровать каждый канал.......
_Артём_
Цитата(bob1 @ Feb 4 2012, 18:54) *
Не пробовали подключить 4 канала к одному выводу ???!! Результат получается разный. Разница в 3-4 единички последнего разряда.!!!! Если конечно потом охота калибровать каждый канал.......


А что это может дать?

Цитата(bob1 @ Feb 4 2012, 18:54) *
Разница в 3-4 единички последнего разряда.!!!!


У меня разброс результата гораздо больше.
Какие у вас настройки предделителя и опоры?


Цитата(V_G @ Feb 4 2012, 04:29) *
Еще раз настаиваю на вдумчивом чтении мануала, в частности, п. 25.4 ADC Сhannels.

С этим согласен...

Цитата(V_G @ Feb 4 2012, 04:29) *
Каждый канал - это сочетание состояния MUX и ячеек результата. Таким образом, переключение каналов - это и переключение MUX.


Не понял...поясните

Цитата(V_G @ Feb 4 2012, 04:29) *
А если вы все 4 канала запускаете во free running mode, они постоянно обновляют свои ячейки результата, переключая за вас MUX.

Обновляют результат - согласен.
Переключают MUX - каким образом?

Цитата(V_G @ Feb 4 2012, 04:29) *
Отказываться от free running mode имеет смысл только в том случае, если вы хотите четкую временную привязку результатов измерений (например, для оцифровки и последующей цифровой фильтрации)

Абсолютная точность (до такта) не нужна, допустимо +-5 мкс.
bob1
Цитата(_Артём_ @ Feb 5 2012, 00:51) *
А что это может дать?
У меня разброс результата гораздо больше.
Какие у вас настройки предделителя и опоры?

Это я к тому, что 4 разных канала одного АЦП оцифровывают одно и тоже напряжение по разному!!!! Это дополнительная погрешность! На мой взгляд целесообразнее в вашем случае использовать 1 канал!!
Разброс 3-4 ед. получен в режиме Idle . Внутр.опора 1В. Частота тактирования Ацп 500кГц.
Поэтому и предложил накопить результат в RAM (контроллер при ацп будет в режиме idle) , а потом обработать его.
Цитата(_Артём_ @ Feb 5 2012, 00:51) *
Обновляют результат - согласен.
Переключают MUX - каким образом?

Программно. Измерили 4 вывода. Поменяли разряды MUX. Потом опять измерили.
В этом варианте при измерениях контроллер тоже можно загнать в режим IDLE.
_Артём_
Цитата(bob1 @ Feb 4 2012, 22:51) *
Это я к тому, что 4 разных канала одного АЦП оцифровывают одно и тоже напряжение по разному!!!! Это дополнительная погрешность!

Ну АЦП меги шумит, что делать.
3-4 единицы - это ерунда (у меня был разброс 50 (непомню от какой опоры), и ~30 от опоры на внешнем порту). Видимо очень ранняя ревизия кристала.
Idle как-то не хочется, так как задача далеко не единственная.

Цитата(bob1 @ Feb 4 2012, 22:51) *
Измерили 4 вывода. Поменяли разряды MUX.

Меняете с частотой 500кГц/4?


Цитата(bob1 @ Feb 4 2012, 22:51) *
В этом варианте при измерениях контроллер тоже можно загнать в режим IDLE.

Idle сильно точность повышает?


V_G
Цитата(bob1 @ Feb 5 2012, 02:54) *
Не пробовали подключить 4 канала к одному выводу ???!! Результат получается разный. Разница в 3-4 единички последнего разряда.!!!! Если конечно потом охота калибровать каждый канал.......

Тут много доп. вводных, в частности, скорость изменения входного сигнала, оцифровка-то ведь все равно последовательная! Плюс выбор тактовой АЦП. Плюс особые требования к разводке платы для 12-разрядного АЦП. Ну а уж потом - глюки АЦП.
Кстати, 3-4 единички в 12-разрядном АЦП - это стояние колом на стандартном 10-разрядном!
bob1
Цитата(_Артём_ @ Feb 5 2012, 03:15) *
Меняете с частотой 500кГц/4?
Idle сильно точность повышает?

Делим на 8. Через 8 тактов в АЦП результат получается. Менять раньше MUX наверно тоже можно. Напряжение должно захлопнуться на внутреннем конденсаторе. Тут надо в железе попробовать....
Точность в разных режимах не проверял. Нужно было оцифровать 1 сигнал. Меня не устроил результат полученный внутренним АЦП. Поставил внешнее!!!
Цитата(V_G @ Feb 5 2012, 04:15) *
Тут много доп. вводных, в частности, скорость изменения входного сигнала, оцифровка-то ведь все равно последовательная! Плюс выбор тактовой АЦП. Плюс особые требования к разводке платы для 12-разрядного АЦП. Ну а уж потом - глюки АЦП.
Кстати, 3-4 единички в 12-разрядном АЦП - это стояние колом на стандартном 10-разрядном!

Тактовая 500кГц. Пробовал еще уменьшать. Лучше не стало. Напряжение постоянное пробовал. RC цепочка почти на выводах АЦП.
_Артём_
Цитата(bob1 @ Feb 5 2012, 00:34) *
Менять раньше MUX наверно тоже можно.

Менять до завершения преобразования?

Цитата(bob1 @ Feb 5 2012, 00:34) *
Точность в разных режимах не проверял. Нужно было оцифровать 1 сигнал. Меня не устроил результат полученный внутренним АЦП. Поставил внешнее!!!

У меня получалось что нормальные результаты получались при делителе начиная от 32-64, до этого чёрти что.

Цитата(bob1 @ Feb 5 2012, 00:34) *
Тактовая 500кГц.

500кГц - тактирование ядра?
bob1
Цитата(_Артём_ @ Feb 5 2012, 05:02) *
Менять до завершения преобразования?
500кГц - тактирование ядра?

Да.
500кГц тактирование АЦП.
V_G
Цитата(_Артём_ @ Feb 5 2012, 09:02) *
Менять до завершения преобразования?

По-моему, MUX менять можно было произвольно даже в прежних мегах. Просто если в момент смены шло преобразование, оно завершалось со старым MUX, после чего новые настройки вступали в силу
_Артём_
Можно ли так задействовоть ДМА:
по завершению преобразования грузить из ОЗУ новые настройки (MUX и другие) из двух блоков поочерёдно в от CH0.CTRL до CH3.INTFLAGS.
Но непонятно как xmega отреагирует на запись в нереализованные ячейки (от адреса CHn.RESH+1 до CH(n+1).CTRL). Допустимо ли так делать?

Или есть другие варианты перезагрузки MUX, не задействующие процессор?
_Артём_
Цитата(_Артём_ @ Feb 12 2012, 16:33) *
Можно ли так задействовоть ДМА:
по завершению преобразования грузить из ОЗУ новые настройки (MUX и другие) из двух блоков поочерёдно в от CH0.CTRL до CH3.INTFLAGS.

Задействовать можно.
Но по завершению каждого блока генерится прерывание. Можно ли настроить так, чтобы прерывание генерировались после заданного числа циклов перезагрузки настроек каналов АЦП?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.