|
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 6 2015, 19:30
|

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

|
Цитата(Golikov A. @ Feb 6 2015, 22:54)  Дано: 6 входных сигналов (лучше 10), период сигнала порядка 20 мСек, длительность импульса от 1 до 2 мСек. Сигналы управления сервомашинками? С приёмника радиоуправления? Я как-то тоже имел дело с такой задачей. Но мне повезло - нашёл на своём приёмнике ножку, на которой присутствовал дешифрованный сигнал из эфира, где последовательно появлялись все импульсы для 6 каналов. Так что обошёлся одним каналом захвата. В вашем случае сигналы начинаются одновременно, поэтому так просто не выйдет. Я за второй вариант, перестроить в прерывании захвата фронт/спад - пара команд. К тому же, вам всё равно нужно различать фронт и спад: один из них - начало импульса, один - конец. Я имею в виду, что вас интересует длительность от начала до конца, а не наоборот
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Feb 6 2015, 20:13
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Ну да приемник, только их 2 (4 и 6 каналов), и они старого образца, у них нет режима вывода на одну ногу. И даже если бы был, задача решить для самого тупого варианта, который будет работать всегда. Так что надо цифровать 6-10 сигналов... Хоть отдельный проц на это ставь, или ПЛИС. Цитата В вашем случае сигналы начинаются одновременно, поэтому так просто не выйдет. Правильнее говорить почти одновременно, потому что иначе бы я закапчил по восходящему общее начало, и потом все спады, а тут надо отдельно каждый сигнал. Цитата Я имею в виду, что вас интересует длительность от начала до конца, а не наоборот ну в целом одна величина 1-2 мСек, а другая 18-19 мСек. Так что они различимы даже если не следить за фронтами. Цитата Я за второй вариант, перестроить в прерывании захвата фронт/спад - пара команд. Спасибо, опираясь на ваш опыт с STM, если поддерживаете решение, то значит я ничего не упустил  . Будем перенастраивать... А прерывания по ножкам действительно все так? то есть занял 8 прерывание портом А, и Б уже не подключить? Цитата Для разгрузки ЦП я бы сделал аппаратно, например на CPLD, а ЦП будет только собирать данные. (это только мое мнение) Спасибо, это основное решение на будущее, только CPLD не хватает, маленькие они, легче уже FPGA закатать, и кучу остального на нее сбросить, может даже проц в нее вогнать. Вторая итерация если будет, то именно такая. Пока для тестов мучаем проц. Может быть их станет 2 один будут рубить эту задачу, а другой дело делать
|
|
|
|
|
Feb 6 2015, 20:36
|

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

|
Цитата(Golikov A. @ Feb 7 2015, 01:13)  А прерывания по ножкам действительно все так? то есть занял 8 прерывание портом А, и Б уже не подключить? Если завели внешнее прерывание на 8 ножку порта A, то завести другое на 8 ножку порта B не получится. Можно: A0, A1, A2, ... A15. Нельзя: A0, B0, C0, A1, B1, C1... Но в применении внешних прерываний для замера длительности сигналов главный недостаток не этот, а потеря точности при одновременном поступлении сигналов.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Feb 6 2015, 20:43
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Но в применении внешних прерываний для замера длительности сигналов главный недостаток не этот, а потеря точности при одновременном поступлении сигналов. Это понятно. 1 мСек длительности это на 72 МГц - 72 000 циклов. Мне достаточно разрешения в 1000 отсчетов, то есть +- 36 циклов не критично. Зато экономиться куча таймеров, и больше разнообразие ножек (могло бы быть, если бы не дурное ограничение что ножка одного порта блокирует другой  ...) Была безумная мысль зарядить ДМА по таймеру читать состояние входа раз в микросекунду с запуском таймера по XOR входов, а потом анализировать массив, но это может оказаться еще дольше. И не факт что ДМА может читать порт, это еще не проверял... Цитата А измерять нужно каждый импульс, или можно пропускать? Нужны все импульсы группы, нельзя из первой пачки померить 1, из 2 пачки 2 и так далее... то есть если 1 канал замерили, то без 2-6 каналов измерение не имеет смысла и выпадает все целиком. ну и пропуски - это оперативность реакции на входное воздействие, если потерь много - то это тоже никому не надо...
|
|
|
|
|
Feb 6 2015, 20:50
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(Golikov A. @ Feb 6 2015, 22:36)  на один порт? по ИЛИ что ли? Тогда первый поднявшийся сигнал замаскирует начало всех остальных.... Можно по xor конечно, но тоже будет такая каша из фронтов, что пипец.... тем более прерывание на оба перепада - это в STM отсутствует как я понял. Собственно как и выбор контроллера, если менять элементную базу, то тогда сразу ПЛИС ставить и не мучатся. Если по ходу обработки прерывания по одной ноге произойдет прерывание по другой, то обработчик запустится повторно. Обычно switch-case. Но если скажем две ноги одновременно, то обрабатывать тоже разумнее как два события за одно прерывание и сносить оба флага. Можно проверять все биты интересующих ног. Тут уже что быстрее то и лучше. Думаю с учетом всей палитры нужно просто по очереди перебрать все биты и обработать попутно снеся флаги в сработавших. EXTI_RTSR и EXTI_FTSR. Выбирайте пины хоть по спаду хоть по фронту хоть по двум событиям сразу. Просто регистры разные для каждого события.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Feb 6 2015, 20:51
|

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

|
Цитата(Golikov A. @ Feb 7 2015, 01:43)  1 мСек длительности это на 72 МГц - 72 000 циклов. Мне достаточно разрешения в 1000 отсчетов, то есть +- 36 циклов не критично. Обработчик одного прерывания будет уже больше 36 циклов. А если не два, а три прерывания одновременно? Не, это не вариант, кмк. Захват таймерами десятка импульсов раз в 20 мс - это совсем небольшая нагрузка для STM-ки на 72МГц. Ну или узнайте способ кодирования ваших систем радиоуправления, и, если там PPM, то залезть внутрь приёмника и найти там сигнал всех каналов. Тогда всё будет вообще легко.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Feb 6 2015, 20:52
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

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