Вы немного не поняли.
Параметры движения задаются тремя величинами. Расстояние - которое нужно проехать. Скорость - с какой нужно проехать. Разгон - как набирать скорость/тормозить.
Задавая частоту таймеру вы задаете скорость двигателя. Подразумеваю сигнал Step.
Изменение частоты этого таймера - разгон/торможение.
Количество переполнений этого таймера - расстояние(обороты в штуках или Step_ах).
Чтобы не считать программно эти шаги можно привязать другой (Slave) таймер. В его регистре CNT будет количество шагов которое можно прочитать в любой момент. DMA не нужно. Направление счета этого таймера должно соответствовать сигналу DIR.
Главное пройти заданное количество шагов без перелета и подойти к конечной точке с заданной скоростью (иногда с нулевой).
Часто нужно синхронизировать движение одного двигателя с другим(и). Здесь да - нужно изменять скорость пропорционально(косая прямая/дуга окружности). Но до этого вопроса вы пока не дошли.
Расчет и поиск делителя PSC и периода ARR для таймера STM32
- Реклама
Re: Расчет и поиск делителя PSC и периода ARR для таймера ST
[uquote="Trully",url="/forum/viewtopic.php?p=3787277#p3787277"]. C = (PSC - 1) * (ARR - 1). .[/uquote]
Сам себя поправлю. Там не минус, а плюс надо. C = (PSC + 1) * (ARR + 1). ...судя по тому, что никто не обратил внимания, видимо, никто и не понял даже.
[uquote="auric",url="/forum/viewtopic.php?p=3787775#p3787775"]ь TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE);?[/uquote]
Для события Update - другой канал DMA. На память не помню, но что другой - это стопудово. - посмотрите по таблице каналов.
ЛАдно, сам посмотрел, а то еще не найдете (судя по тому, что никто так до сих пор и не додумался до этого): А что тут? Про импульсы для ШД? Ну если вы управляете в шаговом или полушаговом режиме, то частота следования импульсов сравнительно небольшая. Обычно моторы имеют 200 шагов на оборот, если рассматривать те, которые для всяких CNC и т.п. То есть, фактически, частота импульсов вобщемто не превысит пары-тройки килогерц на макс.скорости. Посему, можно не заморачиваться автоматическим подсчетом импульсов, а просто считать их в прерывании от таймера. Заодним, гораздо проще так сделать S-кривую разгона и торможения.
Сам себя поправлю. Там не минус, а плюс надо. C = (PSC + 1) * (ARR + 1). ...судя по тому, что никто не обратил внимания, видимо, никто и не понял даже.
[uquote="auric",url="/forum/viewtopic.php?p=3787775#p3787775"]ь TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE);?[/uquote]
Для события Update - другой канал DMA. На память не помню, но что другой - это стопудово. - посмотрите по таблице каналов.
ЛАдно, сам посмотрел, а то еще не найдете (судя по тому, что никто так до сих пор и не додумался до этого): А что тут? Про импульсы для ШД? Ну если вы управляете в шаговом или полушаговом режиме, то частота следования импульсов сравнительно небольшая. Обычно моторы имеют 200 шагов на оборот, если рассматривать те, которые для всяких CNC и т.п. То есть, фактически, частота импульсов вобщемто не превысит пары-тройки килогерц на макс.скорости. Посему, можно не заморачиваться автоматическим подсчетом импульсов, а просто считать их в прерывании от таймера. Заодним, гораздо проще так сделать S-кривую разгона и торможения.
to be or not to be = -1
Re: Расчет и поиск делителя PSC и периода ARR для таймера ST
[uquote="Sergi",url="/forum/viewtopic.php?p=3788169#p3788169"]Вы немного не поняли.
Параметры движения задаются тремя величинами. Расстояние - которое нужно проехать. Скорость - с какой нужно проехать. Разгон - как набирать скорость/тормозить.
Задавая частоту таймеру вы задаете скорость двигателя. Подразумеваю сигнал Step.
Изменение частоты этого таймера - разгон/торможение.
Количество переполнений этого таймера - расстояние(обороты в штуках или Step_ах).
Чтобы не считать программно эти шаги можно привязать другой (Slave) таймер. В его регистре CNT будет количество шагов которое можно прочитать в любой момент. DMA не нужно. Направление счета этого таймера должно соответствовать сигналу DIR.
Главное пройти заданное количество шагов без перелета и подойти к конечной точке с заданной скоростью (иногда с нулевой).
Часто нужно синхронизировать движение одного двигателя с другим(и). Здесь да - нужно изменять скорость пропорционально(косая прямая/дуга окружности). Но до этого вопроса вы пока не дошли.[/uquote]
Да можно (хотя и с DMA ситуация аналогичная, там тоже можно прочитать число запросов до конца, то есть запас шагов), честно говоря уже нашел применение - когда надо выдать 32-битное число шагов, применю делитель в виде второго таймера, его и буду отслеживать по DMA, таким образом вообще без промежуточных прерываний можно запустить цепочку, а она автономно до конечного прерывания будет выполнять задачу.
Параметры движения задаются тремя величинами. Расстояние - которое нужно проехать. Скорость - с какой нужно проехать. Разгон - как набирать скорость/тормозить.
Задавая частоту таймеру вы задаете скорость двигателя. Подразумеваю сигнал Step.
Изменение частоты этого таймера - разгон/торможение.
Количество переполнений этого таймера - расстояние(обороты в штуках или Step_ах).
Чтобы не считать программно эти шаги можно привязать другой (Slave) таймер. В его регистре CNT будет количество шагов которое можно прочитать в любой момент. DMA не нужно. Направление счета этого таймера должно соответствовать сигналу DIR.
Главное пройти заданное количество шагов без перелета и подойти к конечной точке с заданной скоростью (иногда с нулевой).
Часто нужно синхронизировать движение одного двигателя с другим(и). Здесь да - нужно изменять скорость пропорционально(косая прямая/дуга окружности). Но до этого вопроса вы пока не дошли.[/uquote]
Да можно (хотя и с DMA ситуация аналогичная, там тоже можно прочитать число запросов до конца, то есть запас шагов), честно говоря уже нашел применение - когда надо выдать 32-битное число шагов, применю делитель в виде второго таймера, его и буду отслеживать по DMA, таким образом вообще без промежуточных прерываний можно запустить цепочку, а она автономно до конечного прерывания будет выполнять задачу.
Re: Расчет и поиск делителя PSC и периода ARR для таймера ST
Да,верно. В регистр CCR второго таймера заносим число шагов (и обнуляем CNT) или разности текущего значения CNT и необходимого. Ждем прерывания с флагом совпадения CCR. В прерывании останавливаем первый таймер. Доехали.
Частоту первого таймера можем устанавливать в зависимости от близости конечной и начальной точек от текущего CNT второго таймера или принять фиксированную. Ее можно проверять в отдельном прерывании, например SysTick раз в 1 мсек.
В этом же прерывании будет удобно задавать параметры перемещения.
Частоту первого таймера можем устанавливать в зависимости от близости конечной и начальной точек от текущего CNT второго таймера или принять фиксированную. Ее можно проверять в отдельном прерывании, например SysTick раз в 1 мсек.
В этом же прерывании будет удобно задавать параметры перемещения.
Re: Расчет и поиск делителя PSC и периода ARR для таймера ST
[uquote="Trully",url="/forum/viewtopic.php?p=3788170#p3788170"]Для события Update - другой канал DMA. На память не помню, но что другой - это стопудово. - посмотрите по таблице каналов.
ЛАдно, сам посмотрел, а то еще не найдете (судя по тому, что никто так до сих пор и не додумался до этого): [/uquote]
Точняк, я эту таблицу так сказать один раз открыл, когда каналы таймера смотрел, а то что Update стоит отдельно (а изначально на Update я не рассчитывал) не заметил. Сходу вопрос, а если забазироваться на запрос к DMA от таймера по Update, и соответственно останавливать таймер в прерывании по "последнему" запросу, он случаем не успеет выдать хоть и микро, но все же импульс? Тк по идее таймер сам себя обнуляет и продолжает работать не смотря на прерывание, а его начальное состояние у меня стоит High. Хотя я возможно не совсем правильно понимаю принцип работы.
ЛАдно, сам посмотрел, а то еще не найдете (судя по тому, что никто так до сих пор и не додумался до этого): [/uquote]
Точняк, я эту таблицу так сказать один раз открыл, когда каналы таймера смотрел, а то что Update стоит отдельно (а изначально на Update я не рассчитывал) не заметил. Сходу вопрос, а если забазироваться на запрос к DMA от таймера по Update, и соответственно останавливать таймер в прерывании по "последнему" запросу, он случаем не успеет выдать хоть и микро, но все же импульс? Тк по идее таймер сам себя обнуляет и продолжает работать не смотря на прерывание, а его начальное состояние у меня стоит High. Хотя я возможно не совсем правильно понимаю принцип работы.
- Реклама
Re: Расчет и поиск делителя PSC и периода ARR для таймера ST
Что то я наверное не совсем понял, но
[uquote="auric",url="/forum/viewtopic.php?p=3785493#p3785493"]Тогда возникает ряд неудобств, для получения частоты 1 Гц я должен тактирующую частоту 72МГц поделить на 72000000, а это никак не влезает в 16 битные регистры[/uquote]кто вам мешает:Вот и 1гц.
Для разгона/торможения где нибудь в цикле уменьшайте/увеличивайте до нужных значений PSC и все вроде.
[uquote="auric",url="/forum/viewtopic.php?p=3785493#p3785493"]Тогда возникает ряд неудобств, для получения частоты 1 Гц я должен тактирующую частоту 72МГц поделить на 72000000, а это никак не влезает в 16 битные регистры[/uquote]кто вам мешает:
Код: Выделить всё
TIM14->PSC = 72000-1;
TIM14->ARR = 1000;
Для разгона/торможения где нибудь в цикле уменьшайте/увеличивайте до нужных значений PSC и все вроде.
Если птичка уже в одном прыжке от тебя, всё-таки побереги свой нос, может она за оконным стеклом???


