Код для управления биполярным шаговиком
- Войдите на сайт для отправки комментариев
Пнд, 19/02/2018 - 15:56
Здравствуйте, уважаемые ардуинщики! Опытные из вас, подскажите пожалуйста новичку что не так в коде
Схема в ссылке( источник внешнего питания не подключал, т.к. шаговик маломощный и вполне питается от ардуино), биполярный шаговик FL28STH45-0674B, Н-мост SN754410NE.
Проверял библиотечный скетч от Тома Иго, он работает, но хочется написать свой к этой схеме
в итоге от моего "кода" двигатель просто вибрирует как ненормальный и ничего не происходит
http://wikihandbk.com/wiki/Arduino:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%...
мой исходник
int A = 11;
int B = 10;
int C = 9;
int D = 8;
int i = HIGH;
void setup () {
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(A0, INPUT);
Serial.begin(9600);
}
void loop () {
i=analogRead(A0);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, HIGH);
Serial.println(i);
delay(10);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
Serial.println(i);
delay(10);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
Serial.println(i);
delay(10);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
Serial.println(i);
delay(10);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(9, HIGH);
digitalWrite(8, LOW);
Serial.println(i);
delay(10);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
digitalWrite(8, LOW);
Serial.println(i);
delay(10);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
digitalWrite(8, HIGH);
Serial.println(i);
delay(10);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, HIGH);
Serial.println(i);
delay(10);
}
что не так в коде
Он неправильно вставлен.
Евений, мне кажется он неправильно СОставлен) Вы можете подсказать чего не хватает и/или что и как в нем нужно исправить?
Могу.
До тех пор, пока Вы не вставите его как положено, его, с высокой вероятностью, просто никто не будет читать (я, например, не буду).
Это не "эстетика", а чистая прагматика. Вот как прикажете Ваш код обсуждать, если в нём нет номеров строк? Мне Вам писать, "а вот в строке № ХЗ лучше написать то-то"? Так что ли?
Вставляйте.
Так-то лучше.
А теперь прокомментируйте, что за пины 8-11 (какой куда подключён). И заодно вначале каждого блока напишите комментарий какой именно режим Вы включаете.
-------------
Но в любом случае, как бы они не были подключены, Вы что в этом коде делаете? Меняете режимы, так? Каждые 10 мс. Ну, отлично, 10 мс едем вперёд, 10 мс - назад, он и будет дрожать на месте, а чего Вы ждали?
Евений, вставил
http://wikihandbk.com/wiki/Arduino:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B/Stepper_Speed_Control
Но в любом случае, как бы они не были подключены, Вы что в этом коде делаете? Меняете режимы, так? Каждые 10 мс. Ну, отлично, 10 мс едем вперёд, 10 мс - назад, он и будет дрожать на месте, а чего Вы ждали?
Нет, он гонит ток по обмоткам по полушаговой схеме с паузами в 10мс между шагами.
Ну, вот пусть это прокомментирует.
Хочется добиться регулировки скорости вращения ротора, посредством вращения ручки потенциометра. Аппаратно схема собрана правильно, потому что на бибилиотечном скетче работает прекрасно, а вот на моем ничего хорошего
а примеры из библиотеки Stepper вам не подходят ?
Ну тут дело не в том что он подходит или нет. Работает то он прекрасно, но мне хочется увидеть и понять как работает не библиотечный скетч. Я вроде как продумал алгоритм, попытался реализовать его в коде, но не работает. Хотя при написании подобного кода, в интернете много где говорят о том что достаточно оперировать только digitalWrite и задержкой
если подключено правильно - значит ошибка в последовательности шагов. Если я правильно понимаю работу биполярника - на двух концах одной обмотки одновременно HIGH быть не может. У вас по обмоткам должна бежать "круговая волна" за которой будет следовать ротор - а у вас не так.
Покажите пожалуйста, как нужно распеределить состояния в каждом блоке! Попробовал сам, ничего не изменилось(
ну да. глянул в гугле - есть две схемы переключения полюсов -
а) бегущая единица - 1000 -0100 - 0010 - 0001 - 1000 ...
б) и инверсия - 0101 - 1010 - 0101 -
А откуда вы свою последовательность взяли - не ясно.
Мне показалось, что эта схема для униполярника.
что я не так делаю??
что я не так делаю??
Суете переменные куда попало, не понимая к чему это приводит.
digitalWrite(8, i);
есть маразм, т.к. вторым параметром digitalWriteможет быть только 0 или "не 0". И какой смысл пихать туда что-то от 0 до 1023, если всё, что не 0 срабатывает одинаково?
а попробуйте поработать портами типа PIND PINB и операцией сдвига :) и шаговик для этого не обязателен, поставьте 4 светодиода и сделайте бегущий огонек, пором бегущий НЕогонек. потом еще 4 светодиода на остаток порта и поупражняйтесь с двума бегущими огоньками по 4+4 (вдогонку и навстречу).
что я не так делаю??
если в этом коде выкинуть строчку 15 - мотор крутится?
использую сейчас эту версию ↑ . Крутится стабильно, нет этих бешенных вибраций. Не знаю как привязать к коду управление потенциометром скорости. Если подскажете, будет здорово =)
Определите при каких делаях Ваша скорость минимальна , максимальна наверно при теперешних.
читайте потенциометр аналогридом и пересчитывайте весь диапазон чтения с потенциометра мапом в требуемый диапазон делая перед каждым делаем. Получившееся подставляйте в делай. Потом вместо делаев можете поиграться с миллис.
использую сейчас эту версию ↑ . Крутится стабильно, нет этих бешенных вибраций. Не знаю как привязать к коду управление потенциометром скорости. Если подскажете, будет здорово =)
а второй и трети шаг не перепутан?
Скорость меняется изменением задержек между шагами.
а второй и трети шаг не перепутан?
заработало на удачу, или методом перебора
видимо обмотки так подключены.
Большое спасибо вам за совет! Сделал в итоге так. Но нет ПЛАВНОЙ регулировки скорости, при повороте ручки скорости обрывисто переходят от одной к другой. Всего их три, максимум четыре. Движок начал вибрировать, а светодиоды которые я поставил для индикации обмоток почти не горят. Подскажите пожалуйста, что я не так сделал на этот раз, в аналогриде и/или мапе? Я думаю плохо выбрал диапазон мапа, но тогда как его высчитать чтобы движок так не гудел, и была плавная регулировка скорости?
Плавной регулировки нет потому что двигатель шагает слишком широко, на полный шаг (Full-step pattern). Раз он у вас таки закрутился, то самое время прочитать про Half-step pattern - c ним шаг будет вдвое мельче, т.е. движение станет плавнее.
map можно высчитывать только один раз, после того, как считали показания с A0. И лучше заменить сразу цифровые обозначения пинов в digitalWrite на переменные A, B, C, D - так будет проще искать куда какая обмотка подсоединена.
Читайте перед каждым мапом, или мап оставьте один после чтения, самый первый, а остальные уберите.
а то мап каждый раз мапирует и вал превращается неизвестно во что. Кстати выведите мап в сериал и посмотрите для интереса : во что превращается первоначальное значение из аналогрида после четырех последовательных мапов :)
Если Вы в начале объявили переменные абсд , то их и прменяйте. Это делается для понятности , и чтобы если порты перепаяли менять номера в одном месте, а не по всему коду. Кстати! В Вашем случае их не надо объявлять как переменные. Достаточно дефайна.
#define A 8
#define B 9
и тд и тп компилятор сам будет подставлять по тексту вместо А - 8 .....
Большое спасибо всем, и особенно вам за помощь! Разобрался ;)