Подписываемся на 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 Сообщений
Мужчина  Дата рождения 
Администратор отключил публичную отправку сообщений

Информация

Статистика форума:
 
Всего тем:
9971
Всего опросов:
79
Всего сообщений:
183067
Всего сообщений сегодня:
1
Пользователи форума:
 
Всего пользователей:
10084
Последним зарегистрировался:
Jocker-vit
Пользователи онлайн:
0
Гостей онлайн:
1199

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