Подписываемся на VK

Ежедневные новости, видео и приколы...

YouTube канал

Подбор моторов

TOP статьи

Вход




RC Магазины





Для удобства пользования форумом и поиска информации прошу придерживаться правила: 1 тема = 1 вопрос.

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

Исключение только в разделе Вопросы и обсуждения по статьям

Как выложить фото, Как опубликовать видео

С уважением,

Константин.

Сервозамедлитель своими руками

Сервозамедлитель своими руками

Здравстуйте, коллеги!
Горю большим желанием самому сделать сервозамедлитель!
Технологию изготовления плат ЛУТ освоил, с паяльником дружу,
но вот не задача, не могу разобраться с avr для Attiny13.
Пытаюсь разобраться с счетчиками.  Из найденного,  больше информации по 16 битным счетчикам.
Все что нашел для 8 бит, очень не понятно описано.
Прошу в помощи в написании кода.

wert
Сергей (Москва)
Ученик пилота
ranks
useravatar
Offline
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
Юрий (г.Волгоград)
Пилот
ranks
useravatar
Offline
1269 Сообщений
Мужчина  Дата рождения 
Администратор отключил публичную отправку сообщений

Re: Сервозамедлитель своими руками

Юrik написал(а):


Из Вашего поста не понятно, что хотите услышать в ответ? Если желаете научиться программированию микроконтроллеров, то по переписке это не выйдет. В и-нете полно статей с курсами программирования AVR от простейших программ, до сложных. Если не хотите изучать программирование, то ищите готовые прошивки для Ваших МК. Сервозамедление легко выполняется миксами на передатчиках, в которых более-менее серьёзная прошивка.
...

У меня spektrum dx6i.

С языком С я знаком, я не могу понять как настроить ШИМ.

Для работ использую fast PWM mode 3.
Для задания ширины импульса использую регистр сравнения OCR0A.
Логика такая - TCNT0 начинает считать, доходя до OCR0A меняется уровень сигнала меняется на высокий уровень, продолжает считать и доходя до 187 должно срабатывать прерывание и счетчик должен обнулиться , а уровень сменится на низкий.
частоту использую 9600 кГц, делитель 1024

wert
Сергей (Москва)
Ученик пилота
ranks
useravatar
Offline
98 Сообщений
Мужчина  Дата рождения 
Администратор отключил публичную отправку сообщений

Re: Сервозамедлитель своими руками

wert написал(а):

С языком С я знаком

Может я не прав, по моему лучше сосредоточиться на покупке готового сервозамедлителя. Посчитайте. Программатор для прошивки МК нужен? МК? Мелкие элементы обвязки? Плата? Разъемы? Время? Силы? Потом, лишнее оборудование в модели - добавочный вес. Не целесообразно лепить самопал, когда за 250р есть готовое трехканальное решение
http://www.hobbyking.com/hobbyking/stor … oduct=8863

Юrik
Юрий (г.Волгоград)
Пилот
ranks
useravatar
Offline
1269 Сообщений
Мужчина  Дата рождения 
Администратор отключил публичную отправку сообщений

Re: Сервозамедлитель своими руками

Юrik написал(а):

....

С экономической точки зрения вы правы!
Программатор есть,  рассыпуху найти не проблема.
Время и силы? так это же хобби, тут без этого никак.
Готовые решения, но на pic контроллерах весят не больше самой сервы.

Просто есть больше желание сделать самому.
По сути дела, если с этого форума убрать все темы, посвященные "сделай сам", то тут только пара тем и останется.

Изменено: konst
05-04-2013 14:35:20
wert
Сергей (Москва)
Ученик пилота
ranks
useravatar
Offline
98 Сообщений
Мужчина  Дата рождения 
Администратор отключил публичную отправку сообщений

Re: Сервозамедлитель своими руками

Тогда паяльник в руки. Будем ждать положительного результата и статью. Если получится - отлично, а не получится - ну, у нас у каждого что-то не получается.

