Обратная связь по положению для шагового двигателя
Я хочу вращать шестерню с помощью шагового двигателя. Пока Arduino включен, все хорошо.
Мое зубчатое колесо передает свою мощность на червячный редуктор. Червь пройдет 10 см и обратно несколько раз. Когда я отключаю питание, шаговый двигатель останавливается в последнем шаге и положении. Когда питание включено, шаговый двигатель начинается с последней позиции, а шаги начинаются с первого шага.
Предположим, что 2038 шагов вращают двигатель на один оборот. Например, при прохождении 1500 шагов и отключении питания. Червь уже на 6 см. И питание включено. Степпер работает от 6 см и проходит 2038 шагов. Сейчас он на 16-м см.
Если я использую сервопривод, то при включенном питании я могу записать двигатель в положение 0. Но я должен использовать шаговый двигатель. Как это исправить?
Шаговый двигатель: 28 BYJ 48 Драйвер: ULN2003A
Треска здесь;
int State;
int Wait;
void setup() {
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
State = 8;
Wait = 2;
}
void loop() {
turnRight(2038);
delay(1000);
turnLeft(2038);
delay(1000);
}
void turnRight(int Step) {
for (int i = 0; i < Step ; i++){
digitalWrite(State,HIGH);
delay(Wait);
digitalWrite(State,LOW);
IncreaseState();
}
}
void IncreaseState() {
State++;
if (State==12){
State=8;
}
}
void turnLeft(int Step) {
for (int i = 0; i < Step ; i++){
digitalWrite(State,HIGH);
delay(Wait);
digitalWrite(State,LOW);
DecreaseState();
}
}
void DecreaseState() {
State--;
if(State==7){
State=11;
}
}
@can, 👍1
2 ответа
Есть несколько способов сделать это. Самый простой и наиболее часто используемый способ - использовать концевой выключатель в качестве датчика исходного положения. При запуске устройство сначала будет вращать двигатель в направлении концевого выключателя, пока выключатель не сработает. Теперь известно абсолютное положение на этой оси, и вы можете продолжить оттуда. (Станки с ЧПУ и 3D-принтеры в основном работают именно так. Часто они снова отходят от концевого выключателя и снова приближаются к выключателю с меньшей скоростью, чтобы повысить точность). Для этого вам просто нужен микропереключатель на оси и подключить его к одному входному контакту. В setup()
вы двигаете шаговый двигатель в направлении концевого выключателя, пока он не активируется. После этого вы находитесь в нулевой позиции и можете продолжить свой набросок.
Более сложный способ – ввести в устройство функцию измерения положения. Сервопривод включает в себя потенциометр, соединенный с осью. Измеряя напряжение на этом потенциометре (по сути, это делитель напряжения), электроника сервопривода всегда может знать, где она находится в данный момент. Существуют также потенциометры фейдеров, в которых вы не вращаете ручку, а перемещаете фейдер по линейной направляющей. Вы можете найти потенциометр фейдера, который подходит к вашей шкале (10 см не так уж и много, может и есть).
Или вы можете сохранить текущую позицию в энергонезависимой памяти (например, EEPROM) и получить ее при запуске. Но так как отключение питания при записи позиции может привести к повреждению данных, придется пойти более сложным путем. Что-то вроде определения того, что питание было отключено, обеспечивая Arduino питанием через большой конденсатор, так что, когда он чувствует потерю питания, у него еще есть достаточно времени, чтобы записать текущую позицию в энергонезависимую память. (Это также лучше для EEPROM, чем постоянная запись в него, так как EEPROM имеет ограниченное количество циклов записи).
В целом я бы предложил использовать первый упомянутый метод (концевой выключатель). Он используется во многих устройствах не просто так. Хотя это зависит от конкретных требований вашего проекта.
Еще один ответ, о котором не упомянул chrism, — использовать "поворотный энкодер абсолютного положения". Это устройство, которое выводит битовый шаблон с использованием «кода Грея» или «двоичного кода Грея», который сообщает вам положение вала. Чем больше битов в энкодере, тем точнее можно измерить положение. Битовая комбинация «код Грея» позволяет считывать изменяющееся положение без ложного считывания из-за дребезга контакта/датчика.
Однако, если вы хотите однозначно определить 2038 отдельных шагов, вам понадобится 12-битный поворотный энкодер, который будет немного дороже и займет много контактов интерфейса.
Спасибо за ваше добавление. Я использовал Limit Switch и пока работал хорошо. Я попробую вашу идею для улучшения в другом проекте., @can
- Низкая скорость с шаговым двигателем
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Как заставить сервопривод вращаться на угол больше 180°
- Шаговый двигатель с концевыми выключателями
- Как повернуть серводвигатель на определенный угол?
- Запустить два степпера одновременно
- 6 + 1 двигательей подключенных к arduino uno?
- Управление цифровым сервоприводом JX PDI-6221MG с помощью Arduino
Спасибо за ответ, думаю, попробую концевой выключатель., @can