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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> STM PWM Input, Как отцифровать на STM несколько PWM сигналов
smk
сообщение Feb 6 2015, 20:54
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Если у Вас 10 сигналов, а портов 5 то заведите 5 сигналов на EXTI0 а другие 5 на EXTI1. По каждому прерыванию обработайте только 5 ног.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 6 2015, 20:56
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Ну или узнайте способ кодирования ваших систем радиоуправления, и, если там PPM, то залезть внутрь приёмника и найти там сигнал всех каналов. Тогда всё будет вообще легко.

sm.gif не ну это жестоко... естественно там скорее всего PPM, но курочить приемник не. Его следует считать черным ящиком....

Цитата
Обработчик одного прерывания будет уже больше 36 циклов. А если не два, а три прерывания одновременно? Не, это не вариант, кмк.
Захват таймерами десятка импульсов раз в 20 мс - это совсем небольшая нагрузка для STM-ки на 72МГц.

одного наверное все же меньше, а вот наслоения возможно... Ок. отказываемся от идеи прерываний.

Значит основной рабочей идеей принимается капчить таймер, с перестройкой фронта. Всем спасибо за участие!

Цитата
Если у Вас 10 сигналов, а портов 5 то заведите 5 сигналов на EXTI0 а другие 5 на EXTI1. По каждому прерыванию обработайте только 5 ног.

я не понимаю как это сделатьsad.gif... Что такое завести 5 сигналов на EXTI0 как? схемно снаружи проца, или внутри как то можно? Какой схемой?
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 6 2015, 21:01
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(Golikov A. @ Feb 6 2015, 22:52) *
Это когда прерывания как у LPC, там весь порт каждая нога вызывает прерывание, и по флагам можно понять от кого.
а в STM у них на каждую ногу свое прерывание, и группами объединены 0, 1, 2, 3, 4, 5-9, 10-15, но главная засада что задействовав ногу А0.1, уже B0.1, C0.1, D0.1 не могу давать прерывание, это немного затрудняет, но в целом не критично

Есть такая ситуация. Пользуйте 9-15 или что там. Ошибся немножко в номерах...

Кстати в жизни пробовал. Тоже интервалы милисекундные были. Кейл здорово код соптимизировал. И тоже был выбор из 8 событий по разным ногам. Смотрите. Рад был быть полезен если был конечно.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 6 2015, 21:03
Сообщение #19


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Golikov A. @ Feb 7 2015, 01:56) *
sm.gif не ну это жестоко... естественно там скорее всего PPM, но курочить приемник не. Его следует считать черным ящиком....

Если там PPM, то сигналы идут не [почти] одновременно, а как раз таки наоборот, строго поочерёдно.
Тогда накладываться могут только два сигнала с разных приёмников. Тогда можно и внешние прерыванияsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 6 2015, 21:32
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



PPM приходит по воздуху, а дальше приемник раскодирует, и выкидывает ШИМ. Вероятнее всего между контроллером приемника и приемным трактом можно отловить раскодированный PPM сигнал, но без вскрытия он не доступен, а это не спортивно%)

Ну в общем в кубе прикинул. По таймерам и прочей периферии вроде бы все влезло.
Буду капчить и менять фронты. Это почти как просто по прерываниям, но длительность сохраняется, хоть часть работы на себя возьмут таймеры. И с другими уже напаянными модулями в дискавери вроде конфликта нет.

Всем спасибо за обсуждение!
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 7 2015, 12:08
Сообщение #21


Гуру
******

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



Ещё вариант:
Завести все сигналы на один GPIO-порт. Также объединить их (внешней логикой) по ИЛИ в один сигнал, от которого запускать DMA,
считывающий этот порт с частотой 1МГц в буфер в ОЗУ. Размер DMA-передачи - 2000 отсчётов.
По завершении DMA-транзакции несложно определить начало и конец каждого импульса, проксорив начало и конец полученного массива значений порта.
Из плюсов: хорошая масштабируемость - не привязано к кол-ву аппаратных ресурсов (таймеров), хоть до 32 сигналов захватывайте.

PS: Хотя конечно это гораздо более тяжёлый для процессора вариант.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 7 2015, 12:38
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



это был такой вариант. Но есть беда с разбором полученного массива, по нему надо будет пройтись даже без сравнений это не менее 2000*6 действий, а добавив туда еще сравнения и какие-то переходы, да тот же инкремент цикла и уже получаются миллисекунды. Если будет больше 2 мСек, то легче на эти 2 мСек полингом сигналы долбить и по таймеру отмечать конец и старт, разрешение будет даже повыше

Еще я не совсем пока уверен в ДМА, что оно умеет читать порт. Пока не проверял.
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 7 2015, 12:50
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(jcxz @ Feb 7 2015, 14:08) *
Ещё вариант:
Завести все сигналы на один GPIO-порт. Также объединить их (внешней логикой) по ИЛИ в один сигнал, от которого запускать DMA,
считывающий этот порт с частотой 1МГц в буфер в ОЗУ. Размер DMA-передачи - 2000 отсчётов.
По завершении DMA-транзакции несложно определить начало и конец каждого импульса, проксорив начало и конец полученного массива значений порта.
Из плюсов: хорошая масштабируемость - не привязано к кол-ву аппаратных ресурсов (таймеров), хоть до 32 сигналов захватывайте.

