|
Управление сервомотором, нужны идеи, алгоритмы |
|
|
|
Aug 28 2008, 10:06
|
Местный
  
Группа: Свой
Сообщений: 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, но чего-то туплю, подскажите как пересчитать? Можно ли реализовать только на одном таймере?
|
|
|
|
|
 |
Ответов
(1 - 3)
|
Aug 28 2008, 17:30
|
Профессионал
    
Группа: Свой
Сообщений: 1 068
Регистрация: 14-01-08
Из: Винница
Пользователь №: 34 083

|
Ну, в общем, чтобы частота линейно менялась, нужен ее прямой синтез. Берется накопительный регистр, скажем двухбайтный, и к нему постоянно(с фиксированной частотой) прибавляется значение из регистра частоты(скажем, 1 байт). Как только накопительный регистр превысил порог(больше или равно), выдаешь импульс, отнимаешь от накопительного регистра значение порога, и тут же возвращаешься на проверку превышения порога. Это на тот случай, если прибавлено было больше значения порога. Как относится значение рег. частоты к порогу, так относится средняя вых. частота к частоте суммирования. Если они равны, то при каждом суммировании будет выдаваться импульс. Вот так оно и работает. Немного хромает, но это единственный способ получить произвольную среднюю частоту при фиксированной тактовой. Чем выше частота суммирования, тем меньше хромает - т. е., меньше скачет период вых. сигнала. Что касается линейного роста частоты, рег. частоты надо инкрементировать каждый раз, отсчитав фиксированное число суммирований. Чем меньше это число, тем быстрее растет частота. Чтобы иметь типа меандр, надо по каждому превышению порога не выдавать импульс, а переключать порт из "0" в "1" или наоборот, т. е. инвертировать.
Суммировать, ессно, по таймеру. Чобы не делать прямого синтеза, можно выставлять период таймера по функции 1/х от частоты. Функция, ессно, табличная, но однобайтная получится довольно корявая, а двухбайтная - длинная таблица. И во всяком случае средняя частота будет неточной.
|
|
|
|
|
Aug 29 2008, 03:01
|
Местный
  
Группа: Свой
Сообщений: 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 - средняя выходная частота.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|