Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.68/119: Рейтинг темы: голосов - 119, средняя оценка - 4.68
qws
0 / 0 / 0
Регистрация: 25.04.2017
1

ШИМ на фиксированное количество импульсов

01.10.2014, 00:12. Просмотров 21706. Ответов 44
Метки нет (Все метки)

Занимаюсь разработкой небольшого фрезерно-гравировального станка с ЧПУ.
Есть задача управлять тремя шаговыми двигателями. Конкретнее, каждый ШД должен сделать фиксированое количество шагов с фиксированной скоростью.
Для генерации управляющих сигналов ШД использую таймеры в режиме ШИМ. И все бы хорошо, если бы был способ фиксировать количество шагов сделанных каждым двигателем с минимальным задействованием ресурсов МК.
Пока что все реализовано так: три таймера генерируют ШИМ трех различных частот, четвертый считает время прошедшее от начала генерации и сравнивает его с заданным, по достижению заданного времени генерирутся прерывание в котором генерация всех ШИМ прекращается. Время рассчитвается на основе координат начальной и конечной точек перемещения, и скорости подачи.
Недодостатков у способа достаточно, поэтому хотелось бы решить задачу другим путем.
Была мысль считать количество сделанных шагов в прерывания каждого таймера отдельно, но получается достаточно громоздко.
Если кто сталкивался с подобным, прошу поделиться советом как это лучше реализовать.
МК - STM32F103RB.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2014, 00:12
Ответы с готовыми решениями:

stm8L шим, заданное количество импульсов.
Здравствуйте, у меня такой вопрос, можно ли с помощью STM8L, сгенерировать...

Аппаратно выдать определенное количество импульсов
Процессор STM32F103. Необходимо чтобы на 4 ножки процессора выдавались пачки...

Выполнение задачи за фиксированное время
Есть цикл, который меняет скважность ШИМ по линейному закону. В цикле...

Счетчик импульсов
Всем привет. Требуется сделать быстрые счетчик кол-ва имупльсов. Частота...

Генератор импульсов на STM8
Всем привет, Осваиваю STM8, сейчас разбирайюсь с таймерами. Моя задача...

44
KotyoMor
0 / 0 / 0
Регистрация: 07.02.2013
Сообщений: 97
01.10.2014, 20:28 21
Цитата Сообщение от _pv
Цитата Сообщение от KotyoMor
Зачем этот изврат с ДМА если можно использовать таймер в режиме счета?
в F103 всего 4 таймера, 3 из которых уже заняты генерацией импульсов,
а считать, я так понял, хочется импульсы всех 3х таймеров независимо, при этом каналов дма 7 штук - не жалко.
и в чем именно изврат?
то есть какая разница записать требуемое количество импульсов после которого возникнет прерывание в регистр TIM_CCR или в регистр DMA_CNDTR?

В том что дма для других целей предназначен))
0
_pv
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
01.10.2014, 20:54 22
Цитата Сообщение от KotyoMor
В том что дма для других целей предназначен))
это всего лишь устройство которое перекладывает N данных по определённому событию, и как только N закончилось выдаёт прерывание, так что именно для этого он и предназначен. То что от него используется только часть, так как надо только считать события без собственно пересылки данных, ничего страшного.
особенно если учесть что определённые каналы ДМА гвоздями прибиты к определённой периферии и если, например, АЦП не используется с ДМА, то ни для чего другого 1й канал ДМА кроме как для таймера всё равно использовать нельзя.
не нравится - считайте тогда одним оставшимся таймером количество импульсов по всем трём каналам сразу.
0
Mimzodo
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 70
01.10.2014, 22:10 23
Извиняюсь за грубость, но! Изврат - это генерировать три пачки низкочастотных импульсов с помощью трех таймеров и DMA, когда ресурсов хоть жопой жуй. В чём проблема завести прерывание от одного таймера и программно выдавать хоть десять сигналов? Какие, нафиг, DMA с тремя таймерами? Какая лишняя загрузка и возможные конфликты с другими прерываниями? Сразу вспомнилось:

<Изображение удалено>
0
KotyoMor
0 / 0 / 0
Регистрация: 07.02.2013
Сообщений: 97
01.10.2014, 22:49 24
А не проще сразу взять МК подходящий под задачу?
0
Iddy_Im
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 1,406
01.10.2014, 22:59 25
Кстати, насчет простоты: на STM8 я управлял квазинезависимо (чуть не допилил для полной независимости) тремя ШД: таймеры 1-3 генерировали с нужной частотой ШИМ с заполнением 50%, а в прерываниях было:
Код
#define TREG(N, R)      TIM##N##_##R

