Управление сервомотором с помощью ШИМ

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

Re: Управление сервомотором с помощью ШИМ

Сообщение avr123.nm.ru » 07 фев 2010, 18:44

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

Re: Управление сервомотором с помощью ШИМ

Сообщение Maycal » 07 фев 2010, 19:31

avr123.nm.ru писал(а): Вашим моторчиком можно плавно управлять как раз так как вы читали в задаче 8 - http://avr123.nm.ru/z8.htm

Скажите пожалуйста, в чем конкретно заключается это плавное управление моторчиком?
В том, что он будет медленно поворачиваться? Или в том что он просто не будет работать на полную мощность от общей цепи питания и не сгорит?
Maycal
 
Сообщения: 25
Зарегистрирован: 28 ноя 2009, 23:18
Откуда: Подольск

Re: Управление сервомотором с помощью ШИМ

Сообщение avr123.nm.ru » 07 фев 2010, 19:44

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

Re: Управление сервомотором с помощью ШИМ

Сообщение Maycal » 07 фев 2010, 19:47

Спасибо большое за ссылку, но как я понял из статьи ПИД регулятор используется для систем с обратной связью, а тут её нет, т.к обычный моторчик.
Maycal
 
Сообщения: 25
Зарегистрирован: 28 ноя 2009, 23:18
Откуда: Подольск

Re: Управление сервомотором с помощью ШИМ

Сообщение avr123.nm.ru » 07 фев 2010, 19:52

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

Re: Управление сервомотором с помощью ШИМ

Сообщение kafka » 25 мар 2010, 15:37

драйвер мотора выше это двойной полный мост
управляется два входа для управления направлением и один включение. 1-0 или 0-1 на управлении переключает мост в одну или другую сторону, включение 1 включено 0 выключено. соответственно процент времени когда на этом входе будет будет соотвествовать проценту максимальной мощьности подаваемой ена двигатель. если этот вход не подключить то что произойдет читать в спеке на девайс - кручение с отключеным выводом говорит об одном из 1) чтото шумит 2) вывод с пассивной 1(пока никуда не подключен считается что 1) 3) некорректно чтото спаял

у меня этот девайс работает замечательно, единственное с чем пришлось повозиться - на стораз перечитать даташит чтобы увидеть что вывод индикатора тока двигателдя нада подключить к общему через низкоомный мощьный резистор( или накоротко если не бояться перегрузок и отказаться от измерения тока на нагрузке)
если есть необходимость могу дать схемку как он у меня подключен к авр-ке.
kafka
 
Сообщения: 2
Зарегистрирован: 25 мар 2010, 15:29

Re: Управление сервомотором с помощью ШИМ

Сообщение kafka » 25 мар 2010, 15:51

ой извиняюсь у меня L298 но сути не меняет - у меня там два полных моста у тебя 4ре половинки)))) отличие только в том что у 298 есть вывод чтоб снимать значение тока нагрузки
kafka
 
Сообщения: 2
Зарегистрирован: 25 мар 2010, 15:29

Re: Управление сервомотором с помощью ШИМ

Сообщение hadok » 28 мар 2010, 00:35

Вы говорите что моторчиком можно плавно управлять. Т.е вы хотите сказать что можно сделать так что бы колеса машинки не резко в право влево, а медленно поворачивались? Если так, то скажите пожалуйста, какая примерно нужна для этого величина ШИМ, или же нужно что бы величина ШИМ менялась? Т.е возможно при старте чтоб сдвинуть мотор с места нужно ШИМ 100%, а потом резко уменьшить допустим до 20% что бы колеса медленно крутились?



Если речь идёт о механизме поворота колёс - тут не нужен большой пусковой момент, следовательно, можно подавать минимальный процент ШИМа, при котором механизм поворачивает колёса. Этот процент лучше экспериментально найти. ТО есть менять ШИМ и смотреть, хватает напряжения мотору или нет.
Если же речь идёт о ходовом приводе, то тут во время старта можно сделать рывок, для преодолевания сил сопротивления. А потом переходить в штатный режим скорости.
Аватара пользователя
hadok
 
Сообщения: 166
Зарегистрирован: 06 июн 2005, 02:27
Откуда: Минск, Лида

Re: Управление сервомотором с помощью ШИМ

Сообщение Duhas » 28 мар 2010, 08:49

всем вышеописанным занимается регулятор тока в нормальной системе управления приводом..
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Управление сервомотором с помощью ШИМ

Сообщение cleric4 » 06 май 2010, 07:45

Для плавности нужно постепенно увеличивать активную фазу ШИМа, удобнее будет сделать 2 внешние кнопки к контроллеру и ими изменять параметры ШИМа. Мост можно сделать на микросхемах, можно спаять на транзисторах как здесь http://rate.bget.ru/ страничка H-bridge.
cleric4
 
