Как принять сигнал с приемника в AVR (PWM|Digital)
С тем же успехом можно сказать, что это сопротивление стика передается от аппы к серве
Формально так и есть. Пока все аналоговые сервотехнологии не распродадутся, PWM сервосигнал останется стандартом. Он по сути является конкретным маркетингово-технологическим тупиком. Сейчас никто не решится наводнить RC мир своей разработкой полностью цифрового канала кодер-модуль-приёмник-серва. Если “пофутуризировать”, то ШИМ сервы умрут наверное только с интеграцией в корпус радиомодуля. Т.е. приёмник как отдельный девайс исчезнет, сервы сами будут и приёмниками, и сателитами друг для друга.
поэтому кажется вполне логичным подобное решение (кстати когда-то повторял и был вполне доволен его работой).
Открыл .asm по ссылке, начиная со строки 417 то, о чём я и говорил. Генерация последовательная, не убедили.
Пока все аналоговые сервотехнологии не распродадутся, PWM сервосигнал останется стандартом.
Ну так PWM, а не PPM. Человек же утверждает, что:
PPM передается от апы к серве, а остальное все промежуточное
Это я знаю. Про эту библиотеку я все прочитал. Не могу понять по ее исходникам - какие таймеры она использует на ATmega328.
Описания мег в serv.h:
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#elif defined(__AVR_ATmega32U4__)
#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
#elif defined(__AVR_ATmega128__) ||defined(__AVR_ATmega1281__)||defined(__AVR_ATmega2561__)
если ничего не подошло, то
#else // everything else
#define _useTimer1
typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t ;
#endif
тем более что там есть фраза:
Servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2
ну и до кучи:
* If _useTimerX is defined then TimerX is a 16 bit timer on the curent board
* timer16_Sequence_t enumerates the sequence that the timers should be allocated
* _Nbr_16timers indicates how many 16 bit timers are available.
Из pdf на Atmega328:
Peripheral Features
– Two 8-bit Timer/Counters with Separate Prescaler and Compare Mode
– One 16-bit Timer/Counter with Separate Prescaler, Compare Mode, and Capture Mode
Вот этот 16-битный и используется (Timer3)
Сейчас никто не решится наводнить RC мир своей разработкой полностью цифрового канала кодер-модуль-приёмник-серва.
Ну флагман то впереди. Футаба S-bus уже продается и переход на подобные стандарты (точнее отход от ппм-стандартов) - дело времени. Даже вшивый спектрум дх5 - уже на порядок приблизился к полностью цифровой аппаратуре. тракт модуль - сателит - практически прозрачный UART. Ацп измеряет напряжение на резюках стиков и контроллер приемника формирует шим для серв. Все остальное - сплошная цифра.
Ну флагман то впереди. Футаба S-bus уже продается и переход на подобные стандарты (точнее отход от ппм-стандартов) - дело времени
Ктоб сомневался. Вон у турниги в стандартной прошивке тоже есть выбор: PPM, PCM. Если про PPM в принципе все понятно и проблем с приемником нет, то про PCM полный БКТ (большая китайская тайна)
Ну так PWM, а не PPM. Человек же утверждает, что:
Человек утверждает, что на данный момент PWM каналы объеденены в кадры с использованием синхро и разделительных импульсов по спецификации PPM. Причем сам PPM жестко не стандартизован. Вот кстати повод для творчества - чего-бы не забубенить какой-нибудь опен-стандарт на это дело. Если самодельщики (кастом фирмварщики) начнут его придерживаться, то и производители начнут подтягиваться. Ардуино пошел-же в массы.
PS: главное название красивое придумать 😃
Опять двадцать пять 😃
на данный момент PWM каналы объеденены в кадры с использованием синхро и разделительных импульсов по спецификации PPM
Где в приемнике PPM? На каком этапе и откуда он там появляется?
У всех он меняется дискретно. Просто дискретность может быть большей или меньшей 😃.
Да, только в “аналоге” она определяется размером зерна графита на дорожке потенциометра.
В приложенной картинке - дрожание сигнала при стике в центре. Получается плюс-минус 1 дискрет.
Радует, когда практика совпадает с теорией 😃. А картинки красивые и наглядные.
Нужна небольшая консультация:
- Есть внешние прерывания INT0 и INT1, которые веся на PD2 и PD3
- Есть прерывание по изменению состояния портов с PD0 по PD7 - PCINT2.
Если я повешу первый обработчик на INT0 (PD2) а второй на PCINT2, и у меня придет сигнал на PD2, то сработают оба прерывания?
Если PCINT18 не закрыт маской в PCMSK2, то выставятся оба флага PCIF2 и INTF0. Временные задержки на 1-3 клика слишком мудрёные, если это критично, читайте в даташите. Прерывания сгенерируются по приоритету векторов, INT0 будет первым.
Где в приемнике PPM? На каком этапе и откуда он там появляется?
А какая разница где оно в приемнике? На вход передатчика идет PPM.
У меня в приемнике три чипа - приемо-передатчик, контроллер, память. Вот в контроллере из PPM канальные импульсы и берутся.
Да, только в “аналоге” она определяется размером зерна графита на дорожке потенциометра.
А при чем тут тогда Турнига? 😃 Разве есть какая-то современная аппаратура, не переводящая аналоговый графит в дискретную цифру? 😃
А какая разница где оно в приемнике? На вход передатчика идет PPM.
И на этом PPM заканчивается. Приемник вообще не знает что такое PPM.
Вот в контроллере из PPM канальные импульсы и берутся.
Я не спрашиваю откуда берутся канальные импульсы. Я спрашиваю откуда там берется PPM. А то как-то странно - вдруг откуда ни возьмись возник PPM и давай лезть в контроллер 😃
Еще раз повторяю. Пока еще без иллюстраций. Контроллер аппы замеряет сопротивление стиков (напряжение на них), оцифровывает, кодирует в PPM и отдает в этом виде передатчику. Передатчик принимает PPM как аналоговый сигнал, оцифровывает его и передает в эфир пакеты байтов. Приемник принимает пакеты байтов и отдает контроллеру приемника. Контроллер приемника на основе принятых байтов формирует ШИМ по каналам и раздает их потребителям (сервы, ESC, гироскопы и т.д.). Нет никакого PPM в приемниках. Не передается PPM к серве, как Вы утверждаете. Не выходит PPM за пределы аппы, да и там он просто пережиток прошлого (тупой частотной или амплитудной модуляции ВЧ в старых аппах) и применяется до сих пор лишь для стандартизации интерфейса между аппой и передатчиком.
Вот накидал тестовую программку для ардуино, на основе исходников одного коптера (aeroquad). Читает 4 канала. Правил на основе своих скудных знаний, часть кода так и не понял до конца. 😦 Тестировал на серво-тестере (аппы рядом нет), пробовал цеплять тестер сразу на 4 канала, вроде читает. Если зацепить только на один канал, то несколько секунд все нормально, потом появляется паразитный сигнал на других каналах. Почему? Я понять не могу. Еще один глюк, неизвестный мне, : если в самом начале скетча не объявить любую переменную типа байт, то компилироваться не хочет, ругается на ошибки определения переменных. Реализовано на одном прерывание.
На ардуино, приемник, цеплять на 4,5,6,7 digital pin или на меге PCINT20,PCINT21,PCINT22,PCINT23.
Еще один глюк, неизвестный мне, : если в самом начале скетча не объявить любую переменную типа байт, то компилироваться не хочет, ругается на ошибки определения переменных.
В RC_CH4.H на 42 строке есть такое:
const int getRaw(byte channel)
Вот компилятор и ругается:
In file included from rc_pwm.cpp:5:
rc_ch4.h:42: error: ‘byte’ has not been declared
В RC_CH4.H на 42 строке есть такое:
const int getRaw(byte channel)
Вот компилятор и ругается:
In file included from rc_pwm.cpp:5:
rc_ch4.h:42: error: ‘byte’ has not been declared
byte - тип переменной.
channel - имя переменной.
На что тут ругаться?
А если я напишу byte bbbbb1; перед инклудом? то почему не ругается?
P.S. Программированием , последний раз, я занимался лет 8 назад. Может я что-то совсем забыл. Вроде переменная объявлена правильно, или я не прав? Подскажите plz…
Если кусок кода с ошибками перенести из .h в основной код, то ошибки нет. Как там настроено с обработкой .h разбираться надо.
PS:
Если не секрет, что вообще планируется? А то брать проект и ковырять его куски обычно сложнее чем собрать свое.
Возможно компилятор, видя в исходнике тип byte автоматом подключает определение этого типа… Хотя он должен и в заголовочнике так же реагировать, так что это вопрос реализации компилера 😃
Вставьте в начало заголовочника
#ifndef byte
#define byte unsigned char
#endif
Ну или как в этом компиляторе выглядит директива прекомпилера #ifndef (может #ifnotdef или #if !defined())
Если кусок кода с ошибками перенести из .h в основной код, то ошибки нет. Как там настроено с обработкой .h разбираться надо.
PS:
Если не секрет, что вообще планируется? А то брать проект и ковырять его куски обычно сложнее чем собрать свое.
Значит все таки глюк препроцессора, Для препроцессора инклуд, это просто вставить указанный файл в инклуде, в текущий. И по идее инклуд = перенос кода в основной. Я раньше сталкивался с подобными проблемами, когда забывал поставить скобку или точку с запятой где-то.
Планируется собрать устройство на ардуино нано имеющее следующий функционал :
- Цепляется к датчику холла искрового зажигания или ставится свой датчик холла на выходной вал двигателя.
- Возможность подключения дисплея к устройству для использования его в качестве тахометра, и для настройки устройства.
- К устройству подключается канал газа и серва газа.
- Устройство контролирует минимальные обороты, и не дает им опускаться ниже заданных.
- Возможность задать кривую газу, для аппаратуры которая это не поддерживают.
- И еще что-то придумается по дороге.
Первоначально, я хотел написать библиотечку для считывания с каналов приемника сигнала. А то без нее остальное не получится.
Соответственно исходники потом выложить народу под GNU.
весь проект
www.buildyourowndrone.co.uk/…/ppm-e8ch.htm
исходный код
api.ning.com/files/…/ap_ppm_encoder.zip
весь проект
www.buildyourowndrone.co.uk/…/ppm-e8ch.htm
исходный код
api.ning.com/files/…/ap_ppm_encoder.zip
Эх, это я видел. Только там делается всё с помощью таймера. А я этого хотел избежать. Кстати, зачем нужен подтягивающий резистор?
Кстати, зачем нужен подтягивающий резистор?
R3?
А без таймера никак. Чем еще времянку мерить? Либо аппаратный таймер и процессор свободен, или программный процессор этим занят.
R3?
А без таймера никак. Чем еще времянку мерить? Либо аппаратный таймер и процессор свободен, или программный процессор этим занят.
Без дополнительного таймера сейчас все отлично работает. Используется только стандартная функция micros();. Помехи на других каналах убрал с помощью включения встроенного подтягивающего резистора. Теперь осталось только все привести в красивый вид - оформить в виде стандартной библиотеки для ардуино. Ниже пример работы с сервой, подключенной на 9 цифровой пин ардуино.