Для удобства пользования форумом и поиска информации прошу придерживаться правила: 1 тема = 1 вопрос.
К примеру, если обсуждается настройка передатчика, а у вас вопрос про подключение такого же передатчика к симулятору или вопрос про другую модель передатчика - создавайте новую тему. Если вы новичок в авиамоделизме, рекомендуется прочитать статью Новичку и ссылки с нее.
Исключение только в разделе Вопросы и обсуждения по статьям
Как выложить фото, Как опубликовать видео
С уважением,
Константин.
- Начало
- » Технологии моделизма
- » Наши электронные самоделки
- » Сервозамедлитель своими руками
Сервозамедлитель своими руками
Сервозамедлитель своими руками
Здравстуйте, коллеги!
Горю большим желанием самому сделать сервозамедлитель!
Технологию изготовления плат ЛУТ освоил, с паяльником дружу,
но вот не задача, не могу разобраться с avr для Attiny13.
Пытаюсь разобраться с счетчиками. Из найденного, больше информации по 16 битным счетчикам.
Все что нашел для 8 бит, очень не понятно описано.
Прошу в помощи в написании кода.
- wert
- Сергей (Москва)
- Ученик пилота
- 98 Сообщений
-
Re: Сервозамедлитель своими руками
wert написал(а):
Пытаюсь разобраться с счетчиками.
Из Вашего поста не понятно, что хотите услышать в ответ? Если желаете научиться программированию микроконтроллеров, то по переписке это не выйдет. В и-нете полно статей с курсами программирования AVR от простейших программ, до сложных. Если не хотите изучать программирование, то ищите готовые прошивки для Ваших МК. Сервозамедление легко выполняется миксами на передатчиках, в которых более-менее серьёзная прошивка.
В прошивке от ВитГо
V-CODER
Альтернативная прошивка
для передатчиков семейства
FlySky 9x, Turnigy 9x, Eurgle 9x
--------
По условиям микшер включен, когда включен выключатель GEAR, каналом
источником значения выступает сам выключатель GEAR, степень влияния 10%.
Небольшое пояснение про канал источник GEAR.
Дело в том, что для аппаратуры не важно, какой из UCH (пользовательский орган
управления) используется в микшере, фактически выключатель отличается от стика или
крутилки только тем, что у выключателя только два фиксированных значения, а у стика
или крутилки множество.
Таким образом, при использовании выключателя в микшере положение выключено у
него соответствует 0, а положение включено 1.
Такой микшер при включении изменит положение закрылков на 10% вниз.
Попробуйте на своей модели, возможно, вам придется реверсировать LCH 5, если
закрылки будут не опускаться, а подниматься. Либо можно реверсировать направление
движения закрылков изменением знака процента влияния (коэффициента микширования)
с -10% на +10%.
Подберите значение отклонения закрылков – возможно, что оптимальная величина
будет 15 или даже 20 % - все зависит от вашей модели.
В описанном варианте настроек значения канала CH 5 при включении GEAR
изменяются с 1500 до 1450 примерно за 2 сек.
------
Нафига городить огород из микроконтроллера, если можно сделать всё программно на пульте?
- Юrik
- Юрий (г.Волгоград)
- Пилот
- 1269 Сообщений
-
Re: Сервозамедлитель своими руками
Юrik написал(а):
Из Вашего поста не понятно, что хотите услышать в ответ? Если желаете научиться программированию микроконтроллеров, то по переписке это не выйдет. В и-нете полно статей с курсами программирования AVR от простейших программ, до сложных. Если не хотите изучать программирование, то ищите готовые прошивки для Ваших МК. Сервозамедление легко выполняется миксами на передатчиках, в которых более-менее серьёзная прошивка.
...
У меня spektrum dx6i.
С языком С я знаком, я не могу понять как настроить ШИМ.
Для работ использую fast PWM mode 3.
Для задания ширины импульса использую регистр сравнения OCR0A.
Логика такая - TCNT0 начинает считать, доходя до OCR0A меняется уровень сигнала меняется на высокий уровень, продолжает считать и доходя до 187 должно срабатывать прерывание и счетчик должен обнулиться , а уровень сменится на низкий.
частоту использую 9600 кГц, делитель 1024
- wert
- Сергей (Москва)
- Ученик пилота
- 98 Сообщений
-
Re: Сервозамедлитель своими руками
wert написал(а):
С языком С я знаком
Может я не прав, по моему лучше сосредоточиться на покупке готового сервозамедлителя. Посчитайте. Программатор для прошивки МК нужен? МК? Мелкие элементы обвязки? Плата? Разъемы? Время? Силы? Потом, лишнее оборудование в модели - добавочный вес. Не целесообразно лепить самопал, когда за 250р есть готовое трехканальное решение
- Юrik
- Юрий (г.Волгоград)
- Пилот
- 1269 Сообщений
-
Re: Сервозамедлитель своими руками
Юrik написал(а):
....
С экономической точки зрения вы правы!
Программатор есть, рассыпуху найти не проблема.
Время и силы? так это же хобби, тут без этого никак.
Готовые решения, но на pic контроллерах весят не больше самой сервы.
Просто есть больше желание сделать самому.
По сути дела, если с этого форума убрать все темы, посвященные "сделай сам", то тут только пара тем и останется.
05-04-2013 14:35:20
- wert
- Сергей (Москва)
- Ученик пилота
- 98 Сообщений
-
Re: Сервозамедлитель своими руками
Тогда паяльник в руки. Будем ждать положительного результата и статью. Если получится - отлично, а не получится - ну, у нас у каждого что-то не получается.
- Юrik
- Юрий (г.Волгоград)
- Пилот
- 1269 Сообщений
-
Re: Сервозамедлитель своими руками
Вот что я нашкодил.
//мк ATtiny13
//F_CPU = 9600000
#include <avr/io.h>
int main(void)
{
//Подключаем таймер к выводу OC0A
//Отключаем таймер от вывода OC0B
//Режим Fast PWM Mode – 3
TCCR0A = (1 << COM0A1)|(0 << COM0A0)|(0 << COM0B1)|(0 << COM0B0)|(1 << WGM01)|(1 << WGM00);
//делитель 1024
TCCR0B = (0 << WGM02) |(1 << CS02) |(0 << CS01) |(1 << CS00);
DDRB = 0xFF; //все выводы порта B настраиваем на выход
PORTB = 0x00; // на все выводы порта подаем 0
TCCR0 = 0x00; //останавливаем таймер
TCNT0 = 0x45; //записываем в регистр таймера число 69 = (256-187)
TCCR0 = 0x05; //запускаем таймер - clock/1024
OCR0A= 14; // 1500мкс
while (1) {}// Бесконечный цикл
}
Вот что я примерно хочу получить, только регистр сравнения OCR0A должен на 14 менять уровень, а TCNT0 должен отсчитывать 187 тактов и менять уровень.
- wert
- Сергей (Москва)
- Ученик пилота
- 98 Сообщений
-
Re: Сервозамедлитель своими руками
Был немного занят да столкнулся с некоторыми сложностями в понимании.
Поэтому было решено начать с сервореверса.
Паять МК в корпусе SOIC надо еще уметь, решил взять МК в DIP-8 ATtiny13.
Так же решил что самому генерировать ШИМ не обязательно, можно для этого использовать приемник.
Смысл такой:
На ногу INT0 приходит сигнал, он запускает таймер и открывает порты на сервы,
так как длина импульса канал с реверсом короче обычного канал, то я взял переменную, которая
является буфером для длины импульсы, то есть у меня идет запаздывание на 20мс.
обращение таймера к прерыванию идет каждые 10 мкс.
И с каждым обращением, идет обратный отсчет до закрытий каналов.
Смысл в том, что при поступлении входного импульса на ногу PB1 открываются PB0 и PB2, но спустя 10 мкс (одно прерывание таймера) они закрываются.
Не могу понять в чем дело.
Прошу прощения за немного сумбурное описание алгоритма.
wert написал(а):
#define F_CPU 9600000UL
#include <avr/io.h>
#include <avr/interrupt.h>
volatile unsigned int Tick; // 100KHz
volatile unsigned int inPulse; // длительность входного импульса
volatile unsigned int inPulseRev; // длительность реверса
volatile unsigned int inPulseBuf;
int main (void)
{
sei(); // разрешаем глобальные прерывания
//Port config
DDRB |= (1<<PB0)|(1<<PB2); // ножки PB0 и PB2 как выходы
DDRB |= (0<<PB1); // PB1 как вход
//Timer config
TCCR0A |= (1<<WGM01); // таймер в режиме CTC mode
TIMSK0 |= (1<<OCIE0A); // разрешаем прерывание CTC
TCCR0B |= (1<<CS00); // Без делителя
OCR0A = 95; // счетчик переполняется каждые 10 мкс
TCNT0 = 0;
//Var input
Tick = 0;
inPulse = 150;
inPulseBuf = 150;
//Int0 config
MCUCR |= (0<<ISC01)|(1<<ISC00); // прерывание по любому логическому изменению порта
GIMSK |= (1<<INT0); // разрешить прерывание INT0
while(1)
{
}
}
ISR(INT0_vect)
{
if (!(PINB & (1 << PB1)))
{
inPulse = inPulseBuf;
inPulseBuf = Tick; //считываем длину входного импульса
inPulseRev = 300 - inPulse; // длина импульса реверса
}
else
{
TCNT0 = 0; //обнуляем счетчик
Tick = 0; // обнуляем импульс
PORTB |= (1<<PB0)|(1<<PB2); //start pulse
}
}
ISR(TIM0_COMPA_vect)
{
Tick = Tick + 1;
if (inPulse > 0)
{
inPulse = inPulse - 1;
}
else
{
PORTB &= ~(1<<PB0);
}
if (inPulseRev > 0)
{
inPulseRev = inPulseRev - 1;
}
else
{
PORTB &= ~(1<<PB2);
}
}
- wert
- Сергей (Москва)
- Ученик пилота
- 98 Сообщений
-
Re: Сервозамедлитель своими руками
В начале программы стоит ловушка, Насколько я понял дальше ее выполнение не пойдет.
Код:
while(1)
{
}
- alldn
- Александр (г.Тамбов)
- 2863 Сообщений
-
Re: Сервозамедлитель своими руками
Это пустой цикл, он ни на что не влияет.
А прерываниям такие циклы не страшны.
Подобный код у меня работал и в других программах.
- wert
- Сергей (Москва)
- Ученик пилота
- 98 Сообщений
-
Re: Сервозамедлитель своими руками
Да, это пустой цикл, из которого нет выхода.
Как только программа попадет в него, то там и останется. Прерывания будут работать а основная программа дальше этого цикла не пройдет.
- alldn
- Александр (г.Тамбов)
- 2863 Сообщений
-
Re: Сервозамедлитель своими руками
Вся логика в прерываниях, там и идет вся обработка.
- wert
- Сергей (Москва)
- Ученик пилота
- 98 Сообщений
-
- Начало
- » Технологии моделизма
- » Наши электронные самоделки
- » Сервозамедлитель своими руками
Информация
- Статистика форума:
- Всего тем:
- 9948
- Всего опросов:
- 79
- Всего сообщений:
- 183174
- Всего сообщений сегодня:
- 1
- Пользователи форума:
- Всего пользователей:
- 10173
- Последним зарегистрировался:
- urus_vp
- Пользователи онлайн:
- 0
- Гостей онлайн:
- 1544
- Самые активные пользователи:
- konst, carpenter, kompmen, cnyx, Dragony, maks_dg, Goby, Student, alldn, nikolaypet
- Онлайн:
- Нет пользователей онлайн