roboforum.ru

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

Управление сервами

Управление сервами

Korbofos » 20 сен 2011, 09:19

Не могу разобраться в чём проблема :cry:
Взял код (из робовики) управления сервами при помощи 4017 счётчика
Код: Выделить всёРазвернуть

uint16_t servo_position[9] = {3000 //для среднего положения

volatile uint32_t i;


SIGNAL(SIG_OUTPUT_COMPARE1A)
{
   
   static uint8_t current_servo = 1;
   
   
   static uint16_t pause = 40000;

   
   TCCR1A |= _BV(FOC1A);

   if (current_servo == 9) {
      current_servo = 0;
      OCR1A += pause;
      pause = 40000;
   } else {
      
      OCR1A += servo_position[current_servo];
      pause -= servo_position[current_servo];
      current_servo++;
   }
}


Переделал все значения под частоту 7.3728
в итоге получилось
Код: Выделить всёРазвернуть
interrupt [TIM3_COMPC] void timer3_compc_isr(void)
{
static char current_servo=1;
static unsigned int pause = 18432;

TCCR3C|=(1<<FOC3C);
       
        if (current_servo == 9)
        {
         current_servo = 0;
         OCR3C += pause;
         pause = 18432;
        }
        else
        {
         OCR3C+=servo_position[current_servo];
         pause -= servo_position[current_servo];
         current_servo++;
        }
}     
servo_position[9]={1382 //среднее положение

Пред делитель счётчика на 8
Серва работает некорректно дергается сдвигается в сторону при заданном среднем
положении :shock:
Подскажите где ошибка?

Re: Управление сервами

avr123.nm.ru » 20 сен 2011, 09:55

Форму и время сигналов посмотрите в PROTEUS или осцилом

Re: Управление сервами

Korbofos » 20 сен 2011, 11:07

Протеус кажет.
Но как так (1<<FOC3C) бит принудительного сброса?

Добавлено спустя 2 минуты 1 секунду:
Может посмотреть в железе осцилупой? Но чё то боюсь своими кривыми руками лезть...
Вложения
pr.JPG
pr.JPG (15.06 КиБ) Просмотров: 2707

Re: Управление сервами

avr123.nm.ru » 20 сен 2011, 13:03

Вот длинющий импульс похоже и колбасит вашу серву.

переключите осцил PROTEUS в режим DC пост. ток и покрупней покажите цену деления по времени укажите.

Re: Управление сервами

Korbofos » 20 сен 2011, 14:31

Счётчик неправильно считает?
Код: Выделить всёРазвернуть
#define OCR3C (*(unsigned int *) 0x82) //прописал сам как 16 битовую переменную может //здесь косяк?
//файл mega128.h
#define OCR3CL (*(unsigned char *) 0x82)
#define OCR3CH (*(unsigned char *) 0x83)

//--------------------------------
TCCR3C|=(1<<FOC3C);
       
        if (current_servo == 9)
        {
         current_servo = 0;
         OCR3C += pause;
         pause = 18432;
        }
        else
        {
         OCR3C+=servo_position[current_servo];
         pause -= servo_position[current_servo];
         current_servo++;
        }



проект выложить?
Вложения
12.JPG

Re: Управление сервами

avr123.nm.ru » 20 сен 2011, 14:47

Давно пора. Вам нужны импульсы шириной 1500 мкС каждые 20000 мкС а у вас меандр похоже. Время примерное.

Re: Управление сервами

Korbofos » 20 сен 2011, 14:56

Вот оно.
Вложения
ADC.rar
(127.82 КиБ) Скачиваний: 0

Re: Управление сервами

avr123.nm.ru » 20 сен 2011, 14:59

А где у вас 4017 ?

добавил 4017 - servo импульсы стали нормальные, но все слишком долго даже при 8 МГц такта.
Вложения
servo_avr_hc4017.rar
(253.53 КиБ) Скачиваний: 0
servo_4017.png

Re: Управление сервами

Korbofos » 20 сен 2011, 15:22

Дк выходящий сигнал с мк уже не тот.

Добавлено спустя 1 минуту 27 секунд:
avr123.nm.ru писал(а):А где у вас 4017 ?

добавил 4017 - servo импульсы стали нормальные, но все слишком долго даже при 8 МГц такта.

Пересчитать?

Добавлено спустя 9 минут 31 секунду:
Почему 1 на выходе сразу не сбрасывается(обведено кружком)?
TCCR3C|=(1<<FOC3C); Этот бит в прерывании сразу должен сбрасывать 1 в 0.
Вложения
11.JPG
23.JPG

Re: Управление сервами

Korbofos » 20 сен 2011, 20:01

Почему то не срабатывает сброс ножки в 0??????
Код: Выделить всёРазвернуть
TCCR3C|=(1<<FOC3C);

Re: Управление сервами

ALHIMIK » 20 сен 2011, 20:31

потому что CVAVR
сам с таким сталкивался , решение которое нашел - дёргать лапки программно

Re: Управление сервами

avr123.nm.ru » 20 сен 2011, 20:37

Korbofos писал(а):Почему то не срабатывает сброс ножки в 0??????
Код: Выделить всёРазвернуть
TCCR3C|=(1<<FOC3C);
Дак в PROTEUS разверните АСМ подстрочник под Си кодом и посмотрите почему.

Re: Управление сервами

Korbofos » 20 сен 2011, 21:06

Asm я незнаю :cry:

Re: Управление сервами

avr123.nm.ru » 20 сен 2011, 21:08

Значит снова выкладывайте прожект.

Re: Управление сервами

Korbofos » 20 сен 2011, 21:11

Вот.
Вложения
ADC.rar
(129.94 КиБ) Скачиваний: 0


cron
Rambler\'s Top100 Mail.ru counter