Юrik
Юрий (г.Волгоград)
Пилот
ranks
useravatar
Offline
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 тактов и менять уровень.
http://www.extremeelectronics.co.in/avrtutorials/images/pwm_generation_animation.gif

wert
Сергей (Москва)
Ученик пилота
ranks
useravatar
Offline
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
Сергей (Москва)
Ученик пилота
ranks
useravatar
Offline
98 Сообщений
Мужчина  Дата рождения 
Администратор отключил публичную отправку сообщений

Re: Сервозамедлитель своими руками

В начале программы стоит ловушка, Насколько я понял дальше ее выполнение не пойдет.

Код:


   while(1)
   {
   
   }

alldn
Александр (г.Тамбов)
useravatar
Offline
2863 Сообщений
Мужчина  Дата рождения 
Администратор отключил публичную отправку сообщений

Re: Сервозамедлитель своими руками

Это пустой цикл, он ни на что не влияет.
А прерываниям такие циклы не страшны.
Подобный код у меня работал и в других программах.

wert
Сергей (Москва)
Ученик пилота
ranks
useravatar
Offline
98 Сообщений
Мужчина  Дата рождения 
Администратор отключил публичную отправку сообщений

Re: Сервозамедлитель своими руками

Да, это пустой цикл, из которого нет выхода.
Как только программа попадет в него, то там и останется. Прерывания будут работать а основная программа дальше этого цикла не пройдет.

alldn
Александр (г.Тамбов)
useravatar
Offline
2863 Сообщений
Мужчина  Дата рождения 
Администратор отключил публичную отправку сообщений

Re: Сервозамедлитель своими руками

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

wert
Сергей (Москва)
Ученик пилота
ranks
useravatar
Offline
98 Сообщений
Мужчина  Дата рождения 
Администратор отключил публичную отправку сообщений

Информация

Статистика форума:
 
Всего тем:
9972
Всего опросов:
79
Всего сообщений:
183067
Всего сообщений сегодня:
1
Пользователи форума:
 
Всего пользователей:
10085
Последним зарегистрировался:
Antonzx55
Пользователи онлайн:
0
Гостей онлайн:
590

Самые активные пользователи: 
konst, carpenter, kompmen, cnyx, Dragony, maks_dg, Goby, Student, alldn, nikolaypet
Онлайн: 
Нет пользователей онлайн
Последние сообщения форумаПоследние созданные темы
1) Расчет эффективного пропеллера вертолета, самолета
2) Зажигание на датчике холла
3) Аккумуляторная батарея LiPo HRB 14,8 4S 2200mA/h
4) На что заменить полетник на Iflight Protek25
5) Юлиус Пердана и SHURIK-1960
6) Помогите пожалуйста с вертолетом (управление)
7) Сервомотор ведет себя не адекватно
8) Полётный контроллер PixRacer r15 autopilot
9) Вопрос по ПК
10) Автопилот SN Sparrow Flight Controller
1) Расчет эффективного пропеллера вертолета, самолета - Как сделать пропеллер эффективным
2) Аккумуляторная батарея LiPo HRB 14,8 4S 2200mA/h
3) На что заменить полетник на Iflight Protek25 - сгорел полетник. ищу замену
4) Зажигание на датчике холла
5) Сервомотор ведет себя не адекватно - элероны
6) Помогите пожалуйста с вертолетом (управление) - Помогите пожалуйста с вертолетом (управление)
7) Вопрос по ПК - ПК фоксер ф722 v4, рагуль 1202 от fpv. Из этого сделать ЛК?
8) Продажа комплекта деталей для авиамоделирования - Здрaвcтвуйтe! Пpодaю кoмплект деталей для aвиамoделиpoвания
9) Полётный контроллер PixRacer r15 autopilot
10) радиоуправление квадрокоптером - забиндить приёмник RX2646H-DX с передатчиком RADIOMASTER