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

Tester500
AndyBig:

Так то когда было. Вы посмотрите какие сейчас чипы стоят в передатчиках - они в принципе не умеют формировать PPM. У них на выходе пакеты цифры с различного типа модуляцией.

Турнига, та самая - дешевая. Да, у нее внутри Atmega168, но между контроллером и передатчиком PPM (если не выбран PCM). Без разницы чем и как формируется PPM - ЛА3 в режиме генератора или 555 или на транзисторах или контроллер. Суть PPM не меняется - он аналоговый. Цифровой это PCM. Вот в нем не времянки гуляют, а вполне конкретное число.

V_Alex:

А в контроллерных шифраторах передатчиков аналоговый сигнал оцифровывается в АЦП и в режиме РРМ уходит в эфир с соответствующей дискретностью.

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

V_Alex:

а нынче гурманам 4096 подавай

не совсем понятно, если серва делает 360гр, то 360/4096=на один шаг ~0.088гр
нашиша? палец на стике этого не поймет. 😃
Другое дело если народ из одного канала делает кучу дискретных, но счас проще перейти на PCM.

AndyBig
Tester500:

Да, у нее внутри Atmega168, но между контроллером и передатчиком PPM (если не выбран PCM). Без разницы чем и как формируется PPM - ЛА3 в режиме генератора или 555 или на транзисторах или контроллер. Суть PPM не меняется - он аналоговый.

Я говорил о передатчике. О ВЧ-модуле. Посмотрите какая микросхема там стоит в качестве передатчика, выдающего готовый к эфиру ВЧ-сигнал.
Промежуточный PPM между аппой и передатчиком - дань универсальности, чтобы можно было поставить другой ВЧ-модуль и он работал. И это не только в дешевой турниге. Сам радиомодуль оцифровывает PPM и в эфир уходят пакеты байтов. Так что если в приемнике производитель специально не озадачился сформировать PPM из приходящих данных (так, на всякий случай, вдруг кому понадобится), то его там и не будет 😃

V_Alex

В Турниговском РРМ длительность импульса меняется дискретно, у классики - плавно. Разница, как между винилом и МР3.
То, что оставлен РРМ при передаче, дань старому стандарту совместимости аппаратур. На этапе между приемником и сервой это и сейчас основной стандарт. Не хотят фирмы терять покупателей, вот и диназаврят помаленьку, многократно перегоняя цифру в аналог и обратно, теряя в качестве сигнала на каждом преобразовании.
А энкодер можно, но дорого. Даже хороший потенциометрический датчик стоит дороже турниги целиком.

Boroda
msv:

А в реале в этом случае слишком велика вероятность оказаться в одном прерывании при срочной необходимости обрабатывать другое. Я бы, со своей колокольни, никогда бы так не делал (и не делаю…).

Эту проблему не так уж и трудно разрулить продуманой организацией тайминга и блокирующими прерываниями. Про программный сдвиг - я не говорил, что это есть хорошо. Я лишь сказал, что пока почти все делают так. Если это не коммерческая тайна, расскажите о взгляде с вашей колокольни, как, а если точнее, то на чём бы вы сделали независимую раздачу сигнала на сервы? Коммерческий проект, восьмиканальный приёмник среднего ценового уровня, дискретность… скажем всего 10 бит?

msv:

Если в глобальном масштабе- по любому надо быть готовым, что декодер приемника не обязан выдавать канальные PWM с определенным, нам удобным, фазовым сдвигом…

Да, я высказал мысль, что в ближайшие 2-3 года в большинстве случаев как раз можно быть готовым к удобному для нас фазовому сдвигу. Готов свои слова подтвердить осциллограммами, правда с не очень широким охватом рынка. Буду искренне рад, если моё предположение с треском опровергнут таким же способом.

msv

В моем проекте прием PPM и генерация канальных PWM далеко не основные задачи, решаются максимально простым способом- захват PPM через ICP, вывод- аппаратным ШИМ.
Реализация декодера на проце дает большие возможности обработки входного сигнала чем простой сдвиговый регистр (как мин. простейшая проверка достоверности пакета, реализация failsave), поэтому кажется вполне логичным подобное решение (кстати когда-то повторял и был вполне доволен его работой).

Boroda:

Да, я высказал мысль, что в ближайшие 2-3 года в большинстве случаев как раз можно быть готовым к удобному для нас фазовому сдвигу.

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

AndyBig
V_Alex:

