roboforum.ru

Технический форум по робототехнике.

ATMEGA + серва: банальнейший трабл

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

ATMEGA + серва: банальнейший трабл

Сообщение Dmitri Vladimirovich » 06 июн 2011, 02:54

Может это тут и обсуждалось уже, лично я конкретного решения моё пробелмы не нашел.

Конфигурация железа -

ATmega1280 и китайския серва. Из под Ардуины прекрасно работающая.

И я пытаюсь её поднять на чистом Си

Пытаюсь управлять сервой от ШИМа OC2B - порт PB4.

8 бит, перескейлер выставлен на 256

врубаю программку, постепенно увеличуващую значение, записывающиеся в OC2B, от 0 до 255 и смотрю как при этом себя ведет серва. Дергаясь из стороны в сторону, серва, медленно, но уверенно, движется от примерно 30го градуса до 160го. Что за фигня?

Я эту проблему объясняю тем, что регистр ШИМа, вместе с длинной импульсов меняет и период.

Соотвественно не у всех временных интервалов он 20 мс, и серва на это реагирует неадекватьно.

Кто нибудь сталкивался с этой проблемой?

Как заставить ШИМ правильно работать?

Его можно на 16 бит перевести. Только непонятно как это поможет.

:)
#define TRUE FALSE
Dmitri Vladimirovich
 
Сообщения: 283
Зарегистрирован: 05 янв 2010, 23:07
Откуда: Красноармейск
Skype: dmitry.vladimirivich
ФИО: Дима.В.

Re: ATMEGA + серва: банальнейший трабл

Сообщение avr123.nm.ru » 06 июн 2011, 03:04

Удивительно как-то, а каким импульсом вы пытаетесь рулить сервой ???

Серво управление servo на AVR автономно или через ПК простой сервоконтроллер
www.proavr.narod.ru/z13.htm
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: ATMEGA + серва: банальнейший трабл

Сообщение Dmitri Vladimirovich » 06 июн 2011, 03:22

Каким импульсом - понятия не имею =)

То что таймер выдает

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

А вообще - может кто подскажет в инете какой-нибудь пример кода которому можно скормить желаемый угол поворота качалки сервы, прикрутить его к таймеру и он уже его заставит работать как надо, выдавать нужные импульсы?
#define TRUE FALSE
Dmitri Vladimirovich
 
Сообщения: 283
Зарегистрирован: 05 янв 2010, 23:07
Откуда: Красноармейск
Skype: dmitry.vladimirivich
ФИО: Дима.В.

Re: ATMEGA + серва: банальнейший трабл

Сообщение avr123.nm.ru » 06 июн 2011, 03:45

ссылка выше в инете. там пример кода.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: ATMEGA + серва: банальнейший трабл

Сообщение blindman » 06 июн 2011, 12:52

Да уж, гениально. Арифметика с плавающей точкой тут как раз в тему.

--
Какой то глюк у форума (или сервера?) Я свое сообщение постил в ответ на это : forum2/topic10150.html#p208802
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: ATMEGA + серва: банальнейший трабл

Сообщение רגוזין רומאן » 06 июн 2011, 13:07

Код: Выделить всёРазвернуть
void servo_new_position (uint16_t angle)
{
   OCR1A = (((angle/10)*11.5)-48);
}

void init_timer1 (void)
{
   sreg = SREG;
   TCNT1 = 0xB800;
   ICR1 = 0x0900;

   TCCR1A = _BV(COM1A1) | !_BV(COM1A0)            //   Both PWM outputs set at TOP,
         | _BV(COM1B1) | !_BV(COM1B0)         //   clear on compare match
         | !_BV(FOC1A) | !_BV(FOC1B)            //   PWM mode, can't force output
         | !_BV(WGM11) | !_BV(WGM10);            //   Fast PWM, TOP = ICR1

   TCCR1B = !_BV(ICNC1) | !_BV(ICES1)            //   Disable input capture noise canceler,
                                       //   edge select to negative.
         | _BV(WGM13) | !_BV(WGM12)            //   Fast PWM, TOP = ICR1
         | !_BV(CS12) | _BV(CS11) | _BV(CS10);   //   clk(i/o) / 64
   SREG = sreg;
}
רגוזין רומאן
 
Сообщения: 37
Зарегистрирован: 14 фев 2011, 12:00
ФИО: רגוזין רומאן

Re: ATMEGA + серва: банальнейший трабл

Сообщение Dmitri Vladimirovich » 06 июн 2011, 16:29

