реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> АЦП и энергопотребление
data_stack
сообщение Dec 1 2015, 13:55
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-10-15
Пользователь №: 88 891



Есть необходимость оцифровывать несколько сигналов, с разной частотой (2кГц, 256Гц, 16Гц) и разной разрядностью (8-12бит) и скидывать все это дело на карту памяти. Все это усложняется батарейным питанием. Как лучше поступить?

1. Вариант, запускать преобразование по таймеру, с самой большой частотой дискретизации, с максимальной разрядностью, по окончанию преобразования забирать через DMA. По заполнению буфера DMA, выдаст прерывание, после него заполнять другой буфер, а за это время разгребать то что накопилось. Чем нравится решение, тем что, наверное, будет время для сна. Чем не нравится - не гибко, это будет огромный массив, в который будут свалены все данные скопом. Придется вычленять нужные данные, преобразовывать их битность, затем распихивать по мелким массивам, чтобы отсортировать, затем снова правильно раскладывать.

2. Вариант постоянно преобразовывать значения АЦП и сразу складывать их через DMA в массив. Запускать таймер с частотой 2кГц, в прерывании забирать только нужные значения, сразу же преобразовывать и аккуратно складывать. Чем нравится, удобно, займет меньше места в оперативе. Чем не нравится, не понятно что получится с энергопотреблением, думаю что оно вырастет, этого не хотелось бы.

Еще вопрос: как лучше делать с т.з энергопотребления - копить большой буфер и скидывать на карту большим куском, или мелкими порциями
Go to the top of the page
 
+Quote Post
AlanDrakes
сообщение Dec 1 2015, 14:45
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474



Как понимаю, использовать собираетесь что-то из STM32?
Если применить STM32L - то можно запускать ADC по таймеру, заранее выставив биты пониженного потребления. В таком случае - ADC запускается таймером, включается, инициализируется, проводит оцифровку и сбрасывает данные по DMA в участок памяти.
На DMA потребуется настроить прерывания по половинному заполнению буфера и окончанию буфера.
Просыпаться, соответственно, два раза за буфер.
Оцифровывать можно с изначально известной частотой дискретизации. Причём, чем ниже частота выборки, тем больше времени будет контроллер находиться в состоянии сна при одинаковом размере буфера.
Опять же, при оцифровке с достаточно большой частотой сэмплирования (более 100kSa/s) выигрыша Вы уже не получите.
Хотя, для 16Гц (Sa/s?) можно проводить во сне более 99.5% времени.

Вариант с большми буфером для медленного заполнения (как у вас) будет наилучшим.
Go to the top of the page
 
+Quote Post
data_stack
сообщение Dec 1 2015, 15:02
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-10-15
Пользователь №: 88 891



Видимо не очевидно проблему описал. Использовать буду STM32L1, вы как раз описали первый случай, еще раз попытаюсь объяснить чем он мне не нравится, частота дискретизации будет 2кГц, ибо АЦП придется настраивать по максимальной частоте. Получится что все каналы будут оцифровываться с частотой 2кГц и 16бит. У меня 10 каналов. 2000*2*10 = 40кБ за секунду, вместо 5кБ планируемых. Даже если забирать буфер раз в 1/16 сек, это будет 2.5кБ вместо 312байт, которые нужно еще отсортировать и преобразовать. Поэтому я задумался, не проще ли копировать только в нужные моменты в прерывании и преобразовывать на ходу?

Сообщение отредактировал IgorKossak - Dec 1 2015, 22:25
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 1 2015, 16:39
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(data_stack @ Dec 1 2015, 18:02) *
не проще ли копировать только в нужные моменты в прерывании и преобразовывать на ходу?
Напишите оба варианта. Сравните размер получившегося кода. Прикиньте проигрыш по потреблению на исполнение этого лишнего кода. Я тоже за первый вариант - пробежаться по массиву с фиксированным шагом гораздо проще, чем обрабатывать кучу счетчиков в прерывании. Могу предложить улучшение - выборки частотой 256 и 16 Гц делать как инжектированные. Тогда буфер DMA вам нужен будет только для отсчетов частотой 2 кГц.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Alechek
сообщение Dec 2 2015, 06:54
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Не знаю как для STM32L, но я бы сравнил потребление при программной выборке с DMA режимом. При выборке 2 кГц практически 100% времени DMA будет в режиме ожидания. Но даже в этом режиме сколько-то он все равно может кушать.
На никак несберегающем LPC175X DMA оказался настолько жручим, что решил запускать его только тогда, когда действительно надо и после окончания работы сразу выключать (SPI). При поданной на него тактовой 12МГц, даже при неработающих каналах и сброшенном бите ENABLE он потребляет порядка 1мА!
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 2 2015, 10:18
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(data_stack @ Dec 1 2015, 19:55) *
Еще вопрос: как лучше делать с т.з энергопотребления - копить большой буфер и скидывать на карту большим куском, или мелкими порциями

