Непонятки в управлении ШД
- Войдите на сайт для отправки комментариев
Пнд, 03/08/2015 - 17:50
Уважаемые Гуру! Помогите разобраться с программой. У меня MEGA 2560, остальное все как на картинках в первоисточнике. Библиотеку скачал. Первоисточник: http://forum.hobbycomponents.com/viewtopic.php?f=76&t=1371 Запустил, двигатель вращается в обе стороны, скорость меняется в зависимости от положения ротора резистора. Все вроде правильно, но при вращении в одну сторону частота "Step-Clk" 993Гц, а в другую 763Гц. Это первое, а второе как увеличить эту самую частоту? Заранее благодарен.
/* Include the library */ #include "HCMotor.h" /* Pins used to drive the motors */ #define DIR_PIN 8 //Connect to drive modules 'direction' input. #define CLK_PIN 9 //Connect to drive modules 'step' or 'CLK' input. /* Set the analogue pin the potentiometer will be connected to. */ #define POT_PIN A0 /* Set a dead area at the centre of the pot where it crosses from forward to reverse */ #define DEADZONE 20 /* The analogue pin will return values between 0 and 1024 so divide this up between forward and reverse */ #define POT_REV_MIN 0 #define POT_REV_MAX (512 - DEADZONE) #define POT_FWD_MIN (512 + DEADZONE) #define POT_FWD_MAX 1024 /* Create an instance of the library */ HCMotor HCMotor; void setup() { //Serial.begin(9600); /* Initialise the library */ HCMotor.Init(); /* Attach motor 0 to digital pins 8 & 9. The first parameter specifies the motor number, the second is the motor type, and the third and forth are the digital pins that will control the motor */ HCMotor.attach(0, STEPPER, CLK_PIN, DIR_PIN); /* Set the number of steps to continuous so the the motor is always turning whilst not int he dead zone*/ HCMotor.Steps(0,CONTINUOUS); } void loop() { int Speed, Pot; /* Read the analogue pin to determine the position of the pot. */ Pot = analogRead(POT_PIN); /* Is the pot in the reverse position ? */ if (Pot >= POT_REV_MIN && Pot <= POT_REV_MAX) { HCMotor.Direction(0, REVERSE); Speed = map(Pot, POT_REV_MIN, POT_REV_MAX, 10, 1024); /* Is the pot in the forward position ? */ }else if (Pot >= POT_FWD_MIN && Pot <= POT_FWD_MAX) { HCMotor.Direction(0, FORWARD); Speed = map(Pot, POT_FWD_MIN, POT_FWD_MAX, 1024, 10); /* Is the pot in the dead zone ? */ }else { Speed = 0; } /* Set the duty cycle of the clock signal in 100uS increments */ HCMotor.DutyCycle(0, Speed); }
А как вы измеряли эту частоту?
Судя по скетчу - скорость должна быть одна и та-же. Какое сопротивление у резистора?
Спасибо!
Сопротивление 10К, пробовал менять местами + и - изменений нет. А измерял осциллографом со встроенным мультиметром на входах платы CLK+ и CLK-. Сам не пойму в чем дело, вроде все правильно и скорость должна быть равной... А самое главное как ускорить работу моторов: если на TB6560 выставить шаг 1/16, то совсем медленно получается, хотя сама микросхема должна держать до 15КГц.
В режиме бреда попробуйте
#define DEADZONE 0
Так это "мертвая зона", при которой мотор должен стоять!
И еще вопрос к знающим людям: как переписать скетч, чтобы 3-мя резисторами управлять 3-мя ШД? С подключением, я надеюсь, трудностей не возникнет...
Изменил часть кода и все заработало, хотя непонятно... Теперь частота около 5КГц в любую сторону. Как подключить в программе еще 2 мотора?
Здравствуйте! Снова нужно помощь... Переписал скетч на 3 мотора и 3 потенциометра. Собрал схему и выяснилось следующее: моторы работают параллельно от любого из потенциометров. То есть один потенциометр управляется сразу 3-мя моторами. Если подключить второй потенциометр, то он тоже будет упралять тремя моторами и конфликтовать с первым. Как назначить на один потенциометр - один мотор? Спасибо!
Вам нужно несколько экземпляров класса
HCMotor
Странно, что все три работают, а не только последний объявленный. Хотя...
Ваша строка 28 заводит переменную типа "мотор". И эта переменная у Вас одна - значит и мотор логически один! Перепишите её в таком виде:
HCMotor HCMotor1, HCMotor2, HCMotor3;
и везде в программе. где речь идёт о первом моторе, используйте HCMotor1, где о втором - HCMotor2, и т.д.
Только аккуратно везде всё поменяйте.
ну три мотора, а speed осталась одна.
заведи speed1. speed2, speed3
ну три мотора, а speed осталась одна.
заведи speed1. speed2, speed3
Исправил, но еще не проверял.. Двигаюсь в правильном направлении?
и подкорректируйте все спиды, у вас с ними полная каша стр 83 и 89
Vvadim, при вашем написании кода ругается: "else" without previous "if"
Все спасибо за помощь! Все заработало! Кому интересно выкладываю скетч на 3 мотора (есть еще на 2).
Теперь следующая задача: Надо, чтобы ШД следил за резистором: повернули резистор на х градусов и мотор провернулся на Х градусов.
И еще, надо запитать с платы Ардуино 3 электромагнита от 3 кнопок.
Еще раз всем спасибо за помощь!
я как пример для размышлений привёл
с этой не знаю, я с ней не ковырялся.
в acellstepper такой пример есть
Спасибо! Многие ссылаются на примеры из acellstepper. Не могли бы растолковать что и почем? Я скачал папку, там куча примеров, но нет ни схем соединений ни описаний. Как быть?
Неужели ни одной схемы подключения нет?
https://www.pjrc.com/teensy/td_libs_AccelStepper.html
в accelstepper пример Proportional Control
там вроде всё понятно
в accelstepper пример Proportional Control
там вроде всё понятно
Может вам и понятно, а я 3-й день за рулем...
1. В примере испоьзуется 4-х проводное подключение ШД, у меня драйвер ТВ6560 и надо подключать 2 провода: напраление и шаг. Как исправить?
2. Как дополнить мой, уже существующий скетч на 3 мотора новым, использующим эту библиотеку и дописать скетч?
AccelStepper stepper(1, 9, 8);
9 - step, 8 - dir
изучиете библиотеку, там всё расписано по полочкам
вы написали код для двух моторов и он у вас работает. по аналогии добавьте третий мотор
Спасибо, почти разобрался! Написал скетч на 3 мотора. Все работает, но присутствует джиттер - дрожание мотора. http://arduino.ru/forum/programmirovanie/biblioteka-accelstepper здесь описывается похожий случай с использованием гистерезиса, но никак не пойму, как его вклеить в мой скетч... Подскажите, плз, кусок кода...
Что касается изучения библиотек, тут уж извините, не отдупляю... еще на бейсике пытался что-то написать, видно не мое... просто тут остро стоит необходимость...
в этой теме пост #27
я так сделал - всё гуд.
Спасибо! Джиттер возникал из-за наводок на потенциометре! Видимо надо экранировать. Еще такой вопрос при включении системы двигатели поворачаваются на угол, определенный потнциометром. Как от этого избавится? Это очень важно, так как механика не должна дергаться без команды.
а зачем два раза moveTo()
Если бы я знал... я же не программер... Я изменил #28... переписал по образу и подобию в другой теме. Вроде заработало... и причина джиттера оказалась совсем не програмной. Теперь надо все наработки собрать воедино: 2 мотора с изменяемой скоростью от резистора + 3 мотора со слежением + 3 нопки для электромагнитов. Еще раз спасибо за помощь!
a зачем while?
я же вам написал как сделать
экспериментируете))))
Так тоже самое и вышло, хотя я совсем не знаю что такое "While" а уж зачем ... я ваще в тупике... То есть из поста #28 While можно убрать?
while блокирующая функция
http://arduino.ru/Reference/While
сделайте как я вам написал.
проверено.
работает.
Да, работает! Спасибо! Как сделать, чтобы двигатели не вращались при включении?
что значит вращались.
они бегут в позиции потенциометров.
после выкл не трогайте поты, тогда при вкл они и шевелится не бедет
Как бы не так! При включении питания на плату Mega 2560 моторы крутятся ровно на половину пути, при условии, что потенциометры стоят в среднем положении. Причем крутятся в 2 этапа примерно на 15% и потом еще на 35% от полного хода. Если на момент включения потенциометр установлен в "0" мотор стоит, если установлен в +5 делает полный путь опять же в 2 приема 30%+70%. Как бы на момент включения заблокировать мотор в среднем положении и дать понять контроллеру, что он уже в среднем положении? Видимо надо что-то дописать в коде. Планирую использовать джойстик, а он возвращается в среднее положение пружинами.
Может где встречали код под такую функцию: энкодер управляет шд? Типа как тут: http://www.youtube.com/watch?v=dSpo88jKfFo
vvadim, можно ли запретить прохождение сигналов на выходы "steep" на время, скажем 30 секунд, пока не пройдут переходные процессы в контроллере? Или же добавть лишний провод En на каждый мотор и на нем запретить работу двигателей на некоторое время?
step у вас увязаны с потенциометром.
можно в сетапе дать задержку для enable.
если не нужно удержание, то можно подавать enable при изменении значений пот-ра.
step у вас увязаны с потенциометром.
можно в сетапе дать задержку для enable.
если не нужно удержание, то можно подавать enable при изменении значений пот-ра.
По "enable" только на время включения, так как при работе не желательно: мотор останется без удержания и механика может сдвинуться. Или задержку на выходы steep. Как прописать задержку? Вроде бы надо использовать sleep?
в режиме sleep удержания тоже нет.
написали бы что ваяете, может меньше непоняток было бы)))
Станок для установки SMD по типу китайского TM 220A. http://www.youtube.com/watch?v=yRxcYO0nuD8 http://www.youtube.com/watch?v=Q5p7SXM7x1U Народ подобные строит и управляет через MACH3. Ардуина нужна, чтобы погонять механику...
Опять нужна помощь: хочу подать на вход Enable запрет на время переходных процессов. Пробую вставить кусок кода из урока №1 о моргающем диоде. Там используется Delay. Диод то моргает, но и вся програма работает с задержками. Как быть?
Используем millis()
Спасибо!
На другом форуме мне немного растолковали о millis(). Наивно полагая, что все получится, был написан код для сигнала Enable в контроллере на TB6560. На момент включения на вход Enable подается HIGH (на 5 секунд) и двигатель не вращается. Но когда на вход Enable подается LOW, двигатель делает +1 шаг. 10 включений =+10 шагов.... Надо как то запрещать выход Steep на момент включения...
Два мотора Х и У работают, меняя скорость. Моторы Z, A, B работают пропорционально. Вот их и надо заставить не крутиться на момент включения ~ 1,5-2 секунды.