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

 
 
> STM PWM Input, Как отцифровать на STM несколько PWM сигналов
Golikov A.
сообщение Feb 6 2015, 17:54
Сообщение #1


Гуру
******

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



Всем привет!

Ковыряюсь с новым для себя семейством от STM, потому все чуднО и Чудно пока чтоsm.gif.

Дано: 6 входных сигналов (лучше 10), период сигнала порядка 20 мСек, длительность импульса от 1 до 2 мСек. Начало сигналов близкое, но в общем случае не одновременное, длительность в интервале 1-2 мСек любая, но именно в этом интервале.

Надо: Получить значение длительности каждого сигнала при этом не убив все ресурсы процессора.

делаю это на stm32f3discovery.

Собственно у меня есть несколько рецептов, может у кого есть лучше, посоветуйте.

1. Вариант Input PWM - вообще не вариант, так как на 1 сигнал ухлопывается целый таймер.

2. Хотел запустить таймер бежать, настроить каналы в режиме capture, на оба фронта, и по прерыванию capture сохранять начало и конец фронта. Но что-то я читаю описание, и вроде как получается что режим срабатывания по обоим фронтам идет через slave controller и как я понимаю я не могу иметь 4 независимых канала или нет? Можно конечно перенастраивать то на восходящий, а в прерывании перенастраивать на падающий, но как-то это не красиво ИМХО

3. Подать сигналы на ножки с прерывание по фронту, и запустить бежать таймер, в прерывании сохранять значение. Из плюсов что можно всего 1 таймер, Из минусов что есть нечеткость определения фронта, пока обрабатываем одни ноги, другие могут сработать и пойдут по не правильному времени. Еще я правильно понимаю что прерываний от ног всего 16, и если взяли прерывание от А0.8, то ни от B0.8 ни от С0.8 его уже не получить?

4. Тупой полинг, долбить уровень на ногах и запустить таймер, но что-то это как-то мрачно, весь ресурс уйдет на это...

Посоветуйте, может я какие варианты забыл, может какое-то жесткое ДМА можно придумать в целом я себе вижу что точность в 1000 уровней на интервал будет выше крыши.


Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Feb 8 2015, 08:07
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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

Сообщений в этой теме
- Golikov A.   STM PWM Input   Feb 6 2015, 17:54
- - 1113   Цитата(Golikov A. @ Feb 6 2015, 20:54) мо...   Feb 6 2015, 18:00
- - Golikov A.   чем это лучше моего варианта под номером 2?   Feb 6 2015, 18:02
|- - 1113   Цитата(Golikov A. @ Feb 6 2015, 21:02) че...   Feb 6 2015, 18:03
- - Iptash   Для разгрузки ЦП я бы сделал аппаратно, например н...   Feb 6 2015, 19:25
- - AHTOXA   Цитата(Golikov A. @ Feb 6 2015, 22:54) Да...   Feb 6 2015, 19:30
- - Golikov A.   Ну да приемник, только их 2 (4 и 6 каналов), и они...   Feb 6 2015, 20:13
|- - AHTOXA   Цитата(Golikov A. @ Feb 7 2015, 01:13) А ...   Feb 6 2015, 20:36
- - smk   Первое что приходит на ум это подключить все сигна...   Feb 6 2015, 20:22
- - Golikov A.   на один порт? по ИЛИ что ли? Тогда первый поднявши...   Feb 6 2015, 20:36
|- - smk   Цитата(Golikov A. @ Feb 6 2015, 22:36) на...   Feb 6 2015, 20:50
- - Iptash   А измерять нужно каждый импульс, или можно пропуск...   Feb 6 2015, 20:39
- - Golikov A.   ЦитатаНо в применении внешних прерываний для замер...   Feb 6 2015, 20:43
|- - AHTOXA   Цитата(Golikov A. @ Feb 7 2015, 01:43) 1 ...   Feb 6 2015, 20:51
- - Golikov A.   Это когда прерывания как у LPC, там весь порт кажд...   Feb 6 2015, 20:52
|- - smk   Цитата(Golikov A. @ Feb 6 2015, 22:52) Эт...   Feb 6 2015, 21:01
- - smk   Если у Вас 10 сигналов, а портов 5 то заведите 5 с...   Feb 6 2015, 20:54
- - Golikov A.   ЦитатаНу или узнайте способ кодирования ваших сист...   Feb 6 2015, 20:56
|- - AHTOXA   Цитата(Golikov A. @ Feb 7 2015, 01:56) н...   Feb 6 2015, 21:03
- - Golikov A.   PPM приходит по воздуху, а дальше приемник раскоди...   Feb 6 2015, 21:32
|- - jcxz   Ещё вариант: Завести все сигналы на один GPIO-порт...   Feb 7 2015, 12:08
|- - smk   Цитата(jcxz @ Feb 7 2015, 14:08) Ещё вари...   Feb 7 2015, 12:50
- - Golikov A.   это был такой вариант. Но есть беда с разбором пол...   Feb 7 2015, 12:38
|- - jcxz   Цитата(Golikov A. @ Feb 7 2015, 18:38) да...   Feb 7 2015, 17:11
- - SasaVitebsk   stm позволяет оцифровывать аппаратно pwm сигнал. О...   Feb 7 2015, 18:29
- - Golikov A.   1000 отсчетов на 6-10 каналах будет не меньше 6000...   Feb 7 2015, 23:37
|- - jcxz   Цитата(Golikov A. @ Feb 8 2015, 05:37) 10...   Feb 8 2015, 05:46
- - smk   Интересно, а если проработать вопрос на предмет ан...   Feb 8 2015, 06:00
- - Golikov A.   Ага, спасибо. Собственно говоря у 6 каналов будет...   Feb 9 2015, 05:09
|- - jcxz   Цитата(Golikov A. @ Feb 9 2015, 11:09) По...   Feb 9 2015, 07:51
- - Golikov A.   ну так я у вас и посмотрел, и отразил как бы суть ...   Feb 9 2015, 07:55


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

 


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


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