вариант 3:
Имеем большой пустой буфер, есть диаграмма опроса 3-х АЦП каналов (каждый со своей частотой), CPU работает на предельно малой частоте (1МГц или ниже, PLL выкл.),
по диаграмме запускает очередное преобразование для очередного канала (внутри ISR), затем выходит из ISR в фоновый цикл команды WFI, до след. прерывания, в котором считывает полученное значение, записывает в буфер без какой-либо обработки, запускает след. преобразование если буфер ещё не заполнен.
И так - пока не заполнится буфер. По его заполнению включаем PLL, разгоняем CPU, в фоновом процессе обрабатываем накопленный буфер (пакуем, сортируем и т.п.) и пишем на SD. В это время измерительный процесс в ISR
продолжает работать (частота работы АЦП не должна измениться при увеличении тактовой CPU), но пишет во 2-й буфер.
После записи на SD опять понижаем частоту ядра.
Процесс повышения/понижения тактовой частоты должен быть реализован так, чтобы не нарушал временную диаграмму работы процесса чтения АЦП.
DMA здесь не нужен и такой алгоритм работы будет думаю самым экономичным.
Go to the top of the page
 
+Quote Post
data_stack
сообщение Dec 2 2015, 11:58
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-10-15
Пользователь №: 88 891



Была и такая мысля. Почему не понравилась. В STM32L1 АЦП тактируется только от HSI. Поэтому HSI будет включен всегда, все остальные шины и так занижены. Включение любого дополнительного источника будет дополнительно жрать энергию. На борту еще периодически включается uart, spi, таймеры, каждый раз их переконфигурить. Может идея и не плоха, но я не решился ее воплощать.

Сообщение отредактировал IgorKossak - Dec 2 2015, 15:36
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
AlanDrakes
сообщение Dec 3 2015, 06:42
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474



Итак, обобщу снова.
- DMA в L1 достаточно экономный.
- Оцифровывать несколько каналов можно в режиме ждущего преобразования (заранее собираете очередь преобразований, а затем запускаете по таймеру).
- DMA будет складывать посылки данных в буфер и по заполнению его на половину контроллер должен проснуться и обработать их первую часть, соответственно, по окончании буфера - вторую.
Потребление... Заранее предупрежу, что пишу на имеющийся лично у меня STM32L152.
RUN @8MHz, VCore = 2 - 2.5mA
SLEEP @8MHz, VCore = 2 - 0.6mA
Переферия:
ADC: 9uA * MHz (8) = 72uA.
GPIOA: 3.5uA * MHz (8) = 28uA.
DMA: 8uA * MHz (8) = 64uA.
ADC (режим преобразования) - 1.45mA
TIM2 (таймер для запуска преобразования) - 8uA * MHz (8) = 64uA.
Итого, ожидаемый ток: 0.6 + (0.072 + 0.028 + 0.064 + 0.064) = 0.828mA в режиме сна.
Считаем ток во время преобразования: Время преобразования на канал (худшее для мультиплексированных): 1uS * 10 каналов + PowerOnTime 3.5uS. Итого - 13.5uS + время преобразования. Обычно 4 + 12 тактов, что при 8 МГц даёт 0.5uS на преобразование. Итого - 13.5 + 4 = 17.5uS.
Частота выборки - 2000Sa/s = 500uS. 17.5 / 500 = 3.5% времени преобразование. В течении этого времени потребление должно возрасти на 1.45mA, плюс-минус 0.1mA.
При размере буфера в 40кБ, он будет заполняться 2 раза в секунду.
Таким образом, нужно будет писать данные на карту памяти те же 2 раза в секунду.

Итого, суммарный ток (не учитывая рабочее время на запись) будет:
0.828 * 0.965 + 1.45 * 0.035 = 0,79902 + 0,05075 = 0,84977
Приблизительно, 0.85mA это только преобразования и складирование их в RAM.
Остальной ток потребления будет зависеть от потребностей карты памяти и быстроты работы кода.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 3 2015, 08:14
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlanDrakes @ Dec 3 2015, 12:42) *
TIM2 (таймер для запуска преобразования) - 8uA * MHz (8) = 64uA.

ТСу вроде как требуется оцифровывать три разных канала, каждый со своей частотой сэмплирования, причём частоты некратны друг другу (и не про какие допустимые погрешности частоты сэмплирования ТС не писал - а значит принимаем что нужно точно 2кГц, 256Гц и 16Гц).
И как Вы собрались запускать эти преобразования одним таймером с разными некратными друг другу частотами без пробуждения CPU и перепрограммирования таймера???
Я конечно не очень хорошо знаю периферию STM32, но сомневаюсь что TIM2 в нём способен формировать события на 3-х разных частотах, суммируя их на выходе в единый поток событий, да ещё переключать каналы АЦП в зависимости от события. sm.gif
Такое умеет делать например АЦП в LPC4370 - ему можно задать довольно произвольную диаграмму работы нескольких каналов АЦП одновременно с разными частотами сэмплирования на связке ADC+DMA без участия CPU.
А вот в STM32L я думаю вряд-ли такое можно сделать не пробуждая ядро. А пробуждая ядро получите потребление близкое к потреблению RUN-моде на 8МГц.