#define STPR_INTR(X)                                            \
if(TREG(X, SR1) & TIM_SR1_UIF){                 \
TREG(X, SR1) &= ~TIM_SR1_UIF;           \
if(Nsteps[X-1]){                                        \
if(++usteps[X-1] == USteps){    \
usteps[X-1] = 0;                        \
if(!StepperInfty)                       \
if(--Nsteps[X-1] == 0){         \
stop_motor(X-1);                \
}                                                       \
}                                                               \
}                                                                       \
}
INTERRUPT_HANDLER(TYM1_UPD_OVF_TRG_BRK_IRQHomdler, 11){
STPR_INTR(1);
}
INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHomdler, 13){ // generate putsis for stepper CLK
STPR_INTR(2);
}
INTERRUPT_HANDLER(TIM3_UPD_OVF_BRK_IRQHomdler, 15){
STPR_INTR(3);
}
т.е. просто считаю шаги и "микрошаги"
0
_pv
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
02.10.2014, 01:13 26
Цитата Сообщение от KotyoMor
А не проще сразу взять МК подходящий под задачу?
a stm32f103 уже не подходит чтобы 3мя шаговыми двигателями управлять??

Цитата Сообщение от Mimzodo
Извиняюсь за грубость, но! Изврат - это генерировать три пачки низкочастотных импульсов с помощью трех таймеров и DMA, когда ресурсов хоть жопой жуй. В чём проблема завести прерывание от одного таймера и программно выдавать хоть десять сигналов? Какие, нафиг, DMA с тремя таймерами? Какая лишняя загрузка и возможные конфликты с другими прерываниями?
Изврат - это при наличии периферии которую можно один раз настроить и забыть пока она не отработает и прерывание дернет, делать всё то же самое процессором.

какой джиттер и будет у импульсов сделанных программно от одного таймера?
для шагового двигателя не особо принципиально конечно, но вообще некрасиво.

и вообще, мало ли что там UART аппаратный есть, извращение какое, программный же круче, его на любые ноги повесить можно, а ресурсов всё равно хоть жопой жуй!!!
0
oxford
0 / 0 / 0
Регистрация: 20.05.2016
02.10.2014, 02:25 27
Вам нужен один таймер и 3 переменных (если 3 оси).
Таймер постоянно тикает, и выдает на осях импульсы бесконечно.
Вам достаточно будет дать команду записью в переменные числа:
X = 10;
Y = 15;
Z = 20;

А таймер отработает их ровненько декрементом, если инверсно выводить, будет 50% скважность.
Т.е. таймер с каждым тактом инвертирует ноги.
Если переменная станет равна нулю, просто игнорит.
0
Mimzodo
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 70
02.10.2014, 13:42 28
Oxford
И я о том же им говорю!

_pv
Не надо передергивать. Программный UART при наличии аппаратного такое же валяние дурака, как и попытка использовать DMA с кучей таймеров там, где проще использовать программное решение, которое, кстати, выйдет более гибким. Джиттер - это вообще из пальца высосано. Во-первых его можно свести к минимуму, а во-вторых, сам же сказал, что он не важен, зачем тогда о нём вообще было упоминать?

Да, и что за такая привычка у людей пошла - беречь ресурсы ядра? А на что оно тогда, если его не использовать? Вот нет! Нагорожу десять таймеров, пять DMA, но ядро не нагружу ни за что! Ни строчки if!

Надо для всего использовать наиболее подходящее, удобное, и гибкое решение, а не руководствоваться высосанными из пальца критериями. Есть аппаратный UART - используем его. Надо пересылать данные - есть DMA. Надо отсчитывать разные пачки импульсов - используем таймер и пару строк кода.
0
Tistir500
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 333
02.10.2014, 13:43 29
Как менять скорость (частоту импульсов) каждого движка?
0
_pv
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
02.10.2014, 15:03 30
Цитата Сообщение от Mimzodo
Oxford
И я о том же им говорю!
частота у импульсов разная должна быть, а не одинаковая для всех каналов.
с микрошагом десяток кГц вполне может быть.
если тупо делить нацело, частота прерываний получится запредельной, а если сделать DDS c аккумулятором фазы то будет джиттер как раз в период программного таймера.

