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

 
 
 
Reply to this topicStart new topic
> STM32: инвертировать знаковый бит АЦП
777777
сообщение Aug 26 2011, 04:00
Сообщение #1


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Оцифровываются 6 каналов и записываются в память в режиме DMA. Но некоторые каналы знаковые - середина диапазона подразумевается нулем, а сигнал колеблется около него. Поэтому значение АЦП нужно сделать знаковым: инвертировать старший бит (результат сдвинут влево). Можно ли это сделать аппаратно? Если это делать программно, то смысл DMA полностью теряется.
Go to the top of the page
 
+Quote Post
Forger
сообщение Aug 26 2011, 05:34
Сообщение #2


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

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(777777 @ Aug 26 2011, 08:00) *
Если это делать программно, то смысл DMA полностью теряется.

Отчего ж так категорично? ))
Ведь можно сделать два канала DMA: первый кидает из АЦП в ОЗУ,
а второй их ОЗУ в ваш UART/SPI или куда там вам нужно.
По прерыванию DMA можно делать простую программную обработку данных, даже прямо в прерывании, если размеры блоков DMA не очень велики.



--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 26 2011, 05:49
Сообщение #3


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Forger @ Aug 26 2011, 09:34) *
По прерыванию DMA можно делать простую программную обработку данных, даже прямо в прерывании, если размеры блоков DMA не очень велики.

Вот этой программной обработки хотелось бы избежать.

P.S. А куда делись еще два сообщения из этой темы?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 26 2011, 09:13
Сообщение #4


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



1. Инвертирование старшего бита даст совсем не тот результат, на который Вы рассчитывали. Для сдвига нужно просто вычитать константу.
Инжектет каналы, кстати, такой функционал имеют (см. ADC injected channel data offset register), а вот регулярные - увы, нет.
2. Какая-то обработка всё равно потребуется, иначе зачем оцифровывать? Вот там и вычитать смещение.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Forger
сообщение Aug 26 2011, 09:33
Сообщение #5


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

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(SSerge @ Aug 26 2011, 13:13) *
...Какая-то обработка всё равно потребуется, иначе зачем оцифровывать?

Согласен. И более того в обработку можно включить даже простейшую цифровую фильтрацию: медианный фильтр, фильт скользщего среднего, фильтр с БИХ, и т. д. С целочисленной арифметикой это не требует высокой нагрузки на ядро. Тогда для внешнего устройства все каналы становятся одинаковыми. Это сильно упрощает дело.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 26 2011, 10:41
Сообщение #6


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(SSerge @ Aug 26 2011, 13:13) *
1. Инвертирование старшего бита даст совсем не тот результат, на который Вы рассчитывали. Для сдвига нужно просто вычитать константу.

Инвертирование старшего бита - это и есть вычитание константы 0x8000. Кстати, если кто не знает - если данные прижаты вправо, то вычитание 0x0800 инвертирует знаковый бит и одновременно расширяет знак - но это так, к слову.

Цитата(SSerge @ Aug 26 2011, 13:13) *
Инжектет каналы, кстати, такой функционал имеют (см. ADC injected channel data offset register), а вот регулярные - увы, нет.

Я пытался про них прочитать но ничего не понял. Чем они отличаются от регулярных и почему так называются?

Цитата(SSerge @ Aug 26 2011, 13:13) *
2. Какая-то обработка всё равно потребуется, иначе зачем оцифровывать? Вот там и вычитать смещение.

Потребуется только передавать их другому прибору. Инвертировать перед передачей опасно - вдруг в этот момент произойдет DMA. Поэтому в крайнем случае можно возложить это на тот прибор.

Цитата(Forger @ Aug 26 2011, 13:33) *
Согласен. И более того в обработку можно включить даже простейшую цифровую фильтрацию: медианный фильтр, фильт скользщего среднего,

Повбывав бы!!!
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 26 2011, 13:29
Сообщение #7


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(777777 @ Aug 26 2011, 17:41) *
Инвертирование старшего бита - это и есть вычитание константы 0x8000. Кстати, если кто не знает - если данные прижаты вправо, то вычитание 0x0800 инвертирует знаковый бит и одновременно расширяет знак - но это так, к слову.

Хм... действительно, в данном случае (данные сдвинуты влево и смещение именно на 0x8000) это одно и то же. Мне просто чаще приходилось иметь дело с данными выровненными по правому краю, да и сдвиг шкалы не всегда точно равен 0x8000, вот и не сообразил сразу.
Цитата
Я пытался про них прочитать но ничего не понял. Чем они отличаются от регулярных и почему так называются?

О, это замечательная штука. Вот настроили вы регулярную оцифровку, пересылку по DMA и обработку данных для основной задачи, но остаются ещё всякие мелочи для которых тоже нужен АЦП - то температуру надо замерить, то степень заряженности батареи оценить, то ещё что-то подобное. И что теперь, раз в секунду всё перепрограммировать ради ещё одного измерения? А потом всё возвращать назад, да при этом ещё и ухитриться фазу оцифровки не сбить.
Я как-то раз на MSP430 с его ADC12 подобным занимался, всё проклял. Из-за какой-то фигни пришлось столько извращаться...
Тут-то эти injected каналы и выручают.
Если между регулярными преобразованиями есть достаточная пауза, то можно воткнуть туда дополнительное преобразование по инжектированному каналу и это вообще никак не отразится на исполнении основной задачи. Если пауза недостаточна, то, конечно, преобразование по регулярным каналам будет задержано на какое-то время, но тут уж ничего не поделаешь, другие варианты ещё хуже.
PS. Кстати, DMA у STM32 тоже не прост: на нём можно сделать аналог двухбуферной системы и смело обрабатывать одну половину буфера пока идёт пересылка в другую половину.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post

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

 


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


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