ТС нужно или искать МК, в котором периферия позволяет работать АЦП по нескольким каналам одновременно с разными некратными частотами без участия ядра (например как сделано в LPC4370).
Либо искать МК с более экономичным ядром и работать на нём управляя АЦП программно ядром. Здесь я бы смотрел в сторону MSP430.

Цитата(AlanDrakes @ Dec 3 2015, 12:42) *
0.828 * 0.965 + 1.45 * 0.035 = 0,79902 + 0,05075 = 0,84977

А эти цифры вообще с потолка...
Go to the top of the page
 
+Quote Post
data_stack
сообщение Dec 3 2015, 08:44
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-10-15
Пользователь №: 88 891



Цитата(jcxz @ Dec 3 2015, 09:14) *
Либо искать МК с более экономичным ядром и работать на нём управляя АЦП программно ядром. Здесь я бы смотрел в сторону MSP430.

Судя по даташиту L1 рвет топовые MSP по токопотреблению.

Виноват, не уточнил, если это даст выигрыш по току, то подогнать частоты можно. поэтому наверно логично взять 2048, 256 и 16Гц. Думаю, пока остановлюсь на 1 варианте и как было сказано выше, буду чаще их обрабатывать и скидывать.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 3 2015, 09:07
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(data_stack @ Dec 3 2015, 14:44) *
Виноват, не уточнил, если это даст выигрыш по току, то подогнать частоты можно. поэтому наверно логично взять 2048, 256 и 16Гц. Думаю, пока остановлюсь на 1 варианте и как было сказано выше, буду чаще их обрабатывать и скидывать.

Тогда проще, но всё-равно от одного таймера думаю не получится запускать разные каналы.
Go to the top of the page
 
+Quote Post
data_stack
сообщение Dec 3 2015, 10:12
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-10-15
Пользователь №: 88 891



Вы не внимательно читали мой первый вопрос wink.gif Запускать от одного таймера несколько каналов получается, просто данные будут копироваться с частотой таймера, т.е. 2048 раз в секунду. Весь и вопрос был в том, что оптимальнее, включить несколько таймеров и по ним запускать преобразование, или сортировать большой буфер.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 3 2015, 11:38
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(data_stack @ Dec 3 2015, 16:12) *
Вы не внимательно читали мой первый вопрос wink.gif Запускать от одного таймера несколько каналов получается, просто данные будут копироваться с частотой таймера, т.е. 2048 раз в секунду. Весь и вопрос был в том, что оптимальнее, включить несколько таймеров и по ним запускать преобразование, или сортировать большой буфер.

Я имел в виду - не получится даже на кратных частотах. Придётся всё делать на макс. частоте, а потом прореживать ненужные отсчёты. Не позволяет периферия.
Go to the top of the page
 
+Quote Post
data_stack
сообщение Dec 3 2015, 12:22
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-10-15
Пользователь №: 88 891



Да именно так, вроде так я и писал.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 3 2015, 13:22
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Есть возможность более редкие измерения делать от отдельного таймера как injected, но выгребать их придется в прерывании АЦП (DMA забирать их не умеет).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 3 2015, 14:00
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Если так важно получить минимальное потребление, то может имеет смысл расширить кругозор и рассмотреть разные семейства от разных поизводителей, а не зацикливаться на STM32?
У многих МК есть очень интересные решения для снижения потребления для работы с остановленным ядром.
Например в LPC4370, который сейчас изучаю, интересно реализован АЦП, можно задать произвольную диаграмму работы АЦП вообще без участия ядра до полного заполнения большого буфера. И даже точно выдержать требуемые Вам частоты, а не примерно. Хотя этот МК вряд-ли Вам подойдёт, но есть множество других.
Go to the top of the page
 
+Quote Post
data_stack
сообщение Dec 3 2015, 14:42
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-10-15
Пользователь №: 88 891



Кругозор действительно ограничен, наличие того что есть у местных барыг и сроков. Изначально планировалось использовать msp, который вроде как является лидером в этой области, не нашлось подходящего камня по фаршу, да и как я говорил цифры из даташита говорят о том, что потребление stm32 ниже чем мсп.
Go to the top of the page
 
+Quote Post
AlanDrakes
сообщение Dec 4 2015, 14:13
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474