В Турниговском РРМ длительность импульса меняется дискретно, у классики - плавно.

У всех он меняется дискретно. Просто дискретность может быть большей или меньшей 😃

Boroda:

Да, я высказал мысль, что в ближайшие 2-3 года в большинстве случаев как раз можно быть готовым к удобному для нас фазовому сдвигу.

Насколько я понимаю, некоторые именитые производители используют и в приемниках и в передатчиках заказные микросхемы. А от них можно ждать чего угодно, и 10 аппаратных ШИМ на борту в том числе.
Ну а попроще - да. В приложении осциллограмма 8-канальной Турниги. Синий - первый канал, остальные синхронизированы по нему.

Заодно еще данные по Турниге:
Минимальная ширина импульса - 1.014640 мсек
Максимальная ширина импульса - 1.909740 мсек
Дискретность изменения ширины: 0.0001 мсек
В приложенной картинке - дрожание сигнала при стике в центре. Получается плюс-минус 1 дискрет.

Bare
Tester500:

Помогу, в этой библиотеке: Servo - Class for manipulating servo motors connected to Arduino pins. Это для управления сервоприводами, которые висят на ногах контроллера.

Это я знаю. Про эту библиотеку я все прочитал. Не могу понять по ее исходникам - какие таймеры она использует на ATmega328.

Tester500
AndyBig:

Промежуточный PPM между аппой и передатчиком - дань универсальности, чтобы можно было поставить другой ВЧ-модуль и он работал.

Это PPM передается от апы к серве, а остальное все промежуточное. Если завтра прилетят далекие братья по разуму, и отдадут две коробочки - одна как влитая встанет в апу на место передатчика, а у второй будут стандартные 8 каналов-выходов, и скажут что теперь апа может работать мгновенно через всю галактику, это все равно будет старый добрый аналоговый PPM.

AndyBig
Tester500:

Это PPM передается от апы к серве

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

Boroda
AndyBig:

С тем же успехом можно сказать, что это сопротивление стика передается от аппы к серве

Формально так и есть. Пока все аналоговые сервотехнологии не распродадутся, PWM сервосигнал останется стандартом. Он по сути является конкретным маркетингово-технологическим тупиком. Сейчас никто не решится наводнить RC мир своей разработкой полностью цифрового канала кодер-модуль-приёмник-серва. Если “пофутуризировать”, то ШИМ сервы умрут наверное только с интеграцией в корпус радиомодуля. Т.е. приёмник как отдельный девайс исчезнет, сервы сами будут и приёмниками, и сателитами друг для друга.

msv:

поэтому кажется вполне логичным подобное решение (кстати когда-то повторял и был вполне доволен его работой).

Открыл .asm по ссылке, начиная со строки 417 то, о чём я и говорил. Генерация последовательная, не убедили.

AndyBig
Boroda:

Пока все аналоговые сервотехнологии не распродадутся, PWM сервосигнал останется стандартом.

Ну так PWM, а не PPM. Человек же утверждает, что:

Tester500:

PPM передается от апы к серве, а остальное все промежуточное

Tester500
Bare:

Это я знаю. Про эту библиотеку я все прочитал. Не могу понять по ее исходникам - какие таймеры она использует на 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)

Aleksey_Gorelikov
Boroda:

Сейчас никто не решится наводнить RC мир своей разработкой полностью цифрового канала кодер-модуль-приёмник-серва.

Ну флагман то впереди. Футаба S-bus уже продается и переход на подобные стандарты (точнее отход от ппм-стандартов) - дело времени. Даже вшивый спектрум дх5 - уже на порядок приблизился к полностью цифровой аппаратуре. тракт модуль - сателит - практически прозрачный UART. Ацп измеряет напряжение на резюках стиков и контроллер приемника формирует шим для серв. Все остальное - сплошная цифра.

Tester500
Aleksey_Gorelikov:

Ну флагман то впереди. Футаба S-bus уже продается и переход на подобные стандарты (точнее отход от ппм-стандартов) - дело времени

Ктоб сомневался. Вон у турниги в стандартной прошивке тоже есть выбор: PPM, PCM. Если про PPM в принципе все понятно и проблем с приемником нет, то про PCM полный БКТ (большая китайская тайна)

AndyBig:

Ну так PWM, а не PPM. Человек же утверждает, что:

