управление ШД
|
|
доцент2 |
Дата: Пт, 12.10.2012, 22:02 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
для пробы взял ШД М42SP-5 и UNL2003. программу пока приводить не буду, она очень простая. цель запустить вал ШД сначала в одну сторону, а затем в другую на заданное количество шагов. Проблемка следующая: Например, надо сделать 12 шагов по 7,5 градусов, т.е. вал должен повернуться на 90 градусов. Первый шаг вал совершает в обратную сторону, а остальные 11 в нужную. в результате вал поворачивается на 82,5 градуса. Если продолжать вращение в туже сторону после остановки, то все нормально. А если запускаем в обратную сторону, то таже картина 1 шаг обратно, все остальные в нужном направлении. Подскажите в чем может быть дело.
|
|
|
|
dimitriy-bc |
Дата: Сб, 13.10.2012, 00:28 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
150
Замечания:
±
На сайте с 19.03.2012
Статус:
Offline
|
Скорее всего, проблема в следующем. Когда ШД обесточен, то статор притягивает ротор, полюс к полюсу. Один из вариантов, Вы, я предполагаю, в первом шаге подаете ток на обе обмотки. Соответственно полюс ротора располагается между двух полюсов статора. Двигатель делает не один шаг назад, а половину шага. Также, обратите внимание на следующее, программа должна, перед обесточиванием, останавливаться на шаге, а не полушаге и начинаться, при первом включении, с того же шага на котором закончилась. В противном случае, Вам необходимо использовать маяки, для привязки привода к отправной точке. Для того чтоб помочь Вам разобраться, напишите двигатели используемые Вами униполярные или биполярные. Сколько градусов на шаг. Управление полно шаговое или полу шаговое, ну и программа не помешает.
Сообщение отредактировал
dimitriy-bc - Сб, 13.10.2012, 00:51
|
|
|
|
DAlexV |
Дата: Сб, 13.10.2012, 02:40 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Судя по мануалу это Unipolar . Для того что бы не дергался обратно как правильно сказал dimitriy-bc, сначала подаем толко на 1 оботку, а потом уже переходим на полушаг (или микрошаг). http://electronics-diy.com/electronics/stepper_motors.php Можно для начала попробовать с помошью компа http://www.picbasic.ru/forum/9-168-1#1796 То же в параллельной ветке
Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
доцент2 |
Дата: Сб, 13.10.2012, 10:13 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Спасибо за ответы. Движок униполярный (четыре обмотки с общей точкой). За один шаг вал вращается на 7,5 градусов. Программа управляет в шаговом режиме, т.е. 1000 0100 0010 1000 и т.д. схема аналогична представленной на рис. программка простенькая
Сообщение отредактировал
доцент2 - Сб, 13.10.2012, 10:17
|
|
|
|
DAlexV |
Дата: Сб, 13.10.2012, 16:17 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (доцент2) Программа управляет в шаговом режиме, т.е. 1000 0100 0010 1000 и т.д Четветый шаг должен быть 0001, но это просто очепятка. В программе все норм. Еще из за чего движок может дергаться, если при окончании вращения забыл напругу с обмотки снять. Хотя нет, загнал в Прота, и все сразу стало на свои места. Ищем косяк который сбивает последовательность. И до кучи еще архив приложил. Удачи
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
доцент2 |
Дата: Сб, 13.10.2012, 23:07 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
с последовательностью это действительно опечатка. в начале программы сброс есть и после выполения подпрограмм то же есть. сейчас добавил сброс в ноль и перед каждой подпрограммой, результат тот же - первый один шаг в обратную сторону. не понятно откуда возникает сбой последовательности на выходе МК? ладно, если в протеусе, но это и в железе происходит!
Сообщение отредактировал
доцент2 - Сб, 13.10.2012, 23:08
|
|
|
|
DAlexV |
Дата: Сб, 13.10.2012, 23:10 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (доцент2) ладно, если в протеусе, но это и в железе происходит! Да нет, хуже когда наоборот. Сейчас попробую посмотреть код, может чего и пойму.
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
DAlexV |
Дата: Сб, 13.10.2012, 23:18 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
доцент2, Проблема лежит в переменной "Х". Если не секрет, то для чего она ???? Не особо понятно.
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
dimitriy-bc |
Дата: Сб, 13.10.2012, 23:39 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
150
Замечания:
±
На сайте с 19.03.2012
Статус:
Offline
|
Всем доброго времени суток. Ваша ошибка при переходе на обратное вращение, мне кажется, в следующем. По окончании вращения влево, в Х.1 у Вас записан 0. Соответственно при реверсе программа переходит на участок 8), а должна перейти на участок 6). MainProgram: Inc w ' ======== DelayMS 500 ' If w=1 Then Hag_in=48: GoTo HAG_POL ' DelayMS 500 ' If w=2 Then Hag_in=12: GoTo HAG_POL ' DelayMS 500 ' для пробы задаем последовательность шагов If w=3 Then Hag_in=12: GoTo HAG_OTR ' и направление вращения DelayMS 500 ' If w=4 Then Hag_in=48: GoTo HAG_OTR ' DelayMS 500 ' If w=5 Then w=0: GoTo End_Hag ' =========
' паузы выставлены для нагладности
HAG_POL: 'вращение например влево DelayMS 100 If Hag=Hag_in Then GoTo End_Hag 1) If X.1=0 Then BIT4=1:BIT5=0:BIT6=0:BIT7=0: X.1=1: X.2=0: Inc Hag '++++++++++++++++++++++++++++++++++++ DelayMS 100 If Hag=Hag_in Then GoTo End_Hag 2) If X.2=0 Then BIT4=0:BIT5=1:BIT6=0:BIT7=0: X.2=1: X.3=0: Inc Hag '++++++++++++++++++++++++++++++++++++ DelayMS 100 If Hag=Hag_in Then GoTo End_Hag 3) If X.3=0 Then BIT4=0:BIT5=0:BIT6=1:BIT7=0: X.3=1: X.4=0: Inc Hag '++++++++++++++++++++++++++++++++++++ DelayMS 100 If Hag=Hag_in Then GoTo End_Hag 4) If X.4=0 Then BIT4=0:BIT5=0:BIT6=0:BIT7=1: X.4=1: X.1=0: Inc Hag GoTo HAG_POL
HAG_OTR: 'вращение вправо DelayMS 100 If Hag=Hag_in Then GoTo End_Hag 5) If X.4=0 Then BIT4=0:BIT5=0:BIT6=0:BIT7=1: X.4=1: X.3=0: Inc Hag '++++++++++++++++++++++++++++++++++++ DelayMS 100 If Hag=Hag_in Then GoTo End_Hag 6) If X.3=0 Then BIT4=0:BIT5=0:BIT6=1:BIT7=0: X.3=1: X.2=0: Inc Hag '++++++++++++++++++++++++++++++++++++ DelayMS 100 If Hag=Hag_in Then GoTo End_Hag 7) If X.2=0 Then BIT4=0:BIT5=1:BIT6=0:BIT7=0: X.2=1: X.1=0: Inc Hag '++++++++++++++++++++++++++++++++++++ DelayMS 100 If Hag=Hag_in Then GoTo End_Hag 8) If X.1=0 Then BIT4=1:BIT5=0:BIT6=0:BIT7=0: X.1=1: X.4=0: Inc Hag GoTo HAG_OTR
End_Hag: Hag=0Добавлено (13.10.2012, 23:39) --------------------------------------------- Переменная Х, используется при реверсировании. Благодаря ей программа знает, с какого шага начинать реверсивное движение.
|
|
|
|
доцент2 |
Дата: Сб, 13.10.2012, 23:45 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
попробую это исправить. Но остается вопрос, почему при первом запуске (влево или вправо) вал ШД дергается в обратную сторону на один шаг.
|
|
|
|
DAlexV |
Дата: Вс, 14.10.2012, 00:38 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (dimitriy-bc) Переменная Х, используется при реверсировании. Благодаря ей программа знает, с какого шага начинать реверсивное движение. Счетчик номера шага. Прикольно что в двоичном счислении. Немного переделал программу. Единый блок для вращения и по часовой, и против. Приложил, изучайте, успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
доцент2 |
Дата: Вс, 14.10.2012, 11:10 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Переменная Х введена для определения "позиции" при движении в прямом и обратном направлении. В памяти переменные Byte и Bit все равно занимают 8 ячеек. DalexV спасибо за упрощение кода.Непонятно вот это Dec StepN ' -1 к номеру шага
If StepN >=254 Then ' если больше 254 StepN =3 ' то номер шага 3 End If Почему 254, может записать StepN <=0? Загнал прошивку в железо - опять первый шаг назад остальные вперед, тоже самое при реверсе.
|
|
|
|
dimitriy-bc |
Дата: Вс, 14.10.2012, 19:09 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
150
Замечания:
±
На сайте с 19.03.2012
Статус:
Offline
|
доцент2, попробуйте такой вариант.
|
|
|
|
доцент2 |
Дата: Вс, 14.10.2012, 20:37 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Не работает однако! В условиях ошибка, надо разбираться. Вот, подправил: STEP_C: DelayMS 20 If Hag=Hag_in Then GoTo End_Hag Hag = Hag + 1 DelayMS 10 If FLAG.0 = 0 Then X=X+1 If X >= 5 Then X=1: GoTo WORK Else GoTo WORK EndIf Else X=X-1 If X <= 0 Then X=4: GoTo WORK Else GoTo WORK EndIf EndIf
заработало отлично, сбоев нет!!! может кто объяснит, в чем существенная разница.
Сообщение отредактировал
доцент2 - Вс, 14.10.2012, 21:19
|
|
|
|
DAlexV |
Дата: Пн, 15.10.2012, 22:37 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (доцент2) DalexV спасибо за упрощение кода.Непонятно вот это Dec StepN ' -1 к номеру шага If StepN >=254 Then ' если больше 254 StepN =3 ' то номер шага 3 End If Почему 254, может записать StepN <=0? Соори, горю на работе поэтому бываю урывками. Quote (DAlexV) Dec StepN ' -1 к номеру шага If StepN >=254 Then ' если больше 254 StepN =3 Здесь все просто. Переменная Byte может принимать значение 0-255, и если от 0 сделать вычитание Dec StepN, то получиться $FF или 255(DEC). И поэтому для подстраховки было выбрано число 254, ведь 254 шаг не может существовать. Проще говоря если после вычитания номер шага более 200, то номер шага равен максимально возможному значению. Quote (доцент2) В памяти переменные Byte и Bit все равно занимают 8 ячеек Здесь несогласен. Это классика жанра как говорят. 1 Byte= 8 Bit. Или как считают программисты в одном километре 1024 метра Quote (доцент2) Но остается вопрос, почему при первом запуске (влево или вправо) вал ШД дергается в обратную сторону на один шаг. . Тогда есть предположение о перепутанных обмотках. вместо последовательности 0-1-2-3 идет 1-2-3-0. Как следствие первый шаг назад, а далее уже нормально. Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|