Цитата(jcxz @ Dec 3 2015, 14:14) *
ТСу вроде как требуется оцифровывать три разных канала, каждый со своей частотой сэмплирования, причём частоты некратны друг другу (и не про какие допустимые погрешности частоты сэмплирования ТС не писал - а значит принимаем что нужно точно 2кГц, 256Гц и 16Гц).

Пардон, мне показалось, что это были режимы.
В таком случае, я бы выбрал сэмплирование на 2048Sa/s и прореживал данные перед записью в буфер карты.

Цитата(jcxz @ Dec 3 2015, 14:14) *
А эти цифры вообще с потолка...

Эти "цифры" вычислены из Datasheet'а - STM32L1xx Datasheet.
Кстати, я неправ в размере буфера. Общий объём памяти кристалла - 16кБ.


Цитата(data_stack @ Dec 3 2015, 14:44) *
Судя по даташиту L1 рвет топовые MSP по токопотреблению.

Виноват, не уточнил, если это даст выигрыш по току, то подогнать частоты можно. поэтому наверно логично взять 2048, 256 и 16Гц. Думаю, пока остановлюсь на 1 варианте и как было сказано выше, буду чаще их обрабатывать и скидывать.


У STM32L152 есть 2 АЦП.
И много таймеров.
Частота 256 кратна 16-ти (16 раз), а вот 2000 - нет.
Так что, можно заставить оцифровывать один АЦП и один канал DMA низкочастотные выборки (256Sa/s) в одну область памяти, а более скоростные (2000Sa/s) - в другую по другому каналу.
Время между выборками столь большое, что можно запускать не боясь перехлёста каналов DMA.
Соответственно, использовать два таймера.

Цитата(jcxz @ Dec 3 2015, 20:00) *
Если так важно получить минимальное потребление, то может имеет смысл расширить кругозор и рассмотреть разные семейства от разных поизводителей, а не зацикливаться на STM32?

Поддерживаю. Хотя, у меня аналогичная ситуация и ТС - что есть, с тем и работаем.
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Dec 5 2015, 03:45
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Я постоянно занимаюсь вопросами потребления, считаю себя в этой сфере специалистом. Так вот:

1) STM32 - лидер по потреблению. Меньше ни у кого не будет.

2) STM32L может означать STM32L151 и STM32L476
L4 вышел недавно и потребляет значительно меньше старых L151
Ещё есть F411 , он потребляет так же или меньше чем L151

3)Из моего опыта, на L151 при оцифровывании 8бит 8КГц и записи результата на карту памяти потребление 2.5мА, из которых 50% потребляет карта.
При этом обрабатывается поток данных 8Кбит /с
В Вашем случае поток данных ~3Кбит/с. Думаю что потребление будет порядка 1.25 мА. Если постараться.


Советую делать так:
Преобразовывать 3 канала с разрядностью 12 бит и частотой 2 КГц , через DMA писать в массив1.
При заполнении массива1 прерывание ДМА , по которому процессор выходит из сна и разбирает массив1, кладя результаты в массив2.
Прерывание конечно же по половине и концу передачи, что бы массив1 работал как кольцевой буфер.
При заполнении массива2 писать в карту, то же по ДМА во время сна процессора.
Массивы занимают всю память, обращение к карте как можно реже.
Это решение "в лоб"
Но если посмотреть на АЦП внимательнее, то там вроде как injected и regular каналы можно запускать независимо и данные получать независимо.
Если и правда так, то можно один катал преобразовывать с частотой 2000, а два других 256. С этим надо разбираться. Сначала попробуйте сделать "в лоб"


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 5 2015, 08:29
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(MiklPolikov @ Dec 5 2015, 09:45) *
Я постоянно занимаюсь вопросами потребления, считаю себя в этой сфере специалистом. Так вот:
1) STM32 - лидер по потреблению. Меньше ни у кого не будет.

На такое безаппеляционное утверждение сразу скажу что Вы не правы.
Всё зависит от задачи и требуемого алгоритма работы.
Недавно выбирал МК под задачу связанную с работой с АЦП и батарейное питание.
Рассмотрел многие МК от разных производителей, в том числе и STM32L4. В итоге выбрал LPC4370 как обеспечивающий минимальное потребление для данной задачи (ну и минимальную стоимость комплектующих).
С STM32L4 получалось гораздо большее потребление по расчётам.
Go to the top of the page
 
+Quote Post
data_stack
сообщение Jan 15 2016, 13:39
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-10-15
Пользователь №: 88 891



Если кому интересно, то в конкретно моем случае оказалось не выгодно использовать DMA. Разница не велика, порядка 400мкА, но все таки в пользу использования прерываний. Кроме того, без ДМА используется меньше оперативной памяти. Уточняю, что это справедливо только для именно моей ситуации.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.0197 секунд с 7
ELECTRONIX ©2004-2016