Цитата Сообщение от Mimzodo
_pv
Не надо передергивать. Программный UART при наличии аппаратного такое же валяние дурака, как и попытка использовать DMA с кучей таймеров там, где проще использовать программное решение, которое, кстати, выйдет более гибким. Джиттер - это вообще из пальца высосано. Во-первых его можно свести к минимуму, а во-вторых, сам же сказал, что он не важен, зачем тогда о нём вообще было упоминать?
есть периферия которая может сделать то что надо,
а вместо записи пары значений в регистры, предлагается на сотне кГц прыгать в прерывание от таймера дергать gpio руками.
то есть абсолютно тоже самое что использование программного uarta при наличии аппаратного.
а про джиттер я всего лишь спросил какой он будет, желательно в общепринятых единицах измерения, а не "минимальный" и "незначительный".
требований ТС к точности ни я, ни Вы не знаете, может у него механика точно сделана и обратная связь по положению с интерферометра с разрешением в доли мкм и он отдельные микрошаги там видит.

Цитата Сообщение от Mimzodo
Да, и что за такая привычка у людей пошла - беречь ресурсы ядра? А на что оно тогда, если его не использовать? Вот нет! Нагорожу десять таймеров, пять DMA, но ядро не нагружу ни за что! Ни строчки if!
вот ведь все производители МК дураки какие, нет чтобы сделать голое ядро с частотой побольше которое будет ногодрыганием любую периферию программно делать, все наоборот стараются напихать побольше никому ненужной периферии.

Цитата Сообщение от Mimzodo
Надо для всего использовать наиболее подходящее, удобное, и гибкое решение, а не руководствоваться высосанными из пальца критериями. Есть аппаратный UART - используем его. Надо пересылать данные - есть DMA. Надо отсчитывать разные пачки импульсов - используем таймер и пару строк кода.
вы сейчас сами себе противоречите.
0
Iddy_Im
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 1,406
02.10.2014, 15:17 31
Кстати, обычно шаговики "захлебываются" уже на трех-четырех сотнях шагов в секунду! Если стандартные драйверы ШД использовать, то максимальный микрошаг получается 1/32, т.е. максимальная частота прерываний таймера, генерирующего ШИМ, составляет 12.8кГц. А это вполне немного по сравнению с тактовой частотой.
Учитывая то, что в прерывании лишь идет проверка значения счетчика шагов и декремент его, если нужно (или отключение таймера), то эти прерывания совсем немного тактов занимают.
А вот если вы решите внутри прерывания еще и ногами дрыгать, то будет хреновей, понятное дело!

Кстати, ШИМу не обязательно постоянно делать заполнение в 50%: можно выставить длительность "единицы" в требуемое драйвером значение (скажем, 1мс) и не менять его в дальнейшем.

Вот, кстати, не помню: сколько у STM32 таймеров могут настраиваться в роли ведомых. А то ведь можно один таймер (ведущий) использовать для счета шагов, а другой (ведомый) — для генерации ШИМ.
P.S. А еще что-то кажется мне, что у более продвинутых STM32 (вроде 407-го) была возможность "железно" выдавать N импульсов на выход таймера. Правда, обычно всего-то 3-4 таймера имеют внешние ноги, но и в случае ШИМа эта проблема остается.
0
Mimzodo
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 70
02.10.2014, 18:36 32
Цитата Сообщение от _pv
требований ТС к точности ни я, ни Вы не знаете
Поэтому, следую принципу Бритвы Оккама, я предполагаю, что требований к точности нет.

Цитата Сообщение от _pv
А про джиттер я всего лишь спросил какой он будет, желательно в общепринятых единицах измерения, а не "минимальный" и "незначительный".
Будет равен джиттеру прерывания.

Цитата Сообщение от _pv
Частота у импульсов разная должна быть, а не одинаковая для всех каналов...
если тупо делить нацело, частота прерываний получится запредельной
Поэтому я и спрашивал чему равны частоты, но мне не ответили. Да и почему запредельной?

Цитата Сообщение от Iddy_Im
Кстати, обычно шаговики "захлебываются" уже на трех-четырех сотнях шагов в секунду!
У меня такая же информация, поэтому откуда _pv берет запредельные частоты я не понимаю.

Цитата Сообщение от Iddy_Im
12.8кГц
Это не просто немного, это копейки, учитывая, что в нем всего несколько условий да инкрементов будут.

Iddy_Im писал(а):
А вот если вы решите внутри прерывания еще и ногами дрыгать, то будет хреновей, понятное дело!
Почему?
0
oxford
0 / 0 / 0
Регистрация: 20.05.2016
02.10.2014, 18:41 33
Цитата Сообщение от Tistir500
Как менять скорость (частоту импульсов) каждого движка?
А где это в задаче задано?

