roboforum.ru

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

Как управлять сервомоторами?

Кавитационная эрозия » 31 июл 2006, 13:10

Ок, спасибо :)

avr123.nm.ru » 31 июл 2006, 14:39

Я в курсе ( /03.htm   /05.htm)  не рекомендую использовать паузы в прерывании, так как это блокирует другие прерывания.

Советую управлять сервами с помощью таймеров не в прерывании.

вот пример 6 серво на мега128
http://www.bdmicro.com/code/servo/

на форуме есть ссылки до 32 серв на меге32 на CVAVR

Кавитационная эрозия » 04 авг 2006, 17:59

Помогите пожалуйста разобраться, что я делаю не так.
Подключил серву к МК, использовал программу, от KiCom, но всеравно не пашет :(
Вот линк на принципиальную схему в PROTEUS'e на МК АТ90S2313
http://test.sieit.ru/servo
Вот сам код работы МК
Код: Выделить всёРазвернуть
TCCR0=0x70; 
PORTD.0=1;
delay_ms(8);
PORTD.0=0;

При запуске симуляции поворот моторчика происходит ровно на 90 градусов в одну сторону и на этом он стопорится.
Честно сказть, мне неочень хотелось этот вопрос задавать, из-за его простоты для Вас, но меня он уже доконал :)

Кавитационная эрозия » 04 авг 2006, 18:10

Пробовал по примеру как на avr123.nm.ru задача №1
Просто в этом упражнении тоже используется таймер и его очистка, это упражнение я выполнил как в CV AVR так и в PROTEUS'e, а вот с сервой запутался :(

KiCom » 04 авг 2006, 18:33

Кавитационная эрозия писал(а):Помогите пожалуйста разобраться, При запуске симуляции поворот моторчика происходит ровно на 90 градусов в одну сторону и на этом он стопорится.

Все правильно. Длинна импульса получаеться 8мс но для сервы это много, диапазон допустимой длинны импульса для сервы 0.9-2.1 мс
Попробуй так:
Код: Выделить всёРазвернуть
TCCR0=0x70; 
PORTD.0=1;
delay_ms(1);
PORTD.0=0;

Теперь серва должна повернуться не на 90 градусов а чуть меньше. Эта функция задержки (delay_ms()) не совсем удобна, т.к. она не может сформировать задерку равной 1.2 мс только целые значения мс, поэтому  используй delay_ns() (задержка в нано секундах)

Кавитационная эрозия » 04 авг 2006, 18:56

Щас только что, поставил задержку delay_ms(1) повернулась на 90 градусов в лево, а при задержке delay_ms(8) поворот на 90 градусов в право :)
Написал delay_ns компилятр ругнулся мол неизвестное delay_ns.

Кавитационная эрозия » 04 авг 2006, 19:24

Какой библиотекой подключается задержка delay_ns(), #include <delay.h>?
Если этой, то почему компилятор ругается на delay_ns?
И еще вопрос, как теперь сделать, чтобы серва в цикле выполняла поворот на 90 градусов в лево и поворот на 90 в право?

KiCom » 04 авг 2006, 19:25

Не delay_ns а delay_us Вот  100% рабочий вариант:
Код: Выделить всёРазвернуть
#include <90s2313.h>
#include <delay.h>
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0xB2;
PORTB.0=1;
delay_us(1400);       // меняй это число в диапаоне 900-2100
PORTB.0=0;            // серву подключай к PB0  
// Place your code here

}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0
PORTB=0x00;
DDRB=0x01;

// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 3,906 kHz
TCCR0=0x05;
TCNT0=0xB2;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1 output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1H=0x00;
OCR1L=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
// Global enable interrupts
#asm("sei")
while (1)
     {

     };
}

Частота кварца у меня 4Мгц

Кавитационная эрозия » 04 авг 2006, 20:36

Спасибо большое!
Я наверно Вас достал уже, с глупыми вопросами :)
При запуске симуляции положение мотора меняется: -17,9
При изменении частоты, меняется скорость достижения этого положения, на выходе PORTB.0 видно что идет смена с лог=1 на лог=0, но поворот сервы не происходит в обратную сторону.

avr123.nm.ru » 04 авг 2006, 20:47

Кавитационная эрозия писал(а):Какой библиотекой подключается задержка delay_ns(), #include <delay.h>?


avr123.nm.ru/05.htm    /05a.htm

KiCom » 05 авг 2006, 06:06

Кавитационная эрозия писал(а):Спасибо большое!
При изменении частоты, меняется скорость достижения этого положения, на выходе PORTB.0 видно что идет смена с лог=1 на лог=0, но поворот сервы не происходит в обратную сторону.

Какую частоту ты меняешь? Не частоту ли таймера? Ее менять не надо. Нужно менять число в delay_us(1400) напиши например delay_us(1800) посмотри что получиться потом напиши delay_us(1000) повернется в другую сторону.

avr123.nm.ru » 05 авг 2006, 13:41

Среднее положение сервы - длина импульса 1500 мкС

в лево до конца 900 мкс (800 у некоторых)

в право до конца 2100 мкс (2200 у некоторых)

импульсы нужно подавать 50 раз в секунду (от35 до 80 обычно нормально).

avr123.nm.ru » 05 авг 2006, 13:43

Кавитационная эрозия писал(а):Спасибо большое!
Я наверно Вас достал уже, с глупыми вопросами :)


нет.  Но в PROTEUS есть пример с SERVO.

Re: Как управлять сервомоторами?

vlnzpua » 13 мар 2009, 12:00

А покрутить на 360 градусов?

Re: Как управлять сервомоторами?

avr123.nm.ru » 13 мар 2009, 12:03

vlnzpua писал(а):А покрутить на 360 градусов?
Если серва позволяет - то пожалуйста, крутите. Обычно более 1500 мкС в одну сторону крутится, а менее 1500 мкС импульс - в другую.

Как формировать импульсы управления servo там рассказано - http://avr123.nm.ru/z13.htm


Rambler\'s Top100 Mail.ru counter