roboforum.ru

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

Помогите разобраться с программной частью для сервопривода

Помогите разобраться с программной частью для сервопривода

space » 16 апр 2008, 23:07

Вообщем написал программку для работы сервы, но только так, что серва двигается только в одну сторону, а когда нажимаю сброс, то резко в другую.
Вот сама прога подскажите, что нужно сделать:
Код: Выделить всёРазвернуть
#include <avr/io.h>
#include <avr/delay.h>
#define OUT PORTC
#define servo PC1
#define K_DELAY_ms   F_CPU/600
void Delay_ms(unsigned char t) {
  if (t==0) return;
  unsigned int i;
  while (t--) for(i=0;i<K_DELAY_ms; i++);
}
int main(void)
{
PORTC=0x02;
DDRC=0xFD;
while (1){
{
cbi(PORTC, servo);
Delay_ms(100); 
sbi(PORTC, servo);
Delay_ms(100);
}
}
}

Вот видео того, что получилось:
http://ru.youtube.com/watch?v=VMf0dhCwEAw
Вложения
FJ2FVLUFDO29C6M.MEDIUM.jpg
Нужно сделать вот так как у этого робота. Ссылка на видео http://www.instructables.com/id/How-to-build-your-first-robot/
Последний раз редактировалось space 16 апр 2008, 23:17, всего редактировалось 1 раз.

Re: Помогите разоьраться с програмной частью для сервопривода

avr123.nm.ru » 16 апр 2008, 23:16

space писал(а):Вот сама прога подскажите, что нужно сделать:


А чего нужно добится ? Тех задание сформулируйте ЧЁТКО ! и однозначно.

Re: Помогите разобраться с программной частью для сервопривода

space » 16 апр 2008, 23:20

AVR взгляни пожалуйста вот на это видео, которое тут http://www.instructables.com/id/How-to- ... rst-robot/ . Вот то что робот вытворяет этой сервой, то и нужно мне. То есть чтобы серва крутилась сначало в одну сторону потом в другую :)

Re: Помогите разобраться с программной частью для сервопривода

Aesthete Animus » 16 апр 2008, 23:47

space писал(а):Вообщем написал программку для работы сервы, но только так, что серва двигается только в одну сторону, а когда нажимаю сброс, то резко в другую.
Вот сама прога подскажите, что нужно сделать:

Разобраться в том, как управлять сервами и переписать прогу. Если Вы подадите на управляющий контакт сервы меандр с полупериодом 100мс, то она совершенно не обязана на это реагировать. Опять-таки - разберитесь с таймерами и делайте это на них, не используя задержек.

Re: Помогите разобраться с программной частью для сервопривода

avr123.nm.ru » 17 апр 2008, 09:44

space писал(а):чтобы серва крутилась сначало в одну сторону потом в другую :)


Тогда нужно каждые 20 мС подавать на серву сигнал управления меняющийся,
например, от 900 до 2100 мкС и обратно .

Таймеры - это задача 6 курса по AVR - http://avr123.nm.ru/z6.htm

ШИМ - это задача 8 курса по AVR - http://avr123.nm.ru/z8.htm

