Как принять сигнал с приемника в AVR (PWM|Digital)
Спасибо! 😃
Ну, я “сишник”, за ассемблером к отцу пойду, он у меня спец по нему. В принципе всё понятно, попробую это на си портировать, но чувствуется без прерывания не обойтись.
Код делался под примитивную задачу, хотелось обойтись без прерываний.
Александр, а не поясните пжлст: что значит
Импульс снимается в прямом цикле
? Т.е. как я понимаю программа в бесконечном цикле (jmp loop) проверяет изменение сигнала на входе (1 или 0) и уже потом обрабатывает его?
Не проще запретить внешнее прерывание?
Такой способ не подойдет, задумал вообще не считывать PWM-сигнал с приемника. Сразу с приемника на сервопривод, а в нужный момент отобрать линию у приемника. Разве что ставить дополнительную микросхему и передавать тщательно вычисленную длительность через UART или еще как.
Сразу с приемника на сервопривод
отобрать линию у приемника
дополнительную микросхему и передавать тщательно вычисленную длительность через UART
это как??😃 В любом случае придется процессор в разрыв тогда ставить.
… как я понимаю программа в бесконечном цикле (jmp loop) проверяет изменение сигнала на входе (1 или 0) и уже потом обрабатывает его?
Именно так. После инициализации запрыгиваем в бесконечный цикл. Если на входе 4 установилась единица, значит там сервоимпульс. Вот его и меряем. Замер заканчивается с окончанием импульса и наступлением синхропаузы (на входе 4 - ноль). Дальше делаем с импульсом все, что нам надо и, по аналогичной замеру методе, выводим его на любую другую лапку камня. Можно еще раз обработать и вывести на еще одну лапку.
Главное - уложиться в синхропаузу (18 мс). Обработали, вывели, расслабились. Ждем, пока на входе 4 не закончится ноль. Как закончился, перепрыгиваем к обработке входного импульса и все повторяется по-новой.
По хорошему перед первым замером пару импульсов лучше пропустить, чтобы не влезть в середину импульса. После замера можно проверить импульс на попадание в допустимые пределы.
Именно так.
Все гениальное простоB-)
Спасибо, попробую повторить оное на сях в меге.
На тиньке 13 по другому сделать и не получится у нее нет 16 битного таймера и входа ICP. А вот на меге желательно использовать встроенные аппаратные ресурсы.
Вначале вы правильно решили вводить импульс при помощи ICPи выводить ШИМ.
Ввод и вывод в фоновом режиме под прерываниями, между ними обработка импульса.
При этом джитер измерения и вывода импульса минимальный и на обработку остается вагон времени.
Есть несколько тонкостей чисто аппаратных.
Советую использовать ICPвход не напрямую, а через встроенный аналоговый компаратор, у меги есть функция их сцепки. В этом случае исчезнут проблемы с уровнями сигнала от приемника.
Выводить импульс удобнее при помощи прерывания Compare соответствующего выхода.
Кварц удобней использовать на 8 МГц тогда при установке делителя 16 битного таймера счетчика на 8. Мы получаем 1 тик таймера =1 микросекунда. Проще будет потом производить расчеты в программе.
Счетчик не перезагружаем, пусть молотит по кругу. Все измерения импульсов производим как разность показаний счетчика в начале и в конце импульса.
ага, спасибо огромное за науку! В принципе я так и думал что так правильно, просто терзали сомнения успеет ли камень обрабатывать новый входящий импульс, в то время как PWM генерит текущий обсчитанный. про компаратор - посмотрю осциллографом что там на выходе, м.б. и обойдусь малой кровью, компаратор может еще понадобиться, так что можно кинуть в принципе какой-нить простенький ОУ на входе.
что такое по Вашему “аппаратно-заточенный под ШИМ вход” и что за чудо схемотехника стоит за этим входом, что он носит гордое название “аппаратно-заточенный”?..
Полагаю, ув. Blade, просто хотел сказать что принимать и обрабатывать ШИМ сигналы гораздо удобнее если использовать внешние аппаратные прерывания, вот и вся “заточка” справедливо это для 4 и 5 (но не 5 и 6 ) ног Атмеги8,168, 328, в Ардуино как раз, и чаще всего, именно два последние и используются, это внешние прерывания 0 и 1, . Действительно, для ввода ШИМ сигналов гораздо удобнее пользоваться именно этими портами Атмеги. Учитывая возможность использовать обработчик прерывания по любому(каждому) изменению логического состояния сигнала на входе, сам бог велел этим воспользоваться в своих целях )) Очень удобно, оказавшись в обработчике прерывания первым делом проверить состояние входа и в зависимости от того чем вызвано прерывание началом или окончанием импульса либо если начало то обнулить и запустить таймер, либо, если окончание, то прочесть из таймера и вычислить вполне точное значение длительности входного импульса… остальными “ногами” тоже вполне можно пользоваться для ввода ШИМ но тогда будет маловато времени для какой либо другой деятельности процессора, а его вполне можно бы использовать и с бОльшей пользой.
Да, это более правильный подход, но в жизни бывают ситуации, когда 16-разрядный таймер нужен для других целей. ИМХО для 90 % модельных приложений Мега не нужна. Очень хороши 24 и 25 тиньки.
Попробую объяснить свою точку зрения. Рабочие коды коммерческих версий устройств выкладывать никто не будет. Project Ikar звучил это в соседней теме совершенно определенно. Я считаю это справедливым, поскольку затраты времени и здоровья на вылизывание софта могут быть весьма значительными.
Давайте определимся с тем что такое коммерческая версия устройства, очевидно что это устройство(либо хоть какая то его часть) производимое с целью извлечения коммерческой выгоды - продажи.
В остальных случаях секреты разработчика это просто его интеллектуальная собственность и делиться или нет этой собственностью с другими он сам вправе решать.
Давайте определимся с тем что такое коммерческая версия устройства…
А чего тут определяться? Ваша точка зрения никак не противоречит моей. Каждый сам решает, как поступать со своими разработками. У меня иногда получается одновременно и делиться: www.rcdesign.ru/articles/…/battery_indicator и
наживаться: igva.ru/prd/led/10led/10led_1.htm, чего и Вам желаю 😃.
У меня иногда получается одновременно и делиться: www.rcdesign.ru/articles/…/battery_indicator и
наживаться: igva.ru/prd/led/10led/10led_1.htm, чего и Вам желаю 😃.
Это правильно, но на мне в той же ситуации нажились китайцы )) hobbyking.com/…/__6589__Battery_Monitor_2_6S.html
впрочем я не проиграл, как то в цифрах понятнее, а с другой стороны при установке на борту, цвета различать даже проще чем циферки.
Но за вас я, в любом случае, очень радуюсь … ))
Гланды конечно можно разными способами удалять…
В семействе восьмых мег есть превосходный механизм для аппаратного захвата и генерации шим. Даже представить не могу, как ещё можно использовать в модельном применении 16-бит таймер, кроме как для безджиттерного измерения и генерации сервосигналов? Есть выбор входа с цифровой ноги или с аналогового компаратора, есть подавление шума, есть регистр захвата значения таймера, есть гибкая генерация прерываний и флагов, есть механизм коррекции фазы и частоты по ICR для генерации PWM. И всё это аппаратное! За 48-ю мегу нынче просят денег меньше чем за тиньку. Так нет-же, люди продолжают искать джиттер и конфликты прерываний на свою голову!
Правда, при попытке выдать принятый PWM на выход (через 16-битный таймер, т.к. основная программа занята), серва дергается. Дискретизация по времени приема PWM с сервотестера - порядка 52мкс, если ставить больше, как писали - 2000 тиков таймера на 2мс, то на основную программу просто не остается тактов процессора.
Складывается ощущение, что вы каждые 52 мкс (без всяких условий) уходите в прерывание, считываете состояние входа и ставите его на выходе.
Конечно будет дергаться, причем будет жрать много ресурсов, чем точнее, тем больше.
Алгоритм то совсем другой. Нужно сделать прерывание не по таймеру, а по изменению состояния входа. Соотв при старте импульса записывать значение таймера (который тикает примерно 2000 тиков или больше на 2 мс), а при окончании импульса вычитать записанное значение из текущего. Т.о. прерывание должно происходить всего 2 раза за 20 мс (100 раз в секунду) и на основную программу остается куча времени.
Гланды конечно можно разными способами удалять…
Даже представить не могу, как ещё можно использовать в модельном применении 16-бит таймер, кроме как для безджиттерного измерения и генерации сервосигналов?..
Можно, можно 😃 . Все зависит от конкретной задачи. Тут полстраницы ушло на обсуждение, как лучше организовать переключение сигнала с двух разных источников на одну серву. Правильный ответ - коммутатор на одном корпусе КМОП-логики за пять рублей. Считаем дальше: 13 тинька стоит 0,5-0,6 бакса. РУчная пайка одной ноги при мелкой серии - 2 цента и выше. И размер посадочного места (стоимость плате) тоже имеет значение. Если строить для себя в одном экземпляре - нет проблем (собственно с этого тема и начиналась). Если серию, то значение имеет каждый цент. Кусочек кода, который я выкладывал, из серийного изделия. Импульс обрабатывается в 16-разрядном режиме, соответственно джиттера нет. Прерывание там только одно - по WDT, других нет, соответственно нет и конфликтов. А 16-разрядный таймер бывает нужен, например, для организации 9-10 разрядного ШИМа, типа чтобы свечку от 12 Вольт калить. Кстати, в 24 тиньке он есть.
Удалил. не та ветка…
Итак подошла к концу разработка первой версии БАНО.
Напомню, в начале я собрал на Arduino Demilanove и бредборде макет, потом хотел сделать шилд, но получилось много веса, в результате заказал Arduino Mini. Получилось нечто монстроидальное на 12,5 грамм без шнурков:
9 независимых каналов по 20 милиампер (максимум 40) и то на все про все запас 200 милиампер (больше АТмега не пускает через себя).
Первую версию кода я публиковал в этой ветке раньше.
Это была бета-версия, на которой откатывалось мое знакомство с AVR процессорами 😃
После началась борьба за граммы и стоимость, в результате получилась уже первая версия устройства:
Это уже подключился мой товарищ Костя, и мы разработали плату без шнурка 6 грамм, со шнурком 8 грамм. Оставлены интерфейсы для замены прошивки, так как на первой версии еще никто не останавливался 😃
Теперь нагрузка отделена от логики, есть возможность ее запитать отдельно (джамперами выставляется от бортового питания или подается отдельное питание), до 30 вольт и 4 ампер. Вдруг понадобятся мощные светодиоды или ленты на самолете…
Все так же 4 режима полета, (выключено, стоянка, взлет/посадка, полет), можно управлять яркостью огней с передатчика (не реализовано но возможность есть). На борту 2 диода, один зеленый - Power ON, второй синий - Signal (светиться когда есть сигнал с передатчика)
В следующей версии -
- управление яркостью для мощных нагрузок (возможность заложена в конструктив);
- подключение бузера для поиска модели при пропадании сигнала с передатчика. (возможность заложена в конструктив, надо спаять пьезу и дописать софт).
Это устройство можно собрать и на АТмеге8, без управления яркостью, разница в 2 долара с АТмегой168, вся схема получилась до 10 долларов, так что любителей PIC и Tiny не совсем понимаю, с учетом возможностей ATmega168…
П.С. Благодарю всех оказавших помощь в этом интересном мероприятии, перед зимой свет на самолете - это большое облегчение!
П.П.С. Видео с облетов не выкладываю в ввиду эксплуатации в пасмурные дни, когда фотоаппарат не очень эффективен в качестве камеры.
Итак подошла к концу разработка первой версии БАНО…
Это устройство можно собрать и на АТмеге8, без управления яркостью, разница в 2 долара с АТмегой168, вся схема получилась до 10 долларов, так что любителей PIC и Tiny не совсем понимаю…
Э-э-э, зачэм абижаишь, дарагой 😃.
Вот БАНО на attiny 13A:
Наружу выходят 4 канала до 500 мА каждый. Два канала распараллелены под фары и крыльевые огни. Этот-же конструктив позволяет получить и “авто”-вариант с фарами дальнего и ближнего света + спецсигналы. Весит 6 грамм с корпусом.
надо спаять пьезу и дописать софт
А ты расскажи плиз, софт полностью сам “сочинял” или какие то уже готовые библиотечки для ардуино использовал?
Если есть библиотеки, брось ссылочкой плиз.