Как принять сигнал с приемника в AVR (PWM|Digital)

Петруччо

Александр, а не поясните пжлст: что значит

V_Alex:

Импульс снимается в прямом цикле

? Т.е. как я понимаю программа в бесконечном цикле (jmp loop) проверяет изменение сигнала на входе (1 или 0) и уже потом обрабатывает его?

RL2000
Aleksey_Gorelikov:

Не проще запретить внешнее прерывание?

Такой способ не подойдет, задумал вообще не считывать PWM-сигнал с приемника. Сразу с приемника на сервопривод, а в нужный момент отобрать линию у приемника. Разве что ставить дополнительную микросхему и передавать тщательно вычисленную длительность через UART или еще как.

Петруччо
RL2000:

Сразу с приемника на сервопривод

RL2000:

отобрать линию у приемника

RL2000:

дополнительную микросхему и передавать тщательно вычисленную длительность через UART

это как??😃 В любом случае придется процессор в разрыв тогда ставить.

V_Alex
Петруччо:

… как я понимаю программа в бесконечном цикле (jmp loop) проверяет изменение сигнала на входе (1 или 0) и уже потом обрабатывает его?

Именно так. После инициализации запрыгиваем в бесконечный цикл. Если на входе 4 установилась единица, значит там сервоимпульс. Вот его и меряем. Замер заканчивается с окончанием импульса и наступлением синхропаузы (на входе 4 - ноль). Дальше делаем с импульсом все, что нам надо и, по аналогичной замеру методе, выводим его на любую другую лапку камня. Можно еще раз обработать и вывести на еще одну лапку.
Главное - уложиться в синхропаузу (18 мс). Обработали, вывели, расслабились. Ждем, пока на входе 4 не закончится ноль. Как закончился, перепрыгиваем к обработке входного импульса и все повторяется по-новой.
По хорошему перед первым замером пару импульсов лучше пропустить, чтобы не влезть в середину импульса. После замера можно проверить импульс на попадание в допустимые пределы.

Петруччо
V_Alex:

Именно так.

Все гениальное простоB-)
Спасибо, попробую повторить оное на сях в меге.

Vladimir_N

На тиньке 13 по другому сделать и не получится у нее нет 16 битного таймера и входа ICP. А вот на меге желательно использовать встроенные аппаратные ресурсы.
Вначале вы правильно решили вводить импульс при помощи ICPи выводить ШИМ.
Ввод и вывод в фоновом режиме под прерываниями, между ними обработка импульса.
При этом джитер измерения и вывода импульса минимальный и на обработку остается вагон времени.
Есть несколько тонкостей чисто аппаратных.
Советую использовать ICPвход не напрямую, а через встроенный аналоговый компаратор, у меги есть функция их сцепки. В этом случае исчезнут проблемы с уровнями сигнала от приемника.
Выводить импульс удобнее при помощи прерывания Compare соответствующего выхода.
Кварц удобней использовать на 8 МГц тогда при установке делителя 16 битного таймера счетчика на 8. Мы получаем 1 тик таймера =1 микросекунда. Проще будет потом производить расчеты в программе.
Счетчик не перезагружаем, пусть молотит по кругу. Все измерения импульсов производим как разность показаний счетчика в начале и в конце импульса.

Петруччо

ага, спасибо огромное за науку! В принципе я так и думал что так правильно, просто терзали сомнения успеет ли камень обрабатывать новый входящий импульс, в то время как PWM генерит текущий обсчитанный. про компаратор - посмотрю осциллографом что там на выходе, м.б. и обойдусь малой кровью, компаратор может еще понадобиться, так что можно кинуть в принципе какой-нить простенький ОУ на входе.

Probelzaelo
project_Ikar:

что такое по Вашему “аппаратно-заточенный под ШИМ вход” и что за чудо схемотехника стоит за этим входом, что он носит гордое название “аппаратно-заточенный”?..

Полагаю, ув. Blade, просто хотел сказать что принимать и обрабатывать ШИМ сигналы гораздо удобнее если использовать внешние аппаратные прерывания, вот и вся “заточка” справедливо это для 4 и 5 (но не 5 и 6 ) ног Атмеги8,168, 328, в Ардуино как раз, и чаще всего, именно два последние и используются, это внешние прерывания 0 и 1, . Действительно, для ввода ШИМ сигналов гораздо удобнее пользоваться именно этими портами Атмеги. Учитывая возможность использовать обработчик прерывания по любому(каждому) изменению логического состояния сигнала на входе, сам бог велел этим воспользоваться в своих целях )) Очень удобно, оказавшись в обработчике прерывания первым делом проверить состояние входа и в зависимости от того чем вызвано прерывание началом или окончанием импульса либо если начало то обнулить и запустить таймер, либо, если окончание, то прочесть из таймера и вычислить вполне точное значение длительности входного импульса… остальными “ногами” тоже вполне можно пользоваться для ввода ШИМ но тогда будет маловато времени для какой либо другой деятельности процессора, а его вполне можно бы использовать и с бОльшей пользой.