Добавлено спустя 31 минуту 47 секунд:
С паузами алгоритм В ПСВЕВДОКОДЕ ( http://avr123.nm.ru/z1.htm ) такой:

Код: Выделить всёРазвернуть
Импульс 1500   (серва по центру)

while (1) {            // Цикл  бесконечный 

проверка - если импульс больше 2100 то добавка (шаг сервы в мкС) отрицательная  -20 например.

проверка - если импульс меньше 900 то добавка положительная  20 например.

добавить добавку к текушеу значению импульса.

дать на среву "1"

выждать паузу длиной в импульс

дать на серву "0"

выждать 18 мСек

}

Re: Помогите разобраться с программной частью для сервопривода

space » 17 апр 2008, 14:30

Пока вроде получилось, чтобы в две стороны крутилась серва, но только резко, а мне надо чтобы серва крутилась плавно. Для компилятора WinAVR
Код: Выделить всёРазвернуть
#include <avr/io.h>
#define OUT PORTC
#define servo PC1
#define K_DELAY_ms   F_CPU/600
void Delay_ms(unsigned char t) {
  if (t==0) return;
  unsigned int i;
  while (t--) for(i=0;i<K_DELAY_ms; i++);
}
int main(void)
{
PORTC=0x02;
DDRC=0xFD;
while (1){
{
cbi(PORTC, servo);
Delay_ms(250); 
sbi(PORTC, servo);
Delay_ms(0);
cbi(PORTC, servo);
Delay_ms(250); 
sbi(PORTC, servo);
Delay_ms(250);
}
}
}


Добавлено спустя 14 минут 8 секунд:
а с мС не получается:
Код: Выделить всёРазвернуть
#include <avr/io.h>
#define OUT PORTC
#define S_UL2 PC1 
int main(void)

char i;
PORTC=0x02;
DDRC=0xFD;
i = 0;
while(1)
{
if (i == 0)
{
S_UL2 = 0; 
delay_us(400);
i = 1;}

}

Пишет, что
servo.c:17: error: invalid lvalue in assignment
servo.c:18: warning: implicit declaration of function `delay_us'

Re: Помогите разобраться с программной частью для сервопривода

avr123.nm.ru » 17 апр 2008, 15:49

space писал(а):а мне надо чтобы серва крутилась плавно.


Алгоритм выше !

Re: Помогите разобраться с программной частью для сервопривода

space » 17 апр 2008, 21:42

Только подскажи начало программы, а дальше сам попытаюсь разобраться
Код: Выделить всёРазвернуть
#include <avr/io.h> <- правильное ли начало?
#define OUT PORTC
#define servo PC1
Импульс 1500   (серва по центру) <- вот это, что должно быть

Re: Помогите разобраться с программной частью для сервопривода

avr123.nm.ru » 18 апр 2008, 01:06

space писал(а):Только подскажи начало программы, а дальше сам попытаюсь разобраться

Импульс 1500 (серва по центру) <- вот это, что должно быть


просто запись числа 1500 в переменную определяющую сколько времени (в микроСек)
на серву будет подаваться лог. "1"

Можно кончечно и с числами от 0 до 255 работать.

====================

1) возьмите ВОЛШЕБНЫЙ шаблон для быстрого создания приложения AVR в CVAVR с симуляцией в VMLAB.

2) Установите CVAVR и VMLAB в папки C:CVAVR и C:VMLAB - эти ДВЕ супер проги - качать 7 Мб всего !

3) шаблон распакуйте и полученую папку переименуйте в "SERVO" и поместите ее в корень диска С: вот так C:SERVO
инструкции есть в файле "_ReadMe For code testing and USART.txt" и в файлах проектов .prj

4) запустите VMLAB и откройте проект - vmlab.prj - сделайте в меню "Проджект" - "РеБилд Олл" - зеленый сфетофор должен

загореться. Разместите на экране удобно окна: "Контрол панел", "Скоп", "Код. тагет"

5) нажмите 3 раза сфетовор - начнется продолжительная симуляция. Порадуйтесь. Теперь вы уверены что симулятор пашет.

6) остановите симуляцию и откройте файл vmlab.prj для редактирования и строку

.plot V(PC0) V(PC1) V(PC2) V(PC3) V(PC4) V(PC5) V(PC6) V(PC7) V(PD1)

замените на:

.plot V(PC1)

теперь на осциллограф будет выводится тольконога PC1 - сигнал на серву.

7) в CVAVR откройте проект - cv.prj - будем править исходник под задачу управления серво по алгоритму


Импульс 1500 (серва по центру)

while (1) { // Цикл бесконечный

проверка - если импульс больше 2100 то добавка (шаг сервы в мкС) отрицательная -20 например.

проверка - если импульс меньше 900 то добавка положительная 20 например.

добавить добавку к текушеу значению импульса.

дать на среву "1"

выждать паузу длиной в импульс

дать на серву "0"

выждать 18 мСек

}


8) после строки #include <delay.h> объявим глобальные переменные

Код: Выделить всёРазвернуть
char servo_pulse = 150;   // длина импульса для среднего положения SERVO - (150 * 10) мкС 

char servo_cw = 1;       
// "1" servo крутится по часовой, если "0" то импульс убавляется - крутится против часовой
char ctr; // просто - счетчик.


9) приветствие putsf("Hello world"); заменил на такое putsf("Servo ramping");


10) бесконечный цикл переписал так:

Код: Выделить всёРазвернуть
while(1){ 
           
// изменение направления движения SERVO

if (servo_pulse > 210) { // если импульс 2100 мкС
    servo_cw = 0;        // убавлять длину импульса
                       }
                       
if (servo_pulse < 90) { // если импульс 900 мкС
    servo_cw = 1;       // прибавлять длину импульса
                       }                     

// изменение ширины импульса

if (servo_cw == 0) { // если нужно убавить
    servo_pulse --;  // убавить длину импульса на 10 мкС
                   }

if (servo_cw == 1) { // если нужно прибавить
    servo_pulse ++;  // увеличить длину импульса на 10 мкС
                   }

// вывод импульса на серву

ctr = servo_pulse;

putchar(ctr); // вывести длину импульса на серво в десятках микросекунд

PORTC.1 = 1;  // подать на серву лог. "1"

while (ctr) { // отсчет паузы
   ctr --;
   delay_us(10); // пауза 10 мкС
             }
PORTC.1 = 0;  // подать на серву лог. "0"

// delay_ms(17); // пауза между импульсами на серву 17 милиСек
delay_ms(1); // пауза ДЛЯ УСКОРЕНИЯ симуляции 1 мС

         }

11) компилируем "мэйк зе проджект" - ошибок нет.

12) запустите VMLAB и откройте проект - vmlab.prj - сделайте в меню "Проджект" - "РеБилд Олл" - зеленый сфетофор должен

загореться. Вертикальное разрешение в SCOPE я сделал 1 вольт а горизонтальное 2 mS.

13) 3 раза нажмите на светофор - пойдет симуляция и появится надпись "Servo ramping" затем цифры длины импульса в SCOPE

будут видны импульсы на серву - остановите симуляцию. В окне TTY в "сет параметрс" установите "Numeric (decimel)".

14) Продолжайте симуляцию и смотрите за изменением длины импулса.


В PROTEUS вы можете подключить модель сервы и посмотреть как она будет двигаться.
Как это сделать - http://oProteus.narod.ru

Для PROTEUS и для реального устройства нужно паузу между импульсами сделать 17 мС !!!

=========

Всё, пошел спать ...

Добавлено спустя 35 минут 45 секунд:
=========

не спалось - сделал проект для PROTEUS - серва там прикольно движется ...
Вложения
PROTEUS.rar
(9.24 КиБ) Скачиваний: 105
servo_proteus.png
servo.rar
(15.13 КиБ) Скачиваний: 88

Re: Помогите разобраться с программной частью для сервопривода

Myp » 18 апр 2008, 09:39

это будет ещё один урок для курса ? :oops:

Re: Помогите разобраться с программной частью для сервопривода

rig » 18 апр 2008, 09:58

авр ведь можешь когда захочешь нормальнь ответить.
скачал, поглядел: наглядно, просто и просто красиво.
:good:

Re: Помогите разобраться с программной частью для сервопривода

space » 18 апр 2008, 10:31

AVR, спасибо огромное. Теперь буду разбираться и переделывать код под компилятор WinAVR

Re: Помогите разобраться с программной частью для сервопривода

avr123.nm.ru » 18 апр 2008, 11:29

space писал(а):AVR, спасибо огромное.

Не за что.
space писал(а):Теперь буду разбираться и переделывать код под компилятор WinAVR

Советую переделать и сделать на таймерах по задачам 6 и 8курса.

Re: Помогите разобраться с программной частью для сервопривода

Master » 18 апр 2008, 14:16

А я вот чего замутил :)
+ таблица значений в Екселе какую задержку на какой угол.
И вообще зачем делать на таймерах если например паучек всегда использует одни и те же углы ног когда идет?
Вложения
.JPG
углов.zip
(4.93 КиБ) Скачиваний: 77
Servo_my.zip
(50.5 КиБ) Скачиваний: 82

Re: Помогите разобраться с программной частью для сервопривода

avr123.nm.ru » 18 апр 2008, 14:48

Master писал(а):А я вот чего замутил :)

Прикольно ! :Bravo:
Master писал(а):зачем делать на таймерах если например паучек всегда использует одни и те же углы ног когда идет?

1. Для обучения 2. Чтоб у МК было свободное от счета пауз время - вдруг захочется чем то дополнить прогу.

Добавлено спустя 17 минут 54 секунды:
Master писал(а):А я вот чего замутил :)


жаль что сервы КОЛОМ стоят ... Вот так ИМХО поприкольней будет ...

Изображение
Вложения
SERVO 8 шт в PROTEUS ATmega16.rar
(17.93 КиБ) Скачиваний: 102


Rambler\'s Top100 Mail.ru counter