|
STM PWM Input, Как отцифровать на STM несколько PWM сигналов |
|
|
|
Feb 6 2015, 17:54
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Всем привет! Ковыряюсь с новым для себя семейством от STM, потому все чуднО и Чудно пока что  . Дано: 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 уровней на интервал будет выше крыши.
|
|
|
|
|
 |
Ответов
|
Feb 8 2015, 08:07
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Оцифровка ШИМа через АЦП - нормальный способ, надо только кондерчик с резюком, но не хочется сильно внешнюю схему городить. Пока все решается соединением дискавери проводками, а так придется платку хотя бы на слепыше паять. Аналоговых вочдогов на 6 каналов вроде не хватает... Цитата Что-то Вы недопоняли.... очевидно. вот к примеру для 3 каналов 000 010 010 011 011 111 .... конечно можно кейзом обрабатывать и по виду числа за 1 раз находить все фронты, нодля 3 уже 8 кейсов, а для 6-10?. В общем случае каждый канал надо обработать отдельно. Потому я число отсчетов умножил на число каналов для каждого из них надо сделать действие, да цикл будет общий, 6 тактов цикла на все каналы разом, но внутри еще по 6N(каналовых) действий. Тоже в целом годный вариант, если ДМА не подведет...
|
|
|
|
|
Feb 8 2015, 08:19
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Golikov A. @ Feb 8 2015, 14:07)  конечно можно кейзом обрабатывать и по виду числа за 1 раз находить все фронты, нодля 3 уже 8 кейсов, а для 6-10?. В общем случае каждый канал надо обработать отдельно. Потому я число отсчетов умножил на число каналов для каждого из них надо сделать действие, да цикл будет общий, 6 тактов цикла на все каналы разом, но внутри еще по 6N(каналовых) действий. Не так. Не case тут спасение. Вы забываете, что CPU у нас - 32-битный  Чтобы не быть голословным приведу примерный код: 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 будет выполняться сравнительно редко и не будет сильно влиять на задержку.
|
|
|
|
Сообщений в этой теме
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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|