V_Alex

Да, это более правильный подход, но в жизни бывают ситуации, когда 16-разрядный таймер нужен для других целей. ИМХО для 90 % модельных приложений Мега не нужна. Очень хороши 24 и 25 тиньки.

Probelzaelo
V_Alex:

Попробую объяснить свою точку зрения. Рабочие коды коммерческих версий устройств выкладывать никто не будет. Project Ikar звучил это в соседней теме совершенно определенно. Я считаю это справедливым, поскольку затраты времени и здоровья на вылизывание софта могут быть весьма значительными.

Давайте определимся с тем что такое коммерческая версия устройства, очевидно что это устройство(либо хоть какая то его часть) производимое с целью извлечения коммерческой выгоды - продажи.
В остальных случаях секреты разработчика это просто его интеллектуальная собственность и делиться или нет этой собственностью с другими он сам вправе решать.

V_Alex
Probelzaelo:

Давайте определимся с тем что такое коммерческая версия устройства…

А чего тут определяться? Ваша точка зрения никак не противоречит моей. Каждый сам решает, как поступать со своими разработками. У меня иногда получается одновременно и делиться: www.rcdesign.ru/articles/…/battery_indicator и
наживаться: igva.ru/prd/led/10led/10led_1.htm, чего и Вам желаю 😃.

Probelzaelo
V_Alex:

У меня иногда получается одновременно и делиться: www.rcdesign.ru/articles/…/battery_indicator и
наживаться: igva.ru/prd/led/10led/10led_1.htm, чего и Вам желаю 😃.

Это правильно, но на мне в той же ситуации нажились китайцы )) hobbyking.com/…/__6589__Battery_Monitor_2_6S.html
впрочем я не проиграл, как то в цифрах понятнее, а с другой стороны при установке на борту, цвета различать даже проще чем циферки.
Но за вас я, в любом случае, очень радуюсь … ))

Boroda

Гланды конечно можно разными способами удалять…
В семействе восьмых мег есть превосходный механизм для аппаратного захвата и генерации шим. Даже представить не могу, как ещё можно использовать в модельном применении 16-бит таймер, кроме как для безджиттерного измерения и генерации сервосигналов? Есть выбор входа с цифровой ноги или с аналогового компаратора, есть подавление шума, есть регистр захвата значения таймера, есть гибкая генерация прерываний и флагов, есть механизм коррекции фазы и частоты по ICR для генерации PWM. И всё это аппаратное! За 48-ю мегу нынче просят денег меньше чем за тиньку. Так нет-же, люди продолжают искать джиттер и конфликты прерываний на свою голову!

harrystar
RL2000:

Правда, при попытке выдать принятый PWM на выход (через 16-битный таймер, т.к. основная программа занята), серва дергается. Дискретизация по времени приема PWM с сервотестера - порядка 52мкс, если ставить больше, как писали - 2000 тиков таймера на 2мс, то на основную программу просто не остается тактов процессора.

Складывается ощущение, что вы каждые 52 мкс (без всяких условий) уходите в прерывание, считываете состояние входа и ставите его на выходе.
Конечно будет дергаться, причем будет жрать много ресурсов, чем точнее, тем больше.
Алгоритм то совсем другой. Нужно сделать прерывание не по таймеру, а по изменению состояния входа. Соотв при старте импульса записывать значение таймера (который тикает примерно 2000 тиков или больше на 2 мс), а при окончании импульса вычитать записанное значение из текущего. Т.о. прерывание должно происходить всего 2 раза за 20 мс (100 раз в секунду) и на основную программу остается куча времени.

V_Alex
Boroda:

Гланды конечно можно разными способами удалять…
Даже представить не могу, как ещё можно использовать в модельном применении 16-бит таймер, кроме как для безджиттерного измерения и генерации сервосигналов?..

Можно, можно 😃 . Все зависит от конкретной задачи. Тут полстраницы ушло на обсуждение, как лучше организовать переключение сигнала с двух разных источников на одну серву. Правильный ответ - коммутатор на одном корпусе КМОП-логики за пять рублей. Считаем дальше: 13 тинька стоит 0,5-0,6 бакса. РУчная пайка одной ноги при мелкой серии - 2 цента и выше. И размер посадочного места (стоимость плате) тоже имеет значение. Если строить для себя в одном экземпляре - нет проблем (собственно с этого тема и начиналась). Если серию, то значение имеет каждый цент. Кусочек кода, который я выкладывал, из серийного изделия. Импульс обрабатывается в 16-разрядном режиме, соответственно джиттера нет. Прерывание там только одно - по WDT, других нет, соответственно нет и конфликтов. А 16-разрядный таймер бывает нужен, например, для организации 9-10 разрядного ШИМа, типа чтобы свечку от 12 Вольт калить. Кстати, в 24 тиньке он есть.

