Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Управление сервомашинкой, аппаратными средствами.


Управление сервомашинкой, аппаратными средствами.

Сообщений 1 страница 12 из 12

1

Приветствую всех товарищи! А можно как то сформировать сигнал на сервопривод если кто не знает протокол то http://www.avislab.com/blog/serva/
Да можно ШИМ но есть проблема в весьма большом шаге на 8бит что не есть ГУД!!! Программно не лучше. Может как то можно еще? Это МК управления сервами и еще разными устройствами при обмене данными с управляющим прерывания не используются.
Мне хотя бы 2 канала получить норм, еще 2 прокатят так. Если есть метод в получении хотя бы 50 положений то вы меня выручите сильно! Частота МК от 10 до 25МГц, но лучше выше, mega328.
Да и частоты по 50Гц не попадают хотя в принципе сервопривод будет работать и с отклонением частоты но всё лучше сильно не отклоняться.

Отредактировано RadioHAM-433 (2017-10-01 02:43:36)

0

2

RadioHAM-433 написал(а):

Приветствую всех товарищи! А можно как то сформировать сигнал на сервопривод если кто не знает протокол то http://www.avislab.com/blog/serva/

Так тут указанная в статье плата все решает.
Достаточно выдать на нее импульс нужной длительности и все...
Вот как бы и вся сложность... ;)

Интересное, кстати, решение, хоть и не новое...

Отредактировано Nord (2017-10-01 05:01:21)

0

3

А если использовать команду Васика?

+1

4

Да хорошо написал функцию калибровки и управления но есть пара вопросов. Как тут правильнее подать низкий уровень то есть полностью остановить/отключить привод? Вдобавок как это всё работает на системном уровне? Какие ресурсы потребляет что может нарушить работу модулятора и что он может нарушить? Работа в основном цикле не нарушается в принципе возможно из-за малого потребления ресурсов, как на счёт прерываний?
В примеру ШИМ аппаратный не что не может нарушить и он тоже не на что не влияет а тут как?
Меня оочень  интересует тема ресурсов и совместимости как программа в принципе работает в реальном времени то есть имеет отклик "гарантированный отклик" там и датчики расстояния и датчик оборотов и Доплер так что очень важно. Управляющий МК отвечает за связь и управление а драйверный за управление платформой. Передача данных идёт с полной синхронизацией с обоих сторон, то есть передача идёт по подтверждению приёма.

Отредактировано RadioHAM-433 (2017-10-01 16:51:29)

0

5

у серв нет никаких заложенных механизмов с отключением, может только работать, если нужно её отключать, то придется заморочиться с схемой управления питания для неё

0

6

При низком уровне серв не работает!!!!!!

Отредактировано RadioHAM-433 (2017-10-01 20:28:25)

0

7

Уровне чего?

0

8

Где взять инфу более подробную можно? Как остановить, и возобновить работу модулятора? Остановить то получается а запустить уже нет. Как синхронизировать? Прерывания сбивают работу сервы дрожат как руки у алкаша с месячного запоя. Если синхронизировать с приёмом то можно формировать импульс в момент отсутствия прерываний, а что бы при шумах (отсутствие сигнала) всё не тряслось то надо установить низкий уровнь. Или может есть другая более продвинутая библиотека что бы всё это можно было сделать?

0

9

Используйте таймер, по переполнениям отсчитуйте 50гц период, зажигаете пин и по ним же отсчитуете паузу с остатком в OCR тушите пин . Можно получить 2500 делений на весь радиус поворота при 20мгц. Можно создать таблицу чтоб не тратить время на расчет.

0

10

Я сделал на прерывании от таймера 1 по совпадению.
В программе, альфа и дельта -положительный и нулевой интервалы в периоде шим. Фаза1 и фаза2 - фазы интевалов в периоде.
темп1 и темп2 - значения флага, можно ли копировать вычисленные данные или они вычисляются.
На порт b.0 - управление серва, C.0 - аналоговый вход от делителя напряжения на переменном резисторе, на ареф опорное 5 вольт.
Ну там сами разберетёсь с текстом программы. Я повторил пример для ардуино на вайринге - в зависимости от степени поворота ручки переменного резистора поворачивается вал сервопривода. Сервопривод sg90(положительная часть периода от 544 до 2400 мкс, в программе числа не совпадают  из-за  предделителя для таймера, такие промежутки времени в тиках таймера от 1088 до 4800). В комментариях стоки для увеличения точности, но некоторые строки для этого нужно удалить.

Код:
$regfile = "m328pdef.dat"
$crystal = 16000000
Dim Alpha As Word , Delta As Word , Tune As Single , Tune_buffer As Word
Dim Alphah As Byte , Alphal As Byte , Alpha_bufferh As Byte , Alpha_bufferl As Byte
Dim Deltah As Byte , Deltal As Byte , Delta_bufferh As Byte , Delta_bufferl As Byte
Dim Abufferh As Byte , Abufferl As Byte , Dbufferh As Byte , Dbufferl As Byte
Dim Flag As Byte , Cycle As Byte
Const Temp1 = 1
Const Temp2 = 2
Const Phase1 = 1
Const Phase2 = 2
Const Time_cycle = 40000
Alpha = 4800
Delta = Time_cycle - Alpha
Alphah = High(alpha)
Alphal = Low(alpha)
Deltah = High(delta)
Deltal = Low(delta)
Alpha_bufferh = Alphah
Alpha_bufferl = Alphal
Delta_bufferh = Deltah
Delta_bufferl = Deltal
Abufferh = Alpha_bufferh
Abufferl = Alpha_bufferl
Dbufferh = Delta_bufferh
Dbufferl = Delta_bufferl

