Управление сервой

PIC версия программы(разные темы)

Управление сервой

Сообщение Sergey (Sergey) » 16 июл 2016, 18:33

Добрый день!
Подскажите пожалуйста как изменить длительность управляющего импульса сервы.
В стандартном макросе флоукод угол поворота составляет 90 градусов, это изменение импульса от 1мс до 2мс (проверено и экспериментально). Сервомотор Tower Pro MG90S позволяет делать поворот на 180 градусов - это который у меня.
Вообще долго игрался с программой, смотрел тему - Управление цифровими (300 Гц) серводвигателями.
При помощи переменной MX_SERVO_CLK_COUNT удалось расширить длительность до 2,45мс, что дало поворот в одну сторону от среднего положения на 90 градусов.
А вот изменить в импульс меньше 1мс не получается. Я думаю, что нужно где-то до 0,5мс изменить.
Таким образом весь диапазон (180 градусов) будет соответствовать от 0,5мс до 2,45мс.
Как эту проблему решить не знаю.
У вас нет доступа для просмотра вложений в этом сообщении.
Ник: Sergey
Имя: Sergey
Специалист
Специалист
Информация о пользователе

Re: Управление сервой

Сообщение Enigm (Enigm) » 16 июл 2016, 22:19

А вам обязательна родной макрос пользовать ?
Я сервами рулю через ССР .
Вот пример
2.fcf

Длину импульса задаю в микросекундах.
Обратите внимание на самописное прерывание.
Может вам такой вариант подойдет.
У вас нет доступа для просмотра вложений в этом сообщении.
Аватар пользователя
Ник: Enigm
Имя: Enigm
(Сочи)
Суперконсульт
Суперконсульт
Информация о пользователе

Re: Управление сервой

Сообщение Sergey (Sergey) » 17 июл 2016, 09:31

Спасибо за вариант!
При компиляции выдает ошибку - Flowcode не смог ассемблировать файл ASM из-за следующих ошибок: s!
Не знаю, что за ошибка? Весь путь прописан латыницей. Как исправить?
Вы в прерывании используете таймер 1 (он 16 разрядный). Я его планирую использовать для ардуиновского ультразвукового дальномера.
Ник: Sergey
Имя: Sergey
Специалист
Специалист
Информация о пользователе
Вернуться наверх

Re: Управление сервой

Сообщение Enigm (Enigm) » 17 июл 2016, 10:12

Странно у меня все компилит.
Вы ее под какой камень компилите ?
Киньте сюда файл 2.msg.txt .
Я ваш камень не знаю, гляньте может у него 2 - 16 битных таймера есть.
Так компонент СЕРВО тот же 16 битный таймер пользует, так что по любому он у вас занят будет.
Можете банально через обычный Делай компонент сделать, не стабильно но работать будет.
Можно какой нить таймер завести с прерыванием по частоте близким с частотой импульса на серву (стандарт 50Гц) а в прерывание уже поднимать уровень на выводе, ставить компонент делай в мкс с переменной ширины импульса и потом опускать уровень на выводе , тоже как вариант и не требует 16бит.
Аватар пользователя
Ник: Enigm
Имя: Enigm
(Сочи)
Суперконсульт
Суперконсульт
Информация о пользователе
Вернуться наверх

Re: Управление сервой

Сообщение Sergey (Sergey) » 17 июл 2016, 10:34

Спасибо!
Дело в том, что я его тестирую сейчас на pic18f2550, а вообще он будет управляться pic16f887.
Enigm писал(а):Можно какой нить таймер завести с прерыванием по частоте близким с частотой импульса на серву (стандарт 50Гц) а в прерывание уже поднимать уровень на выводе, ставить компонент делай в мкс с переменной ширины импульса и потом опускать уровень на выводе , тоже как вариант и не требует 16бит.

Это тоже хороший вариант, надо будет попробовать. Единственно нужно только будет использовать два таймера - одно для 50гц, а другой для изменения импульса.
Чего-то не могу прикрепить файл 2.msg.txt. Я мк не менял, компилировал с Вашим.
Ник: Sergey
Имя: Sergey
Специалист
Специалист
Информация о пользователе
Вернуться наверх

Re: Управление сервой

Сообщение Enigm (Enigm) » 17 июл 2016, 11:53

Кто же блин пишет прогу не на целевом контроллере ?
Они же блин все разные, вот pic18f2550 имеет Таймер 3 на котором можно все сделать, освободив Таймер1 а вот pic16f887 нифига не имеет Таймера3 .
Ладно фиг с ним, раз время потратил может кому другому понадобится на Таймере3 вывод импульсов управлением сервы.
servo.rar

