Помогите допилить проект на Attiny13

mix_mix

Добрый день пару дней назад меня тоже заинтересовала эта тема, я хочу сделать управление до шести составов на железной дороге.через мощный полевик планирую выдавать на рельса сигнал РРМ. в каждом локомотиве стоит приемник. Через колеса, диодный мост спрямляет переменный сигнал PPM и этим напряжением питает двигатели откликаясь на свой канал, у игроков пульт с одним резистором. Сейчас собираю материал, ваша статья самая интересная для меня но хотел бы вам показать еще эту статью nick_shl.at.tut.by/Work/Receiver.htm, В ней понравилась идея определения полярности сигнала и некоторый другие вещи инициализации сейчас не знаю правда на сколько это актуально потому как макет еще не делал но по описанию разумно. Программу постараюсь писать сам, не подглядывая к вам может потом найдем оптимальные коды и объединим результат. Давно ничего не писал правда, но дети хотят интересные игрушки буду вспоминать, начну в понедельник на работе дома не хватает времени. еще хочу учесть функцию тормоза при малых длительностях команды в пределах 1- 1,2мс, шунтировать двигатель через полевик.

Tester500

По ссылке проект, в котором на входе PPM, на выходе несколько PWM каналов. У меня это часть в приемнике. Я делаю схемку, которая принимает два PWM канала, на которых обычно висят сервы, и управляю двумя коллекторными движками. Подобную схему я не видел в инете, либо один контроллер на один движок. Хотя даже в одной тиньке сил хватает на два движка. Основная проблема с входным сигналом, я не знаю как приходят PWM импульсы, предполагаю что сигналы друг с другом вообще никак не связанны (может там два разных приемника).
Насчет питания - можно проще сделать - на рельсы подавать постоянный ток, и туда-же через конденсатор подмешивать полезный сигнал, на приемной стороне через такой-же конденсатор снимать сигнал.

mix_mix

Как я вижу вашу задачу, на входе по таймеру записываю число первого времени в один регистр, затем число второго времени в другой регистр. затем обсчет величин. Я предлагаю дискретность сделать равной десяти. и вычитать из числа эквивалента 1 мс наше подсчитанное число если флаг 0 или или отрицания то переход к заданию нуля на выходе шим, если флага нет, то вычитаем из 1,1мс, и т.д. до 2мс, при этом в цикле вычитания можно присваивать множитель переменной для последующего умножения шим или сразу эквивалент скважности. затем также второй канал. у вас на всю математику остается 16мс. можно уложиться с головой.

mix_mix

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

Tester500
mix_mix:

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

Допустим есть 8-битный регистр-счетчик времени и счет идет вверх по кругу (по достижению значения 255 он обнуляется и считает снова). Предположим у нас 10 шагов счетчика на максимальный сигнал на входе. В первый регистр заносим 254 (именно в этот момент сигнал на входе скакнул вверх), во второй регистр заносим 5. Как будет выглядеть обсчет величин? А если сигнал на входе отвис на два-три и т.д. периода регистра-счетчика?
Обычно делается не так. Берем регистр, при появлении сигнала на входе двигаем этот регистр вверх с проверкой граничных величин. Как тока сигнал на входе изменился, копируем полученное число в регистр переменную длительности сигнала на входе. Основной фокус проверка тех самых граничных величин.
Теперь о проблемах. В Attiny13 один 8-битный таймер и внутренний генератор частоты на 9.6 мГц. Для того чтобы получить на выходе не просто сигнал направления (для двигателя вперед-назад), а чтобы этот сигнал был ШИМом для движка, есть два способа - аппаратный ШИМ, и программный ШИМ. Программный шим я уже сделал, но у него очень низкая частота. Для увеличения частоты нужен аппартный ШИМ. Теперь математика - используем режим “Fast PWM TOP=0xFF” для таймера. У таймера три прерывания - два прерывания для ШИМ, и одно по переполнению. Прерывание по переполнению используем для обсчета входного сигнала. 9600000/256=37500. На входе сигнал 1 мсек =1кГц (вперед или назад) у нас 37,5 периодов таймера максимальное разрешение таймера. буду считать 36 влево или вправо, а 1 на границу нуля. Выходной сигнал от 0 до 255. 255/36 = семь с копейками. Значит полученное значение умножаем на 7 и в регистр сравнения таймера для формирования ШИМ. Остается снабдить эту конструкцию проверкой границ и определения рабочего выходного канала (вперед или назад).

Dinotron

Ну творчески вы подошли к решению. На тиньке! Я вот дармоед. Скопировал дурину и привинтил к китайским обломкам. Да не изящно, но все библиотеки в моём распоряжении и можно не заморачиваться с программно/аппаратной реализацией ШИМа. 😃 А вам, как говорится, респект и уважуха!