רגוזין רומאן , спасибо огромное за код!

все работает, так как надо, серва не дергается!

Оказывается все дело в одной гениальной строчке

OCR1A = (((angle/10)*11.5)-48);
#define TRUE FALSE
Dmitri Vladimirovich
 
Сообщения: 283
Зарегистрирован: 05 янв 2010, 23:07
Откуда: Красноармейск
Skype: dmitry.vladimirivich
ФИО: Дима.В.

Re: ATMEGA + серва: банальнейший трабл

Сообщение Drunya » 08 июн 2011, 16:55

Я бы умножил числитель и знаменатель на 2 и ушел от floating point.
Не мучался бы да сделал на К155ЛА:)
Глюк по-немецки означает "счастье"...
Аватара пользователя
Drunya
 
Сообщения: 196
Зарегистрирован: 05 июн 2007, 12:20
Откуда: Киев
прог. языки: C/C++, ASSEMBLER

Re: ATMEGA + серва: банальнейший трабл

Сообщение SkyZi » 28 дек 2013, 22:26

Не стал новую тему создавать.
Добрый вечер форумчане. Подскажите,как бы код модифицировать от avr123.nm.ru чтобы 3-4 сервака, вращались хотя бы на 150-160град?
Project "Hexxx" (in progress...)
Аватара пользователя
SkyZi
 
Сообщения: 133
Зарегистрирован: 27 окт 2011, 22:32
Откуда: Ростов-на-Дону
Skype: skyzi007
прог. языки: Python, Си (МК)
ФИО: Святослав Игоревич

Re: ATMEGA + серва: банальнейший трабл

Сообщение avr123.nm.ru » 29 дек 2013, 13:51

подправить диапазон изменения импульсов. там же все исходники с комментариями даны http://www.proavr.narod.ru/z13.htm только не все сервы могут так крутиться.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: ATMEGA + серва: банальнейший трабл

Сообщение SkyZi » 29 дек 2013, 15:20

Если бы комментарии были понятны, я не задавал вопроса.
1500 (127) - это середина у сервы, но она явно сильнее проворачивается чем крайние положения (1/254)
Project "Hexxx" (in progress...)
Аватара пользователя
SkyZi
 
Сообщения: 133
Зарегистрирован: 27 окт 2011, 22:32
Откуда: Ростов-на-Дону
Skype: skyzi007
прог. языки: Python, Си (МК)
ФИО: Святослав Игоревич

Re: ATMEGA + серва: банальнейший трабл

Сообщение Angel71 » 29 дек 2013, 16:00

SkyZi, если уверены, что тайминги правильные, так калибруйте серву.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: ATMEGA + серва: банальнейший трабл

Сообщение avr123.nm.ru » 30 дек 2013, 09:50

Что же я там непонятного написал? Посмотрите: // Вычислить длину имп. для сервы и вписать в OCR1A
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: ATMEGA + серва: банальнейший трабл

Сообщение SkyZi » 30 дек 2013, 12:57

Angel71 писал(а):SkyZi, если уверены, что тайминги правильные, так калибруйте серву.

а поточнее можно?
p.s. с армии вернулся. чуток разучился в программирование, сильно не "бейте"), и так не "ас" был)
Project "Hexxx" (in progress...)
Аватара пользователя
SkyZi
 
Сообщения: 133
Зарегистрирован: 27 окт 2011, 22:32
Откуда: Ростов-на-Дону
Skype: skyzi007
прог. языки: Python, Си (МК)
ФИО: Святослав Игоревич

Re: ATMEGA + серва: банальнейший трабл

Сообщение Angel71 » 30 дек 2013, 19:51

как так не бить ногами? не не не, так не пойдёт. :) шучу. под калибровкой в данном случае понимается нахождение каким управляющим импульсам соответствуют крайние положения сервы. нашли, что у неё крайние 500-2250 или 700-2400 или ещё какие, сможете подсчитать каким импульсам соответствует середина. при управлении каждой сервой потом используете эти значения для корректировки + если в крайнем положении это оно физически в ограничитель упирается, то очень желательно сделать запас хотя бы на 50, что бы серву не клинило.
а с управляющими импульсами... самый простой вариант - это просто посмотреть даталоггером и если нужно, то уже искать где косяк. проверить фьюзы, код, как вы там прерывания настраиваете, что у вас вообще в коде. кварц, кондёры и т.д. на плате. может проблема в электроинке сервы. в общем много вариантов что и как можно проверять.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 0

cron