![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 14.11.2009
Сообщений: 8
|
![]()
Здравствуйте!
У меня возникла такая проблема, я написал программу, которая заставляет вращаться шаговый двигатель в оба направления, использовалась библиотека "inpout32.dll", вот исходный код процедур вращения двигателя: 1) вращение по часовой стрелке procedure TForm1.Button3Click(Sender: TObject); var i,n : integer; begin n := StrToInt(Edit2.Text); for i := 1 to n do begin Out32($378,0); Sleep(1); Out32($378,5); end; end; 2) против часовой for i := 1 to n do begin Out32($378,0); Sleep(1); Out32($378,7); end; Полный оборот двигателя - это 1000 шагов, в данной программе n - количество шагов. Можно ли ускорить выполнение этих циклов? Пробовал запустить так: for i := 1 to n do begin Out32($378,0); Out32($378,7); end; то блок управления, через который идут сигналы на двигатель, не успевает обработать сигналы. Подскажите, как быть? |
![]() |
![]() |
![]() |
#2 |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
![]()
Так вы же задаете 1 миллисекунду (Sleep(1)
![]() У вас за сколько двигатель делает один шаг? Явно - не за 1 миллисекунду... Гораздо дольше. Так что вариант только один - другой, более быстроходный двигатель. |
![]() |
![]() |
![]() |
#3 | |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
![]() Цитата:
1) какова частота импульсов поступающих в блок (осциллографом смотрели)? 2) всегда можно использовать делитель частоты
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation |
|
![]() |
![]() |
![]() |
#4 | |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
![]()
К сожалению, значение оператора Sleep(1) не соответствует 1 мсек. Нижний порог оператора Sleep , как и таймера VCL( вкладка Standart) порядка 55-64 мсек (зависит от "железа").Поэтому задержку цикла Слипом здесь не желательно применять. Лучше таймер, и не обычный, а точный (была тема здесь на форуме).
http://www.programmersforum.ru/showt...E0%E9%EC%E5%F0 Второе - Цитата:
Насколько я знаю, у ШД шаг поворота - 1,0 ; 1,5 ; 2,0 ; 2,5 градусов ( редко встречается 0,75).Рабочие частоты сигналов управления ШД - от 0 до 1500-2000 Гц. Третье - попробуйте в качестве задержки вложенный цикл Код:
Вы бы привели паспортные параметры ШД и основные требования к устройству.
И не сомневайся даже ... отдых - кайф, работа - лажа!
Последний раз редактировалось DeKot; 30.11.2009 в 20:34. |
|
![]() |
![]() |
![]() |
#5 | |
Регистрация: 14.11.2009
Сообщений: 8
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#6 | |
Регистрация: 14.11.2009
Сообщений: 8
|
![]() Цитата:
На блоке управления выставлен 1 оборот двигателя, как 1000 шагов, я не в праве менять это значение |
|
![]() |
![]() |
![]() |
#7 |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
![]()
Если ваш блок управления (коммутатор) распределяет входные импульсы управления по четырем обмоткам, то тогда это реально - при шаге 1,5 град. 240 х 4 = 960 имп \ об.Хотя я работал с коммутаторами, преобразующими 1 управляющий импульс на входе коммутатора в 4-е импульса управления на сам двигатель.
Набросал программку управления ШД ( во вложении). В Edit-ах устанавливаете количество шагов и частоту импульсов управления.Величину задержки в строке Код:
Поясняющая диаграмма работы : ![]() Длительность вложенных циклов (по j) одинакова, что обеспечивает скважность управляющих импульсов = 2. Программа работоспособна.Недостатком является то, что при выполнении цикла программа недоступна внешнему управлению.
И не сомневайся даже ... отдых - кайф, работа - лажа!
Последний раз редактировалось mihali4; 02.12.2009 в 00:23. |
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
![]()
попробуйте еще такую конструкцию (внешнее управление доступно):
Код:
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation |
![]() |
![]() |
![]() |
#9 |
Регистрация: 14.11.2009
Сообщений: 8
|
![]()
всем спасибо большое за советы, я уже организовал вложенный цикл, количество выполнений которого зависит от железа, у меня теперь другая проблема) я не могу остановить выполнение циклов(аварийная остановка) и не знаю как сделать секундомер, который бы засекал время выполнения
|
![]() |
![]() |
![]() |
#10 | |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
![]()
Я обращал внимание на недостаток применения циклов (при выполнении цикла программа замкнута в себе и недоступна внешним сигналам). Здесь надо применять таймер ( но не из VCL), а более точный (есть MMTimer). При работе таймера за один его такт происходит формирование управляющего импульса и остается еще время на прерывание. Т.е. внутри цикла таймера формируется импульс требуемой длительности и проверка на внешнее прерывание (аварийный останов, к примеру). Длительность такта таймера должна быть хотя бы на порядок меньше длительности импульса.
Цитата:
Код:
И не сомневайся даже ... отдых - кайф, работа - лажа!
|
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
LPT ПОРТ | master3763 | Общие вопросы C/C++ | 7 | 11.08.2009 10:32 |
LPT-порт адресация #378 | Dj_smart | Компьютерное железо | 0 | 08.06.2009 15:53 |
LPT порт. | Maxs | Помощь студентам | 2 | 19.04.2009 11:47 |
COM порт, или LPT... | _riddik | Общие вопросы Delphi | 1 | 08.06.2007 22:33 |