Занимаюсь разработкой небольшого фрезерно-гравировального станка с ЧПУ.
Есть задача управлять тремя шаговыми двигателями. Конкретнее, каждый ШД должен сделать фиксированое количество шагов с фиксированной скоростью.
Для генерации управляющих сигналов ШД использую таймеры в режиме ШИМ. И все бы хорошо, если бы был способ фиксировать количество шагов сделанных каждым двигателем с минимальным задействованием ресурсов МК.

Другой задачи не было, будет другая задача будет другое решение.

По частотам: у него TB6560 юзаются, а там Step ограничен до 15 кгц по паспорту.
0
BykTiho
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
02.10.2014, 18:47 34
Я до сих пор не пойму зачем ШИМ делать на шаговый двигатель?
0
oxford
0 / 0 / 0
Регистрация: 20.05.2016
02.10.2014, 18:49 35
Цитата Сообщение от BykTiho
Я до сих пор не пойму зачем ШИМ делать на шаговый двигатель?
А ШИМ и не надо делать, надо формировать импульсы которые укладываются в параметры микросхемы.
Скважность тут менять не требуется. Ничего модулировать не надо.

Лучше со скважностью 50%. Это и делается одним таймером который инвертирует ноги.
Частота максимум 15 кгц. Выше не прыгнем. Общую скорость осей легко можно будет изменить сменой частоты таймера.
0
qws
0 / 0 / 0
Регистрация: 25.04.2017
04.10.2014, 00:22 36
Спасибо всем за советы и активное обсуждение.
Максимального колличества шагов в секунду я и сам не знаю. Ситуация у меня такая:
Пара кафедр университета, в котором я учусь, для популяризации технических специальностей среди школьников и абитуриентов решила создать что-то сродни наглядному пособию для агитации. Мол смотрите какие класнные вещи можно научится у нас делать, всех желающих ждем в приемной комиссии. Выбор пал на фрезерно-гравировальный станок. Станину взялась спроектировать кафедра непосредственно этому обучающая студентов, а вот за электроникой обратилась на мою кафедру. Для проектирования электронной части решили привлечь студентов, так я и стал участником этого дела. В качестве профитов от этого всего надаесь недорого достать статину в собственное пользование.
Станину я еще в глаза не видел, все что знаю о шаговиках это то, что они на рабочее напряжение 12В, с током потребления 3А и шагом 0,9 градусов. С учетом всей механики станины точность обработки до 0,1 мм. Это собственно все.
ШИМ я изначальном решил применить по одной причине: ШИМ сигнал генерируется таймерами аппаратно, без задействования ЦП.
0
Mokubo
0 / 0 / 0
Регистрация: 27.10.2012
Сообщений: 37
04.10.2014, 00:45 37
можно почитать тут: http://roboforum.ru/forum10/topys11848. ... ead#unread

посмотреть как они сделали ;), и использовать, или написать по своему.
0
OrtDim
0 / 0 / 0
Регистрация: 16.05.2013
Сообщений: 179
05.10.2014, 01:03 38
Цитата Сообщение от BykTiho
Я до сих пор не пойму зачем ШИМ делать на шаговый двигатель?
ШИМ нужен для микрошага, если требуется большая точность позиционирования, чем это позволяет один шаг двигателя.
0
_pv
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
05.10.2014, 01:25 39
Цитата Сообщение от OrtDim
Цитата Сообщение от BykTiho
Я до сих пор не пойму зачем ШИМ делать на шаговый двигатель?
ШИМ нужен для микрошага, если требуется большая точность позиционирования, чем это позволяет один шаг двигателя.
контроллеру tb6560 никакой ШИМ для микрошага не нужен.
просто ТС не хочет импульсы ногодрыганием делать и процессором отсчитывать нужное количество, хочет чтобы это таймер сам сделал.
0
Tistir500
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 333
05.10.2014, 02:29 40
Цитата Сообщение от QWS
Максимального колличества шагов в секунду я и сам не знаю.
При выбранном tb6560 известно - 15000 в сек.
0
05.10.2014, 02:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2014, 02:29

stm32 счетчик импульсов.
Ребят. А счетчик импульсов в стандартной библиотеке функцией...

STM32F429 генератор импульсов
Господа, помогите кто нибудь... Мучаемся с коллегой уже месяц... ни как...

Генератор импульсов на C8051F020
Уважаемые господа! Есть задача настроить вывод микроконтроллера так, чтобы с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru