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

Обсуждаем цифровые устройства...
Ответить
z11
Родился
Сообщения: 6
Зарегистрирован: Вс июн 21, 2015 10:07:14

Сообщение z11 »

Сервопривод Futaba S3003 управляется МК ATMega8A-PU. Источник тактового сигнала для МК - встроенный генератор на 1 МГц. Насколько я понял, угол поворота сервы зависит от ширины импульса. Генерирую один импульс (подаю на контакт для сигнала управления):

Код: Выделить всё

sbi PortB,0	;подать 1 на PB0
cbi PortB,0	;подать 0 на PB0
В результате, как и ожидалось, происходит поворот (около 25-30 градусов). Для увеличения продолжительности импульса добавляю "nop":

Код: Выделить всё

sbi PortB,0	;подать 1 на PB0
nop
cbi PortB,0	;подать 0 на PB0
Однако в результате серва поворачивается на тот же угол. Увеличение количества команд "nop" ничего не меняет. Увеличиваю частоту МК до 8 МГц и повторяю эксперимент - все по-прежнему, угол поворота неизменен. Почему так? Подскажите пожалуйста.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 44281
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

Сообщение АлександрЛ »

Вы правильно написали, что сервопривод управляется длительностью импульса- от 1 до 2 миллисекунд ((1,5 миллисекунды- "нейтраль")- неправильная длительность- КРИТИЧНА) с периодом повторения 20 миллисекунд. период повторения в некоторых пределах не критичен)- то есть, например период 15- 25 миллисекунд (имхо) "не играет роли"..
Вам нужно генерировать не ОДИН импульс, а непрерывный поток импульсов. (например ШИМ с частотой 50 герц и "заполнением" от 5 до 10% (не знаю, как точно эту характеристику обозвать)
Реклама
z11
Родился
Сообщения: 6
Зарегистрирован: Вс июн 21, 2015 10:07:14

Сообщение z11 »

АлександрЛ, спс за ответ. Я пробовал генерировать последовательность с частотой 50 Гц. Для этого я исходил того, что период равен 20-ти тактам МК (при использовании генератора на 1МГц), а команды выполняются за 1-2 такта, например sbi или cbi - 2 такта, nop - 1 такт. Однако это привело лишь к непрерывному повороту сервы до упора.
z11
Родился
Сообщения: 6
Зарегистрирован: Вс июн 21, 2015 10:07:14

Сообщение z11 »

Я понял свою ошибку - просто неверный расчет. Для 50 Гц период 20000 тактов, а не 20. Еще раз спасибо что откликнулись!
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 44281
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

Сообщение АлександрЛ »

На сколько я понимаю, то "в тактах" считать совсем необязательно - в программе можно указывать конкретное время длительности импульса/паузы в миллисекундах. То, что пауза между импульсами будет меняться, например, от 19 до 21 миллисекуны- это не важно, главное- длительность импульса.

http://www.aviafly.com.ua/stati-i-obzor ... tmega.html
Реклама
z11
Родился
Сообщения: 6
Зарегистрирован: Вс июн 21, 2015 10:07:14

Сообщение z11 »

Мне просто хотелось побыстрее получить результат от использования сервопривода на основе минимума знаний о МК, без использования языка высокого уровня и каких-либо библиотек. Думаю, это хорошо знакомо всем начинающим. Я новичок и нахожусь в промежутке между изучением принципов работы сервопривода и принципов функционирования ШИМ микроконтроллера. Если кому интересно, вот код который это позволяет.

Код: Выделить всё

.device atmega8a
.nolist
.include "D:\prg\AVRStudio419\AvrAssembler2\Appnotes\m8Adef.inc"
.list
;=======Работа с сервоприводом
.cseg
.org 0

rjmp Init
Init:
 ser r16
 out DDRB,r16		;весь регистр B ориентировали на выход
 ldi r16,Low(RamEnd)	;инициализация стека
 out SPL,r16
 ldi r16,High(RamEnd)
 out SPH,r16
Start:
 sbi PortB,0	;подать 1 на PB0
 rcall Delay_1
 cbi PortB,0	;подать 0 на PB0
 rcall Delay_2
Loop: rjmp Start

Delay_1:
 clr r16
 ldi r17,2		;задаем длительность импульса
Loop_Delay_1:
 dec r16
 brne Loop_Delay_1
 dec r17
 brne Loop_Delay_1
 ret

Delay_2:
 clr r16
 ldi r17,24		;задаем длительность оставшейся части периода (логический 0)
Loop_Delay_2:
 dec r16
 brne Loop_Delay_2
 dec r17
 brne Loop_Delay_2
 ret
Насколько мы увеличиваем период импульса, настолько надо уменьшать длительность второй части периода с низким уровнем сигнала. 2-24 - для нейтрального положения привода, 1-25 или 3-23 - для отклонения влево или вправо. Тактовый сигнал МК - 1МГц. Кто не в курсе (может кому пригодится): на сервопривод по управляющему каналу (у меня это белый провод) надо подавать сигнал высокого уровня (логич. 1) с периодом 50 Гц. Это правило действует почти для всех сервоприводов. Ширина этого импульса указывает приводу, какое положение он должен занять. Привод займет указанное положение в не зависимости от того, в каком положении он был ранее. Он будет стараться поддерживать это положение, если внешние силы будут его отклонять.
Реклама
Ответить

Вернуться в «Цифровая техника»