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

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

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

Сообщение 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 раз.
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света
Аватара пользователя
space
 
Сообщения: 565
Зарегистрирован: 17 июн 2007, 23:44
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич

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

Сообщение avr123.nm.ru » 16 апр 2008, 23:16

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


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

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

Сообщение space » 16 апр 2008, 23:20

AVR взгляни пожалуйста вот на это видео, которое тут http://www.instructables.com/id/How-to- ... rst-robot/ . Вот то что робот вытворяет этой сервой, то и нужно мне. То есть чтобы серва крутилась сначало в одну сторону потом в другую :)
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света
Аватара пользователя
space
 
Сообщения: 565
Зарегистрирован: 17 июн 2007, 23:44
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич

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

Сообщение Aesthete Animus » 16 апр 2008, 23:47

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

Разобраться в том, как управлять сервами и переписать прогу. Если Вы подадите на управляющий контакт сервы меандр с полупериодом 100мс, то она совершенно не обязана на это реагировать. Опять-таки - разберитесь с таймерами и делайте это на них, не используя задержек.
Aesthete Animus
 
Сообщения: 23
Зарегистрирован: 22 мар 2008, 21:01
Откуда: Белгород
Skype: dackinevitch_yan
прог. языки: C/C++

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 мСек

}
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04: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'
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света
Аватара пользователя
space
 
Сообщения: 565
Зарегистрирован: 17 июн 2007, 23:44
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич

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

Сообщение avr123.nm.ru » 17 апр 2008, 15:49

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


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

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

Сообщение space » 17 апр 2008, 21:42

Только подскажи начало программы, а дальше сам попытаюсь разобраться
Код: Выделить всё
#include <avr/io.h> <- правильное ли начало?
#define OUT PORTC
#define servo PC1
Импульс 1500   (серва по центру) <- вот это, что должно быть
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света
Аватара пользователя
space
 
Сообщения: 565
Зарегистрирован: 17 июн 2007, 23:44
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич

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
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

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

Сообщение Myp » 18 апр 2008, 09:39

это будет ещё один урок для курса ? :oops:
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

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

Сообщение rig » 18 апр 2008, 09:58

авр ведь можешь когда захочешь нормальнь ответить.
скачал, поглядел: наглядно, просто и просто красиво.
:good:
Аватара пользователя
rig
 
Сообщения: 1437
Зарегистрирован: 03 авг 2007, 19:43
Откуда: Екатеринбург
прог. языки: Си, асм со словарем

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

Сообщение space » 18 апр 2008, 10:31

AVR, спасибо огромное. Теперь буду разбираться и переделывать код под компилятор WinAVR
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света
Аватара пользователя
space
 
Сообщения: 565
Зарегистрирован: 17 июн 2007, 23:44
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич

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

Сообщение avr123.nm.ru » 18 апр 2008, 11:29

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

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

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

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

Сообщение Master » 18 апр 2008, 14:16

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

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

Сообщение avr123.nm.ru » 18 апр 2008, 14:48

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

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

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

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


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

Изображение
Вложения
SERVO 8 шт в PROTEUS ATmega16.rar
(17.93 КиБ) Скачиваний: 102
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

След.

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

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

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