2 months later
eliash

Итак подошла к концу разработка первой версии БАНО.
Напомню, в начале я собрал на Arduino Demilanove и бредборде макет, потом хотел сделать шилд, но получилось много веса, в результате заказал Arduino Mini. Получилось нечто монстроидальное на 12,5 грамм без шнурков:

9 независимых каналов по 20 милиампер (максимум 40) и то на все про все запас 200 милиампер (больше АТмега не пускает через себя).
Первую версию кода я публиковал в этой ветке раньше.
Это была бета-версия, на которой откатывалось мое знакомство с AVR процессорами 😃
После началась борьба за граммы и стоимость, в результате получилась уже первая версия устройства:


Это уже подключился мой товарищ Костя, и мы разработали плату без шнурка 6 грамм, со шнурком 8 грамм. Оставлены интерфейсы для замены прошивки, так как на первой версии еще никто не останавливался 😃
Теперь нагрузка отделена от логики, есть возможность ее запитать отдельно (джамперами выставляется от бортового питания или подается отдельное питание), до 30 вольт и 4 ампер. Вдруг понадобятся мощные светодиоды или ленты на самолете…
Все так же 4 режима полета, (выключено, стоянка, взлет/посадка, полет), можно управлять яркостью огней с передатчика (не реализовано но возможность есть). На борту 2 диода, один зеленый - Power ON, второй синий - Signal (светиться когда есть сигнал с передатчика)

В следующей версии -

  1. управление яркостью для мощных нагрузок (возможность заложена в конструктив);
  2. подключение бузера для поиска модели при пропадании сигнала с передатчика. (возможность заложена в конструктив, надо спаять пьезу и дописать софт).

Это устройство можно собрать и на АТмеге8, без управления яркостью, разница в 2 долара с АТмегой168, вся схема получилась до 10 долларов, так что любителей PIC и Tiny не совсем понимаю, с учетом возможностей ATmega168…

П.С. Благодарю всех оказавших помощь в этом интересном мероприятии, перед зимой свет на самолете - это большое облегчение!
П.П.С. Видео с облетов не выкладываю в ввиду эксплуатации в пасмурные дни, когда фотоаппарат не очень эффективен в качестве камеры.

V_Alex
eliash:

Итак подошла к концу разработка первой версии БАНО…
Это устройство можно собрать и на АТмеге8, без управления яркостью, разница в 2 долара с АТмегой168, вся схема получилась до 10 долларов, так что любителей PIC и Tiny не совсем понимаю…

Э-э-э, зачэм абижаишь, дарагой 😃.
Вот БАНО на attiny 13A:


Наружу выходят 4 канала до 500 мА каждый. Два канала распараллелены под фары и крыльевые огни. Этот-же конструктив позволяет получить и “авто”-вариант с фарами дальнего и ближнего света + спецсигналы. Весит 6 грамм с корпусом.

Probelzaelo
eliash:

надо спаять пьезу и дописать софт

А ты расскажи плиз, софт полностью сам “сочинял” или какие то уже готовые библиотечки для ардуино использовал?
Если есть библиотеки, брось ссылочкой плиз.

eliash
V_Alex:

Э-э-э, зачэм абижаишь, дарагой 😃.
Вот БАНО на attiny 13A:

Наружу выходят 4 канала до 500 мА каждый.

Не хотел никого обидеть, разница в 2 грамма но функционал… хотя размер у вас меньше, как же так с весом получилось? Там на другой стороне ТО-220?
Я рассматривал тиньки, но у них каналов крайне мало, так что простой свет - да, но развития в этой платформе нет, разве что с переходом на тини2324 - а она по цене такая же как и АТмега168, при этом у атмеги ног больше, шимов больше, прерываний больше… управление питанием лучше… в общем, я что-то упускаю из виду?

Probelzaelo:

А ты расскажи плиз, софт полностью сам “сочинял” или какие то уже готовые библиотечки для ардуино использовал?
Если есть библиотеки, брось ссылочкой плиз.

Библиотек для ардуины готовых нет, так что “сочинял” сам…
Хотя для бузера, скорей всего, будет использована либа Tone - есть во всех поставках Arduino IDE, там же и пример использования. Если не придумаю как прокачать пьезо элемент менее обьемным способом.

Есть еще мысль добавить сенсор для батарейки и передатчик на землю, вот сейчас раскуриваю передачтик на 433 мгц, маленький и легкий, вот только пока не поддается укращению 😃