А каким вы будете считать и как сам импульс ? тут только через модуль ССР , но в pic16f887 он к Таймеру 1 привязан.
Так что заводите какой нить таймер на нужную вам частоту 50 или 300 герц, а уже в самом прерывании через делай формируйте импульс.
Правда делай в прерывании, черевато не срабатыванием вовремя другого прерывания, да и в общем на эти от 0.5 до 2.5 мс контроллер нечего не смогет делать.
Если это не мешает то все норм.
А если нужны еще прерывания и четкие, то без Таймера1, делать обычный простой макрос на одних делай . правда дрожать будут немного, но может ваш сервопривод и не заметит все это дело.
У вас нет доступа для просмотра вложений в этом сообщении.
Аватар пользователя
Ник: Enigm
Имя: Enigm
(Сочи)
Суперконсульт
Суперконсульт
Информация о пользователе
Вернуться наверх

Re: Управление сервой

Сообщение Sergey (Sergey) » 17 июл 2016, 20:15

Спасибо! Я посмотрел у меня остался еще один pic18f2550. Наверно буду делать все на нем.
Ник: Sergey
Имя: Sergey
Специалист
Специалист
Информация о пользователе
Вернуться наверх

Re: Управление сервой

Сообщение Enigm (Enigm) » 17 июл 2016, 20:28

Только учтите , все настроено под кварц 16Мгц , под 20Мгц уже геморно, ибо один тик таймера ни как не сделать равному 1Мкс (на 4Мгц и 8Мгц еще можно) , только с пересчетом числа в нужные единицы.
Но если сильно надо на 20Мгц, можно и заморочиться .
Аватар пользователя
Ник: Enigm
Имя: Enigm
(Сочи)
Суперконсульт
Суперконсульт
Информация о пользователе
Вернуться наверх

Re: Управление сервой

Сообщение Sergey (Sergey) » 18 июл 2016, 14:01

Вот сижу пробую повторить Ваши расчеты. Чего-то не получается.
для rev == 0
imp = 1500
out = 1500
out = 1485
bytel = (1485 & 255) = 205
byteh = (1485 & 65280) = 1280
byteh = 1280 >> 8 = 20
20 - 0x14 - byteh
205 - 0xCD - bytel
TMR3 preload = 5325 - что соответствует 16Гц (60,211мс)
для rev == 1
out = 20000 - 1500 = 18500
out = 18500 - 15 = 18485
bytel = (18485 & 255) = 53
byteh = (18485 & 65280) = 18432
byteh = 18432 >> 8 = 72
72 - 0x48 - byteh
53 - 0x35 - bytel
TMR3 preload = 18485 - что соответствует 21Гц (47,051мс)

Если возможно поясните, пожалуйста.
Думаю пересчитать на частоты 20 и 48 МГц.
Ник: Sergey
Имя: Sergey
Специалист
Специалист
Информация о пользователе
Вернуться наверх

Re: Управление сервой

Сообщение Enigm (Enigm) » 18 июл 2016, 15:21

-15 это была коррекция для 683 , вычислял эту коррекцию просто , писал например 1000мкс , потом измерял этот импульс и он был на 15 мкс больше , поэтому и ввел это значение , для вашего камня этого не делал.
Лишние мкс набегают на выполнениях команд до записи в регистры сравнения .
На 20 Мгц тут уже надо считать, а вот на 48 должно все нормально выйти ибо делится на 8 и по идеи делителями можно получит 1мгц тактирования таймера.
Щя попробую на 48 Мгц сделать.
И чет я не понял ваших расчетов.
У нас таймер настроен на частоту 1Мгц, это значит 1 тик равен 1 Мкс.
Мы настраеваем ССР в режим сравнения с выдачей прерывания.
Так вот , в регистр сравнения ССР2 мы записываем например 1000. и обнуляем таймер.
Все таймер тикает, как только таймер натикал 1000( что равно 1000мкс) происходит прерывание и мы в перывание, заносим новое значение в ССР2 например 20000 и опять обнуляем таймер, все следуешее прерывание произойдет через 20000мкс .
И так далее
Поэтому, если делителем удастся из 48Мгц сделать тактирования таймера в 1Мгц, то нечего менять не надо будет, только изменится настройка самого таймера и все.
Аватар пользователя
Ник: Enigm
Имя: Enigm
(Сочи)
Суперконсульт
Суперконсульт
Информация о пользователе
Вернуться наверх

След.

Вернуться в Flowcode PIC

Кто сейчас на форуме

Пользователь просматривает форум: нет зарегистрированных пользователей

cron