PS: Хотя конечно это гораздо более тяжёлый для процессора вариант.

Только видать в две страницы писать прийдется. Пока одна пишется вторая обрабатывается. Процесс такой обработки страницы это на 72 МГц что-то около 1,5-2 мС. Не так и тяжело. Но и не пропустит событий.

Цитата(Golikov A. @ Feb 7 2015, 14:38) *
Еще я не совсем пока уверен в ДМА, что оно умеет читать порт. Пока не проверял.

Я так понимаю нужно заряжать память-память и пинать по таймеру с нужным временным разрешением. Первое значение в памяти без инкремента, второе в массив в памяти с инкременом. Хотя сам так не делал может и не правда все это. Кстати в ЦАП так выводил, но это получается наоборот.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 7 2015, 17:11
Сообщение #24


Гуру
******

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



Цитата(Golikov A. @ Feb 7 2015, 18:38) *
даже без сравнений это не менее 2000*6 действий, а добавив туда еще сравнения и какие-то переходы, да тот же инкремент цикла и уже получаются миллисекунды. Если будет больше 2 мСек, то легче на эти 2 мСек полингом сигналы долбить и по таймеру отмечать конец и старт, разрешение будет даже повыше

Во-первых: Зачем 2000? Вы же сами написали что минимальная длина импульса 1мс и старты импульсов близки друг к другу. Так что - достаточно пройтись немного от начала полученного массива и до 1000 отсчётов от конца.
Во-вторых: Откуда 6? Если уж спускаться до ассемблера, то в базовом варианте, без оптимизации, со всеми переходами и счётчиком цикла получается 7 команд (если GPIO STM32 имеет функцию маскирования при чтении как в LPC, то на команду меньше).
Далее - исходя из Вашего условия, что кол-во сигналов много меньше кол-ва сэмплов в массиве, и сигналов <=8, можно провести оптимизацию алгоритма и получить в пределе до 3.5 команд на каждые 4 сэмпла (с маскированием в GPIO еще на 1 команду меньше). Это я учёл только основной цикл поиска. Ответвления от цикла при обнаружении изменения сигнала и счётчик цикла я не учёл, но они дадут небольшую прибавку если учесть вышеизложенные условия.
Так что в целом, на проход 1000 сэмплов понадобится ~1000 тактов, что при 72МГц всего неск. мксек.
Может что-то я не учёл, но порядок примерно такой.

ЗЫ: Конечно на DSP этот поиск просто шикарно ложится, но увы - у Вас всего лишь Cortex. sm.gif

Цитата(smk @ Feb 7 2015, 18:50) *
Только видать в две страницы писать прийдется. Пока одна пишется вторая обрабатывается. Процесс такой обработки страницы это на 72 МГц что-то около 1,5-2 мС.

ТС же указал в условии, что измерять надо только во время импульсов, между импульсами - большие паузы. И я предложил запускать DMA от логического ИЛИ всех сигналов, полученного внешней логикой. Если её нет, то да - придётся делать непрерывное чтение.

Цитата(smk @ Feb 7 2015, 18:50) *
Я так понимаю нужно заряжать память-память и пинать по таймеру с нужным временным разрешением.

Нужно читать GPIO->ОЗУ, а синхронизацию (события для DMA) брать от таймера. Думаю - STM32 это должен уметь.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 7 2015, 18:29
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



stm позволяет оцифровывать аппаратно pwm сигнал. Определяется сразу скважность. Таймеров в некоторых камнях порядка 9 штук, если память не изменяет. По памяти не помню, возможно ли 4 входа на таймер. Надо смотреть.
Вариант с оцифровкой по прерыванию от входов я недавно делал. Понятно, что будет лёгкая болтанка. 6 ног можно завести на одно прерывание. NXP для этих целей лучше подходит. Но объективная картина в реальных условиях - несколько тактов +/- разброс. Я обрабатывал 10 входов. И они попали на ноги так, что было задействовано все EXTI прерывания ... ))) То есть неудачно. Оцифровывал мегагерцем. Вводил поправку на кварц.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 7 2015, 23:37
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



1000 отсчетов на 6-10 каналах будет не меньше 6000-10000 тактов, при 1 такте на семпл, а при 7 тактах это 43-70К циклов... ну в целом да получается 1-2 мСек... равносильно полингу, но более точные фронты.


Цитата
stm позволяет оцифровывать аппаратно pwm сигнал. Определяется сразу скважность. Таймеров в некоторых камнях порядка 9 штук, если память не изменяет. По памяти не помню, возможно ли 4 входа на таймер. Надо смотреть.

аппаратно это делают далеко не все таймеры в STM там надо 2 канальный таймер с слейв контролером. Так что на 6 каналов не набирается, а на 10 тем более...

надо капчить полюбому...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 8 2015, 05:46
Сообщение #27


Гуру
******

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