Сообщения: 2
Зарегистрирован: 06 май 2010, 07:37

Re: Управление сервомотором с помощью ШИМ

Сообщение osc » 10 сен 2010, 18:50

Управления сервой при помощи аппаратного ШИМ
Код: Выделить всё
/*
Code Vision AVR C Compiler
MCU atmega16
CLOCK 8 MHz RC INT
*/
#include<mega16.h>
#define TOP 10000
void servo1_position(int pos)
{
OCR1A = pos/2;
}

void servo2_position(int pos)
{
OCR1B = pos/2;
}

void main(void)
{
//настраиваем Timer1
TCCR1A=0xA0;
TCCR1B=0x12;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=(char)TOP>>8;
ICR1L=(char)TOP //максимальное значение таймера
OCR1B=0x00;
OCR1A=0x00;

DDRD=0x30; //PORTD4 & PORTD5 сконфигурированы на выход

servo1_position(1000); //на PD5 появится ШИМ с частотой 50 гц и длительностью имлуьса 1000 мксек
servo2_position(1300); //на PD4 аналогично, но длительность импульса уже 1300 мксек
while(1);
}

Код взят оттуда http://cdxp.zx6.ru/?p=355
Аватара пользователя
osc
 
Сообщения: 333
Зарегистрирован: 07 сен 2009, 20:06
прог. языки: c, c#
ФИО: Евгений

Re: Управление сервомотором с помощью ШИМ

Сообщение mackross » 19 ноя 2010, 00:36

Понадобилось управлять одной сервой с помощью 8-битного таймера. Аппаратный ШИМ дает слишком маленькое разрешение, два таймера использовать жирно.
Поэтому я применил способ (основанный на методе 3, описанном тут в местной wike), использующий переконфигурирование таймера в каждом прерывании. В этом случае надо всего два прерывания на период управления - одно начинает управляющий импульс, другое его заканчивает. При кварце 14.7456Мгц разрешение получилось примерно 8,68мкс, диапазон ширины управляющего импульса - чуть шире 800-2200мкс. Среднее положение соответствует числу 172 в регистре OCR2, изменение на 1 соответствует примерно изменению ширины импульса на 8,68мкс.
Привожу код для ATMega16a, может кому пригодится.
Управление сервоприводом с помощью 8-битного таймера. Только нужная часть кода.
Код: Выделить всё
...
//global variables
uint8_t servo_position;//содержит текущее положение сервопривода, просто запишите в него нужное значение
...
//начальная инициализация
void init(){
...
sei();
servo_position=172; //сервопривод в среднее положение
DDRD|=1<<servo_pwm; //пин OC2 на выход
OCR2=0xFF; //пин OC2 Timer2 автоматически установится, когда таймер досчитает до OCR2=255
TIMSK|=1<<TOIE2; // активируем прерывание Timer2 overflow
TCCR2=0b00110111; // ck/1024, normal mode, set OC2 on compare
/*первым наступит прерывание Timer2 overflow, при этом пин OC2 автоматически установится потому что
в настройках таймера задана "установка OC2 при равенстве TCNT2=OCR2=255", вручную устанавливать не надо.*/
...
}
...

//ПРЕРЫВАНИЯ

//=================Timer2 overwlow interrupt================
ISR(TIMER2_OVF_vect){
TCCR2=0b00100101; // предделитель ck/128, normal mode, clear OC2 on compare
// при F_CPU=14.7456Мгц один тик таймера 8,6784мкс
OCR2=servo_position; //задаем ширину управляющего импульса
TCNT2=0;
TIFR|=1<<OCF2; //сбрасываем флаг OCF2, флаг TOV2 сбросится при выходе из прерывания
TIMSK|=1<<OCIE2; // активируем прерывание Timer2 compare
TIMSK&=~(1<<TOIE2); // дизактивируем прерывание Timer2 overflow
}

//=================Timer2 compare match interrupt================
ISR(TIMER2_COMP_vect){
TCCR2=0b00110111; // предделитель ck/1024, normal mode, set OC2 on compare
OCR2=0xFF; //счет до 255 даст задержку ~17мс
TCNT2=0;
TIFR|=1<<TOV2; //сбрасываем флаг TOV2, флаг OCF2 сбросится при выходе из прерывания
TIMSK|=1<<TOIE2; // активируем прерывание Timer2 overflow
TIMSK&=~(1<<OCIE2); // дизактивируем прерывание Timer2 compare
}
...
mackross
 
Сообщения: 6
Зарегистрирован: 23 сен 2010, 00:07

Пред.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22