V_Alex
eliash:

Не хотел никого обидеть, разница в 2 грамма но функционал… хотя размер у вас меньше, как же так с весом получилось?

4,7 грамма плата с проводком и 1,2 грамма - коробочка.

eliash:

Я рассматривал тиньки, но у них каналов крайне мало, так что простой свет - да, но развития в этой платформе нет, разве что с переходом на тини2324 - а она по цене такая же как и АТмега168, при этом у атмеги ног больше, шимов больше, прерываний больше… управление питанием лучше… в общем, я что-то упускаю из виду?

Упускаете. Вообще-то, Вы делали БАНО. С соответствующим функционалом. Я просто показал, что именно этот функционал реализуется намного проще и дешевле. Ваша платформа дает намного больше возможностей, но то,что Вы затеяли сейчас, уже больше похоже на телеметрию 😉.

eliash
V_Alex:

Упускаете. Вообще-то, Вы делали БАНО. С соответствующим функционалом. Я просто показал, что именно этот функционал реализуется намного проще и дешевле. Ваша платформа дает намного больше возможностей, но то,что Вы затеяли сейчас, уже больше похоже на телеметрию 😉.

Ну БАНО как первый шаг к “бортовому компьютеру” и как знакомство с технологиями, я раньше с микроконтролерами дела не имел, надо было с чего-то начинать. Хотя да, я когда от беты пришел к первой версии, то пришлось запаять мосфеты по 4,1А на нагрузку, так как через микруху прокачать можно максимум 40 ма на порт и 200 на все порты в сумме, и когда получилось выходных 3 канала то можно было б заменить тинькой, но без ШИМ… А с сильными диодами надо регулировать яркость, иначе если близко летаешь - глаза выедает…

Ну телеметрия - это громко сказано, я всего лишь хочу получить контроль над зарядом батареи (6 резисторов на 3S и 3 аналоговых порта) да пару градусников поставить DS18B20 чтоб за регулем присмотреть. Ног много, чего добру пропадать, увеличение схемы - только второй этаж коробочки сделаю двухсторонний и окуратней будет и по весу может добавит пару грамм…

Probelzaelo

Библиотечки/примеры и тп есть, я уже копал, просто мне интересно было чем то из этих пользовался или нет, потому и спрашивал. Я недавно этой темой интересовался вот кое что нашлось, загляни может быть черпнешь полезного от импортных сотоварищей, тем более там есть ссылочки на очень похожие работки и что приятно включая програмство 😉

aeroquad.com/showthread.php?530-Da-DIY-PPM-Encoder
diydrones.com/…/do-you-want-an-ardupilotmega
diydrones.com/profiles/…/705844:BlogPost:38393
aeroquad.com/showthread.php?2999-Decoding-PPM-on-t…
в посту #2 ответ совершенно по теме 😉

а это, просто из раздела интересное, по близкой теме
www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=119392739…
www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=126247998…

Bare
eliash:

Библиотек для ардуины готовых нет, так что “сочинял” сам…

Я хочу собрать на arduino небольшой девайс для контроля бензинового двигателя. Мне надо считывать с приемника один канал(PWM) постоянно, и параллельно с пары датчиков. Не знаю как лучше читать с приемника, может покажите свой кусок кода по чтению сигнала с приемника?

eliash
Probelzaelo:

Библиотечки/примеры и тп есть, я уже копал, просто мне интересно было чем то из этих пользовался или нет, потому и спрашивал.

Ну я тоже гуглил, и много чего успел пересмотреть и прочитать, там главное концепцию понять - а дальше чужой код не всегда хорошо 😃
Кстати я тоже заметил, что буржуи намного больше кода публикуют на форумах, чем у нас… У нас если прогер написал 10 строк - то уже горд собой и ни с кем делиться не хочет, за исключением небольшого количества нормальных людей.
Да у них есть где подсмотреть…
я больше с серво-прокси смотрел, там хороший вариант захвата ппм с определением длины сигнала, но там тоже нет фильтрации помех, а я заметил что помех принимает и отдает приемник не мало, так что надо фильтровать все что меньше 0,9мс…

Bare:

Я хочу собрать на arduino небольшой девайс для контроля бензинового двигателя. Мне надо считывать с приемника один канал(PWM) постоянно, и параллельно с пары датчиков. Не знаю как лучше читать с приемника, может покажите свой кусок кода по чтению сигнала с приемника?

А можно больше информации? Дело в том, что с приемника PWM не идет… идет PPM и в начале темы есть мой код считывания.
Если вам надо получить данные от двух или более датчиков - то надо их опрашивать по очереди. если они не умеют сами постить данные по какому-нибудь протоколу (I2C,1wire,2wire)