Человек утверждает, что на данный момент PWM каналы объеденены в кадры с использованием синхро и разделительных импульсов по спецификации PPM. Причем сам PPM жестко не стандартизован. Вот кстати повод для творчества - чего-бы не забубенить какой-нибудь опен-стандарт на это дело. Если самодельщики (кастом фирмварщики) начнут его придерживаться, то и производители начнут подтягиваться. Ардуино пошел-же в массы.
PS: главное название красивое придумать 😃

AndyBig

Опять двадцать пять 😃

Tester500:

на данный момент PWM каналы объеденены в кадры с использованием синхро и разделительных импульсов по спецификации PPM

Где в приемнике PPM? На каком этапе и откуда он там появляется?

V_Alex
AndyBig:

У всех он меняется дискретно. Просто дискретность может быть большей или меньшей 😃.

Да, только в “аналоге” она определяется размером зерна графита на дорожке потенциометра.

AndyBig:

В приложенной картинке - дрожание сигнала при стике в центре. Получается плюс-минус 1 дискрет.

Радует, когда практика совпадает с теорией 😃. А картинки красивые и наглядные.

Bare

Нужна небольшая консультация:

  1. Есть внешние прерывания INT0 и INT1, которые веся на PD2 и PD3
  2. Есть прерывание по изменению состояния портов с PD0 по PD7 - PCINT2.
    Если я повешу первый обработчик на INT0 (PD2) а второй на PCINT2, и у меня придет сигнал на PD2, то сработают оба прерывания?
Boroda

Если PCINT18 не закрыт маской в PCMSK2, то выставятся оба флага PCIF2 и INTF0. Временные задержки на 1-3 клика слишком мудрёные, если это критично, читайте в даташите. Прерывания сгенерируются по приоритету векторов, INT0 будет первым.

Tester500
AndyBig:

Где в приемнике PPM? На каком этапе и откуда он там появляется?

А какая разница где оно в приемнике? На вход передатчика идет PPM.
У меня в приемнике три чипа - приемо-передатчик, контроллер, память. Вот в контроллере из PPM канальные импульсы и берутся.

AndyBig
V_Alex:

Да, только в “аналоге” она определяется размером зерна графита на дорожке потенциометра.

А при чем тут тогда Турнига? 😃 Разве есть какая-то современная аппаратура, не переводящая аналоговый графит в дискретную цифру? 😃

Tester500:

А какая разница где оно в приемнике? На вход передатчика идет PPM.

И на этом PPM заканчивается. Приемник вообще не знает что такое PPM.

Tester500:

Вот в контроллере из PPM канальные импульсы и берутся.

Я не спрашиваю откуда берутся канальные импульсы. Я спрашиваю откуда там берется PPM. А то как-то странно - вдруг откуда ни возьмись возник PPM и давай лезть в контроллер 😃
Еще раз повторяю. Пока еще без иллюстраций. Контроллер аппы замеряет сопротивление стиков (напряжение на них), оцифровывает, кодирует в PPM и отдает в этом виде передатчику. Передатчик принимает PPM как аналоговый сигнал, оцифровывает его и передает в эфир пакеты байтов. Приемник принимает пакеты байтов и отдает контроллеру приемника. Контроллер приемника на основе принятых байтов формирует ШИМ по каналам и раздает их потребителям (сервы, ESC, гироскопы и т.д.). Нет никакого PPM в приемниках. Не передается PPM к серве, как Вы утверждаете. Не выходит PPM за пределы аппы, да и там он просто пережиток прошлого (тупой частотной или амплитудной модуляции ВЧ в старых аппах) и применяется до сих пор лишь для стандартизации интерфейса между аппой и передатчиком.

Bare

Вот накидал тестовую программку для ардуино, на основе исходников одного коптера (aeroquad). Читает 4 канала. Правил на основе своих скудных знаний, часть кода так и не понял до конца. 😦 Тестировал на серво-тестере (аппы рядом нет), пробовал цеплять тестер сразу на 4 канала, вроде читает. Если зацепить только на один канал, то несколько секунд все нормально, потом появляется паразитный сигнал на других каналах. Почему? Я понять не могу. Еще один глюк, неизвестный мне, : если в самом начале скетча не объявить любую переменную типа байт, то компилироваться не хочет, ругается на ошибки определения переменных. Реализовано на одном прерывание.
На ардуино, приемник, цеплять на 4,5,6,7 digital pin или на меге PCINT20,PCINT21,PCINT22,PCINT23.

rc_pwm.zip