Cycle = Phase2
Flag = Temp1

Ddrb = 1
Portb.0 = 0

Didr0 = 1
'Admux = &B00000000' раскомментируйте для большей точности
Admux = &B00100000       ' закомментируйте для большей точности
Adcsra = &B01100111

Ocr1ah = Alpha_bufferh
Ocr1al = Alpha_bufferl
Tccr1a = &B00000000
Tccr1b = &B00001010
On Oc1a Servbot:

Enable Oc1a
Enable Interrupts

Do

Adcsra = &B11100111
Waitms 1
'раскомментируйте строки ниже для большей точности
'Tune_buffer = Adch
'Shift Tune_buffer , Left , 8
'Tune_buffer = Tune_buffer Or Adcl
'Tune = Tune_buffer * 3.628
Tune = Adch * 14.557       'закомментируйте для большей точности
Tune = Tune + 1088
Alpha = Int(tune)
Delta = Time_cycle - Alpha
Alphah = High(alpha)
Alphal = Low(alpha)
Deltah = High(delta)
Deltal = Low(delta)
Flag = Temp1
Alpha_bufferh = Alphah
Alpha_bufferl = Alphal
Delta_bufferh = Deltah
Delta_bufferl = Deltal
Flag = Temp2

Loop


Servbot:
If Cycle = Phase1 Then
Portb.0 = 1
If Flag = Temp2 Then
Abufferh = Alpha_bufferh
Abufferl = Alpha_bufferl
Dbufferh = Delta_bufferh
Dbufferl = Delta_bufferl
End If
Ocr1ah = Abufferh
Ocr1al = Abufferl
Cycle = Phase2

Else
Ocr1ah = Dbufferh
Ocr1al = Dbufferl
Portb.0 = 0
Cycle = Phase1
End If
Return

End       'end program

0

11

Извините.)) Совсем забыл, что в баскоме можно делать присваивания 16 битным регистрам.
Переписал программу и сделал небольшие изменения.

Код:
$regfile = "m328pdef.dat"
$crystal = 16000000
Dim Alpha As Word , Delta As Word , Tune As Single
Dim Servbot_alpha As Word , Servbot_delta As Word , Alpha_buffer As Word , Delta_buffer As Word
Dim Flag As Byte , Cycle As Byte
Const Temp1 = 1
Const Temp2 = 2
Const Phase1 = 1
Const Phase2 = 2
Const Time_cycle = 40000
Alpha = 4800
Delta = Time_cycle - Alpha
Cycle = Phase2
Flag = Temp1

Ddrb = 1
Portb.0 = 0

Didr0 = 1
Admux = &B00100000
Adcsra = &B01100111
Tccr1a = &B00000000
Tccr1b = &B00001010
On Oc1a Servbot:

Enable Oc1a
Enable Interrupts

Do

Adcsra = &B11100111
Waitms 1
Tune = Adch * 14.557
Tune = Tune + 1088
Alpha = Int(tune)
Delta = Time_cycle - Alpha
Flag = Temp1
Alpha_buffer = Alpha
Delta_buffer = Delta
Flag = Temp2

Loop

Servbot:
If Cycle = Phase1 Then
Portb.0 = 1
If Flag = Temp2 Then
Servbot_alpha = Alpha_buffer
Servbot_delta = Delta_buffer
Else
Servbot_alpha = Alpha
Servbot_delta = Delta
End If
Ocr1a = Servbot_alpha
Cycle = Phase2
Else
Ocr1a = Servbot_delta
Portb.0 = 0
Cycle = Phase1
End If
Return

End       'end program

-1

12

Сделал управление сервоприводом через режим FastPWM. На portc.0 делитель напряжения на переменном резисторе, portb.1 - управляющий сигнал для сервмашинки, aref - опарное 5 В для АЦП.
Программа очень простая и не требует прерываний. Количество положений 256.

Код:
$regfile = "m328pdef.dat"
$crystal = 16000000
Dim Alpha As Word , Old_alpha As Word , Tune As Single
Const Time_cycle = 40000
Alpha = 4800
Old_alpha = 4800

Ddrb = 2
Portb.1 = 0

Didr0 = 1
Admux = &B00100000
Adcsra = &B01100111

Tccr1a = &B10000010
Tccr1b = &B00011010
Timsk1 = 0
Icr1 = Time_cycle

Enable Oc1a
Enable Interrupts

Do

Adcsra = &B11100111
Waitms 1
Tune = Adch * 14.557
Tune = Tune + 1088
Alpha = Int(tune)
If Alpha <> Old_alpha Then
Ocr1a = Alpha
Old_alpha = Alpha
End If

Loop

End       'end program

Отредактировано Sikorsky (2018-09-04 18:59:14)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Управление сервомашинкой, аппаратными средствами.