Цитата(Golikov A. @ Feb 8 2015, 05:37) *
1000 отсчетов на 6-10 каналах будет не меньше 6000-10000 тактов, при 1 такте на семпл, а при 7 тактах это 43-70К циклов... ну в целом да получается 1-2 мСек... равносильно полингу, но более точные фронты.

Что-то Вы недопоняли.... wacko.gif
Под "сэмплом" я имел в виду захват сразу всего порта одним чтением. Т.е.: с оптимизацией на 1000 отсчётов при <=8 каналов будет около 1000 команд (и наверное тактов). Это конечно без учёта обработок обнаруженных фронтов и без учёта счётчика циклов, но они внесут небольшой вклад.
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 8 2015, 06:00
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Интересно, а если проработать вопрос на предмет аналогового вочдога? Завести все на АЦП и пусть он аппаратно отслеживает изменения сигнала. Сам такое не делал, но может кто делал лучше подскажет.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 8 2015, 08:07
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Оцифровка ШИМа через АЦП - нормальный способ, надо только кондерчик с резюком, но не хочется сильно внешнюю схему городить. Пока все решается соединением дискавери проводками, а так придется платку хотя бы на слепыше паять. Аналоговых вочдогов на 6 каналов вроде не хватает...

Цитата
Что-то Вы недопоняли....

очевидно.

вот к примеру для 3 каналов
000
010
010
011
011
111
....

конечно можно кейзом обрабатывать и по виду числа за 1 раз находить все фронты, нодля 3 уже 8 кейсов, а для 6-10?. В общем случае каждый канал надо обработать отдельно. Потому я число отсчетов умножил на число каналов для каждого из них надо сделать действие, да цикл будет общий, 6 тактов цикла на все каналы разом, но внутри еще по 6N(каналовых) действий.

Тоже в целом годный вариант, если ДМА не подведет...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 8 2015, 08:19
Сообщение #30


Гуру
******

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



Цитата(Golikov A. @ Feb 8 2015, 14:07) *
конечно можно кейзом обрабатывать и по виду числа за 1 раз находить все фронты, нодля 3 уже 8 кейсов, а для 6-10?. В общем случае каждый канал надо обработать отдельно. Потому я число отсчетов умножил на число каналов для каждого из них надо сделать действие, да цикл будет общий, 6 тактов цикла на все каналы разом, но внутри еще по 6N(каналовых) действий.

Не так. Не case тут спасение. Вы забываете, что CPU у нас - 32-битный wink.gif

Чтобы не быть голословным приведу примерный код:
CODE
THUMB
PUSH {R4-R9}
LDR R0, =table01
LDMIA R0, {R6-R8}
SUBS R9, R8, #4
MOVS R4, #0 ;текущее состояние входов
MOVS R5, #N ;счётчик проходов
ADR R12, pp01_0
pp01: LDR R0, [R9, #4]!
EORS R0, R0, R4
ANDS R0, R0, R6 ;можно убрать, если в GPIO есть соответствующая возможность маскирования (как в LPC)
BNE pDetect_0
pp01_0: LDR R0, [R9, #4]!
EORS R0, R0, R4
ANDS R0, R0, R6 ;можно убрать, если в GPIO есть соответствующая возможность маскирования (как в LPC)
BNE pDetect_1
pp01_1: LDR R0, [R9, #4]!
EORS R0, R0, R4
ANDS R0, R0, R6 ;можно убрать, если в GPIO есть соответствующая возможность маскирования (как в LPC)
BNE pDetect_2
pp01_2: ;... здесь можно повторить ещё неск. раз для уменьшения влияния счётчика проходов
SUBS R5, #1
BNE pp01
POP {R4-R9}
BX LR

pDetect_2: ADDS R12, R12, #pp01_2 - pp01_1
pDetect_1: ADDS R12, R12, #pp01_1 - pp01_0
pDetect_0:
pDetect: RBIT R1, R0
CLZ R1, R1
SUBS R3, R9, R8
ADDS R3, R3, R1, LSR #3
ANDS R2, R1, #7 ;R2 == номер изменившегося бита
;здесь:
;R2 - номер изменившегося бита в байте
;R3 - смещение [байт] от начала DMA-массива
;сохраняете это куда-нить в выходной результат
LSLS R3, R7, R2
EORS R4, R4, R3
BICS R0, R0, R3
BNE pDetect ;ищем след. изменившийся бит
MOV R0, R12
ADR R12, pp01_0
BX R0

LTORG
DATA
table01 DC32 83838383h ;R6. маска для случая использования 0,1,7 битов в порту для сигналов
DC32 01010101h ;R7
DC32 dmaBuf ;R8. Указатель на начало буфера с сэмплами

Может где-то есть ошибка - не отлаживал канеш. Но вобщем смысл такой.
Как видите - на каждые 4 байта тратится 4 команды (для LPC можно сократить до 3-х, может и в STM тоже можно).
Если блоков pp01_x сделать несколько, то эффект от лишних таков в конце цикла размажется по ним и сократится.
pDetect будет выполняться сравнительно редко и не будет сильно влиять на задержку.
Go to the top of the page
 
+Quote Post

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

 


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


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