Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Управление сервомотором
Форум разработчиков электроники ELECTRONIX.ru > Силовая Электроника - Power Electronics > Электрические машины, Электропривод и Управление
KSN
Есть сервомотор, который управляет перемещением объекта. На вход подаем два сигнала: 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, но чего-то туплю, подскажите как пересчитать?
Можно ли реализовать только на одном таймере?
Burner
Ну, в общем, чтобы частота линейно менялась, нужен ее прямой синтез. Берется накопительный регистр, скажем двухбайтный, и к нему постоянно(с фиксированной частотой) прибавляется значение из регистра частоты(скажем, 1 байт).
Как только накопительный регистр превысил порог(больше или равно), выдаешь импульс, отнимаешь от накопительного регистра значение порога, и тут же возвращаешься на проверку превышения порога. Это на тот случай, если прибавлено было больше значения порога. Как относится значение рег. частоты к порогу, так относится средняя вых. частота к частоте суммирования. Если они равны, то при каждом суммировании будет выдаваться импульс. Вот так оно и работает. Немного хромает, но это единственный способ получить произвольную среднюю частоту при фиксированной тактовой. Чем выше частота суммирования, тем меньше хромает - т. е., меньше скачет период вых. сигнала. Что касается линейного роста частоты, рег. частоты надо инкрементировать каждый раз, отсчитав фиксированное число суммирований. Чем меньше это число, тем быстрее растет частота. Чтобы иметь типа меандр, надо по каждому превышению порога не выдавать импульс, а переключать порт из "0" в "1" или наоборот, т. е. инвертировать.

Суммировать, ессно, по таймеру. Чобы не делать прямого синтеза, можно выставлять период таймера по функции 1/х от частоты. Функция, ессно, табличная, но однобайтная получится довольно корявая, а двухбайтная - длинная таблица. И во всяком случае средняя частота будет неточной.
KSN
Цитата(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 - средняя выходная частота.
Burner
Все так smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.