реклама на сайте
подробности

 
 
> Управление сервомотором, нужны идеи, алгоритмы
KSN
сообщение Aug 28 2008, 10:06
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Есть сервомотор, который управляет перемещением объекта. На вход подаем два сигнала: step и dir. Частота сигнала step задает скорость перемещения:V=k*f, V - линейная скорость перемещения объекта[m/s], к - коэфф; f - частота входного сигнала, Hz. Надо линейно разгонять объект, двигать его и затем тормозить(тоже равноускоренно). Как реализовать ускорение/торможение на микроконтроллере?
Вариант1:
Таймер1 в режиме счетчика и таймер2 в режиме ШИМ.
Запускаю таймер1, который будет остчитывать тики t. По каждому тику вычисляю скорость в данный момент по V = a*t,(ускорение задается), пересчитываю скорость в частоту, разрешаю обновление регистра таймера2. По окончании периода таймера2, автоматически запишестя новое значение частоты. Не устраивает одно: например, тик t=20ms, при пересчете скорости получим частоту ШИМ 100Гц(например), получится, что основной таймер в "холостую" протикает 5 тактов, чего не очень хочется. Напрашивается решение: изменять длительность тика основного таймера1, но чего-то туплю, подскажите как пересчитать?
Можно ли реализовать только на одном таймере?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
Burner
сообщение Aug 28 2008, 17:30
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 068
Регистрация: 14-01-08
Из: Винница
Пользователь №: 34 083



Ну, в общем, чтобы частота линейно менялась, нужен ее прямой синтез. Берется накопительный регистр, скажем двухбайтный, и к нему постоянно(с фиксированной частотой) прибавляется значение из регистра частоты(скажем, 1 байт).
Как только накопительный регистр превысил порог(больше или равно), выдаешь импульс, отнимаешь от накопительного регистра значение порога, и тут же возвращаешься на проверку превышения порога. Это на тот случай, если прибавлено было больше значения порога. Как относится значение рег. частоты к порогу, так относится средняя вых. частота к частоте суммирования. Если они равны, то при каждом суммировании будет выдаваться импульс. Вот так оно и работает. Немного хромает, но это единственный способ получить произвольную среднюю частоту при фиксированной тактовой. Чем выше частота суммирования, тем меньше хромает - т. е., меньше скачет период вых. сигнала. Что касается линейного роста частоты, рег. частоты надо инкрементировать каждый раз, отсчитав фиксированное число суммирований. Чем меньше это число, тем быстрее растет частота. Чтобы иметь типа меандр, надо по каждому превышению порога не выдавать импульс, а переключать порт из "0" в "1" или наоборот, т. е. инвертировать.

Суммировать, ессно, по таймеру. Чобы не делать прямого синтеза, можно выставлять период таймера по функции 1/х от частоты. Функция, ессно, табличная, но однобайтная получится довольно корявая, а двухбайтная - длинная таблица. И во всяком случае средняя частота будет неточной.
Go to the top of the page
 
+Quote Post
KSN
сообщение Aug 29 2008, 03:01
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Цитата(Burner @ Aug 29 2008, 00:30) *
Ну, в общем, чтобы частота линейно менялась, нужен ее прямой синтез. Берется накопительный регистр, скажем двухбайтный, и к нему постоянно(с фиксированной частотой) прибавляется значение из регистра частоты(скажем, 1 байт).
Как только накопительный регистр превысил порог(больше или равно), выдаешь импульс, отнимаешь от накопительного регистра значение порога, и тут же возвращаешься на проверку превышения порога. Это на тот случай, если прибавлено было больше значения порога. Как относится значение рег. частоты к порогу, так относится средняя вых. частота к частоте суммирования. Если они равны, то при каждом суммировании будет выдаваться импульс. Вот так оно и работает. Немного хромает, но это единственный способ получить произвольную среднюю частоту при фиксированной тактовой. Чем выше частота суммирования, тем меньше хромает - т. е., меньше скачет период вых. сигнала. Что касается линейного роста частоты, рег. частоты надо инкрементировать каждый раз, отсчитав фиксированное число суммирований. Чем меньше это число, тем быстрее растет частота. Чтобы иметь типа меандр, надо по каждому превышению порога не выдавать импульс, а переключать порт из "0" в "1" или наоборот, т. е. инвертировать.

Суммировать, ессно, по таймеру. Чобы не делать прямого синтеза, можно выставлять период таймера по функции 1/х от частоты. Функция, ессно, табличная, но однобайтная получится довольно корявая, а двухбайтная - длинная таблица. И во всяком случае средняя частота будет неточной.

Я правильно понял:
Rn - регистр накопления; Rf - регистр частоты; f0 - фиксированная частота.
1. Rn = Rn+Rf с частотой f0
2. Если Rn<Thresold, то пп6
3. Выдаю импульс(инвертирую выход)
4. Rn = Rn-Thresold
5. Переход к пп2
6. Продолжение программы

Rf= Rf+deltaF каждые n/f0;
Rf/Thresold = F/f0, где F - средняя выходная частота.
Go to the top of the page
 
+Quote Post
Burner
сообщение Aug 30 2008, 14:41
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 068
Регистрация: 14-01-08
Из: Винница
Пользователь №: 34 083



Все так smile.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 03:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.0139 секунд с 7
ELECTRONIX ©2004-2016