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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> 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
1113
сообщение Feb 6 2015, 18:00
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 604
Регистрация: 24-02-06
Из: Москва
Пользователь №: 14 658



Цитата(Golikov A. @ Feb 6 2015, 20:54) *
может у кого есть лучше, посоветуйте.

timer в режиме capture - 1 таймер на 4 входа. сможете получить временную разрешающую способность, равную системной частоте...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 6 2015, 18:02
Сообщение #3


Гуру
******

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



чем это лучше моего варианта под номером 2?
Go to the top of the page
 
+Quote Post
1113
сообщение Feb 6 2015, 18:03
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 604
Регистрация: 24-02-06
Из: Москва
Пользователь №: 14 658



Цитата(Golikov A. @ Feb 6 2015, 21:02) *
чем это лучше моего варианта под номером 2?

я наверное ошибаюсь... действительно нельзя получить 4 канала на таймер при двух фронтах... почитаю.
Go to the top of the page
 
+Quote Post
Iptash
сообщение Feb 6 2015, 19:25
Сообщение #5


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

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Для разгрузки ЦП я бы сделал аппаратно, например на CPLD, а ЦП будет только собирать данные. (это только мое мнение)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 6 2015, 19:30
Сообщение #6


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

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



Цитата(Golikov A. @ Feb 6 2015, 22:54) *
Дано: 6 входных сигналов (лучше 10), период сигнала порядка 20 мСек, длительность импульса от 1 до 2 мСек.

Сигналы управления сервомашинками? С приёмника радиоуправления?
Я как-то тоже имел дело с такой задачей. Но мне повезло - нашёл на своём приёмнике ножку, на которой присутствовал дешифрованный сигнал из эфира, где последовательно появлялись все импульсы для 6 каналов. Так что обошёлся одним каналом захвата.
В вашем случае сигналы начинаются одновременно, поэтому так просто не выйдет. Я за второй вариант, перестроить в прерывании захвата фронт/спад - пара команд. К тому же, вам всё равно нужно различать фронт и спад: один из них - начало импульса, один - конец. Я имею в виду, что вас интересует длительность от начала до конца, а не наоборотsm.gif


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


Гуру
******

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



Ну да приемник, только их 2 (4 и 6 каналов), и они старого образца, у них нет режима вывода на одну ногу. И даже если бы был, задача решить для самого тупого варианта, который будет работать всегда. Так что надо цифровать 6-10 сигналов... Хоть отдельный проц на это ставь, или ПЛИС.


Цитата
В вашем случае сигналы начинаются одновременно, поэтому так просто не выйдет.

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

Цитата
Я имею в виду, что вас интересует длительность от начала до конца, а не наоборот

ну в целом одна величина 1-2 мСек, а другая 18-19 мСек. Так что они различимы даже если не следить за фронтами.


Цитата
Я за второй вариант, перестроить в прерывании захвата фронт/спад - пара команд.

Спасибо, опираясь на ваш опыт с STM, если поддерживаете решение, то значит я ничего не упустилsm.gif. Будем перенастраивать...

А прерывания по ножкам действительно все так? то есть занял 8 прерывание портом А, и Б уже не подключить?


Цитата
Для разгрузки ЦП я бы сделал аппаратно, например на CPLD, а ЦП будет только собирать данные. (это только мое мнение)

Спасибо, это основное решение на будущее, только CPLD не хватает, маленькие они, легче уже FPGA закатать, и кучу остального на нее сбросить, может даже проц в нее вогнать. Вторая итерация если будет, то именно такая. Пока для тестов мучаем проц. Может быть их станет 2 один будут рубить эту задачу, а другой дело делатьsm.gif
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 6 2015, 20:22
Сообщение #8


Гуру
******

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



Первое что приходит на ум это подключить все сигналы на один порт и настроить единственное прерывание на оба перепада. В прерывании разбирать по какой ноге сработка и соответственно списывать счетный регистр таймера. Можно системного. Для таких задач хорош быстрый контроллер. Но тут зависит от того какая точность замера нужна.


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


Гуру
******

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



на один порт? по ИЛИ что ли? Тогда первый поднявшийся сигнал замаскирует начало всех остальных.... Можно по xor конечно, но тоже будет такая каша из фронтов, что пипец....
тем более прерывание на оба перепада - это в STM отсутствует как я понял. Собственно как и выбор контроллера, если менять элементную базу, то тогда сразу ПЛИС ставить и не мучатся.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 6 2015, 20:36
Сообщение #10


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

Группа: Свой
Сообщений: 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...
Но в применении внешних прерываний для замера длительности сигналов главный недостаток не этот, а потеря точности при одновременном поступлении сигналов.


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


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

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



А измерять нужно каждый импульс, или можно пропускать?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 6 2015, 20:43
Сообщение #12


Гуру
******

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



Цитата
Но в применении внешних прерываний для замера длительности сигналов главный недостаток не этот, а потеря точности при одновременном поступлении сигналов.


Это понятно.
1 мСек длительности это на 72 МГц - 72 000 циклов. Мне достаточно разрешения в 1000 отсчетов, то есть +- 36 циклов не критично. Зато экономиться куча таймеров, и больше разнообразие ножек (могло бы быть, если бы не дурное ограничение что ножка одного порта блокирует другойsad.gif...)

Была безумная мысль зарядить ДМА по таймеру читать состояние входа раз в микросекунду с запуском таймера по XOR входов, а потом анализировать массив, но это может оказаться еще дольше. И не факт что ДМА может читать порт, это еще не проверял...

Цитата
А измерять нужно каждый импульс, или можно пропускать?

Нужны все импульсы группы, нельзя из первой пачки померить 1, из 2 пачки 2 и так далее...

то есть если 1 канал замерили, то без 2-6 каналов измерение не имеет смысла и выпадает все целиком.
ну и пропуски - это оперативность реакции на входное воздействие, если потерь много - то это тоже никому не надо...
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 6 2015, 20:50
Сообщение #13


Гуру
******

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



Цитата(Golikov A. @ Feb 6 2015, 22:36) *
на один порт? по ИЛИ что ли? Тогда первый поднявшийся сигнал замаскирует начало всех остальных.... Можно по xor конечно, но тоже будет такая каша из фронтов, что пипец....
тем более прерывание на оба перепада - это в STM отсутствует как я понял. Собственно как и выбор контроллера, если менять элементную базу, то тогда сразу ПЛИС ставить и не мучатся.

Если по ходу обработки прерывания по одной ноге произойдет прерывание по другой, то обработчик запустится повторно. Обычно switch-case. Но если скажем две ноги одновременно, то обрабатывать тоже разумнее как два события за одно прерывание и сносить оба флага. Можно проверять все биты интересующих ног. Тут уже что быстрее то и лучше. Думаю с учетом всей палитры нужно просто по очереди перебрать все биты и обработать попутно снеся флаги в сработавших.

EXTI_RTSR и EXTI_FTSR. Выбирайте пины хоть по спаду хоть по фронту хоть по двум событиям сразу. Просто регистры разные для каждого события.


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


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

Группа: Свой
Сообщений: 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, то залезть внутрь приёмника и найти там сигнал всех каналов. Тогда всё будет вообще легко.


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


Гуру
******

Группа: Свой
Сообщений: 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 не могу давать прерывание, это немного затрудняет, но в целом не критично
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 00:36
Рейтинг@Mail.ru


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