Помогите! Управление шаговым двигателем и использование millis()
- Войдите на сайт для отправки комментариев
Втр, 24/10/2017 - 12:00
Привет товарищи. Столкнулся со следующей проблеммой. Написал прогу для насоса жидкости на шаговом двигателе. Сначала написал все с использованием delay, так как небыло необходимости что то получать от контроллера во время выполнения. Работает по прерыванию.
Выставили колво жидкости, нажали кнопку и шаговик делает нужное количество шагов.
Все это прекрасно работает с использование delay для управления step dir, но с millis заставить работать не могу никак. Шаговик пищит и все. Ничего не понимаю. Помогите пожалуйста советами.
код с дилей
void stepp() //Функция одного шага вперед { digitalWrite(dir, Rotate); digitalWrite(stp, HIGH); delayMicroseconds(speedd); digitalWrite(stp, LOW); delayMicroseconds(speedd); }
код с милис
void stepp() //Функция одного шага вперед { if(mil - time >= speedd); { time = mil; } stpvalue=!stpvalue; digitalWrite(dir, Rotate); digitalWrite(stp, stpvalue); }
Код надо приводить поностью. Вот, чему у Вас равна переменна speedd в первом коде и чему во втором? Хрустального шара у меня нет.
Если они в обоих кода одинаковые, то ... Вас не смущает, что в первом коде задержка измеряется в микросекундах, а во втором в миллисекундах?
Принцип:
Код надо приводить поностью. Вот, чему у Вас равна переменна speedd в первом коде и чему во втором? Хрустального шара у меня нет.
Если они в обоих кода одинаковые, то ... Вас не смущает, что в первом коде задержка измеряется в микросекундах, а во втором в миллисекундах?
Спасибо, я никогда не использовал switch case и не сталкивался с этим, но выглядит отлично, должно работать.
Есть одно но, в коде сделаны плавное ускорение и торможение двигателем. Вопрос тут именно по функции milis. Почему она не заменяет delay?
Есть одно но, в коде сделаны плавное ускорение и торможение двигателем.
Рад за вас :)
Вопрос тут именно по функции milis. Почему она не заменяет delay?
Потому что это разные функции, с разным предназначением: одна возвращает время в миллисекундах, прошедшее после подачи питания на дуню, вторая - реализует задержку выполнения программы на нужное время.
Спасибо, буду разбираться с конструкцией switch case.
Спасибо, буду разбираться с конструкцией switch case.
При чём тут конструкция switch/case? Можно написать, и не используя её - важен алгоритм, а не конструкции языка.
Сделал все тоже самое, но с micros(). Да и ставил скорость постоянную при использовании millis. Все тоже самое. Никаких изменений. Дело видимо не в этом. Читал у Америкосов они сделали у них вроде работает.
Что не так происходит логически?
Функция Vipolnit выполняется по прерыванию, простой цикл n-шагов.
n-раз должна выполнится функция stepp? Проверяем, если время вышло выполняем. и так n-раз
А вот так все пучком.
Romanoff,
Вы не обижайтесь, но сейчас я буду сильно ругаться и обзываться! (впрочем, захотите обидеться - мне пофигу).
Вам, идиоту, уже писали
Код надо приводить полностью.
ну, и где??????????????????????????
Нет, выложить код нам в лом - мы лучше будем мозги засирать себе и людям, а после нескольких часов бесполезной писанины и потери времени, вдруг выясняется, что
Функция Vipolnit выполняется по прерыванию
Если бы Ваше ленивое величество соизволило бы выложить код полностью, как Вас просили, Вам бы ещё утром сказали бы, что не работает ни хрена millis в прерываниях от слова совсем. Она всегда возвращает одно и тоже значение! А delayMicroseconds - работает.
Понятно в чём проблема?
Теперь про решение. Вообще-то в прерывании такие вещи не делаются, но в качестве костыля попробуйте вставить
sei();
между строками 1 и 2.
И, да, пока не будет полного кода, я вообще больше не буду читать Ваши вопросы - это просто потеря времени, как было с прерыванием.
Мне не в лом. Просто мне стыдно там черт ногу сломит. Извините за то что туплю. Но был бы опытен, то не обращался бы за помощью.
ну, вот - попроси дурня молиться, он стеклянный хер разобъёт...
нет, что бы самостоятельно локализовать глючный код и выложить 10 строк, он запостил 500.
ну, вот - попроси дурня молиться, он стеклянный хер разобъёт...
нет, что бы самостоятельно локализовать глючный код и выложить 10 строк, он запостил 500.
Romanoff,
Вы не обижайтесь, но сейчас я буду сильно ругаться и обзываться! (впрочем, захотите обидеться - мне пофигу).
Вам, идиоту, уже писали
Код надо приводить полностью.
ну, и где??????????????????????????
Нет, выложить код нам в лом - мы лучше будем мозги засирать себе и людям, а после нескольких часов бесполезной писанины и потери времени, вдруг выясняется, что
Функция Vipolnit выполняется по прерыванию
Если бы Ваше ленивое величество соизволило бы выложить код полностью, как Вас просили, Вам бы ещё утром сказали бы, что не работает ни хрена millis в прерываниях от слова совсем. Она всегда возвращает одно и тоже значение! А delayMicroseconds - работает.
Понятно в чём проблема?
Теперь про решение. Вообще-то в прерывании такие вещи не делаются, но в качестве костыля попробуйте вставить
sei();
между строками 1 и 2.
И, да, пока не будет полного кода, я вообще больше не буду читать Ваши вопросы - это просто потеря времени, как было с прерыванием.
я так делал, мне сказали код целиком. Читайте тему целиком, а потом пожалуйста обзывайтесь. Вы что все такие нервные?
если я тебе скажу убиться нахер - ты хоть тогда начнёшь думать, зачем я тебе это сказал?
я так делал, мне сказали код целиком. Читайте тему целиком, а потом пожалуйста обзывайтесь. Вы что все такие нервные?
если я тебе скажу убиться нахер - ты хоть тогда начнёшь думать, зачем я тебе это сказал?
Что тебе нужно? отвали
ну, вот и поговорили - зачем было нужно постить 500 строк кода задним числом, когда уже выяснили, почему так, а не иначе?
*когда голова начнёт думать прежде, чем руки делать?
Я Вам советовал поставить sei(); - помогло?
Для delay() используется одна функция. При millis() надо две функции 1- запускающая , 2 -размещеная в цикле loop(). Прерывание тоже , но 2 это фунция висит не в loop(), а в фунции прерывания. Это и есть тупизна новичков при переходе на millis(). Они буквально этот нюанс не догоняют.
Для delay() используется одна функция. При millis() надо две функции 1- запускающая , 2 -размещеная в цикле loop(). Прерывание тоже , но 2 это фунция висит не в loop(), а в фунции прерывания. Это и есть тупизна новичков при переходе на millis(). Они буквально этот нюанс не догоняют.
походу тут собрание сошедших с ума до и после изучения С++ - вторые учат первых программировать. О_О
Я Вам советовал поставить sei(); - помогло?
Попробовал. Ничего не изменилось..
походу тут собрание сошедших с ума до и после изучения С++ - вторые учат первых программировать. О_О
Может просто подскажешь, если знаешь как это сделать? Я пока не понял ничего из всех советов.
Попробовал. Ничего не изменилось..
А чего вчера не сказали? У меня было время вечером посмотреть что там с кодом.
По поводу того, что Вы ничего не поняли, для начала почитайте http://arduino.ru/Reference/AttachInterrupt и забудьте об идее использовать millis внутри прерывания. И подумайте как делать.
А код Ваш я посмотрю сегодня попозже.
Хорошо. Спасибо. Про прерывани я читал) Я не совсем нуб. Код же я как то написал. Там пишут дилей не работает, но он то работает) а милис да, видимо не подойдет для меня. Надо делать милис не через прерывания, а по цифровому порту и не париться.
Там пишут дилей не работает, но он то работает)
Не работает. У Вас работает не delay, а delayMicroseconds - это две большине разницы.
милис да, видимо не подойдет для меня.
Почему не подойдёт? Надо просто правильно сделать. Меня вот удивило, что Вам костыль не помог, значит ошибка в чём-то ещё. Сегодня я найду время посмотреть код.
А какая разница? Цепляете на любые цифровые пины и прописываете их номера в программе. Только не перепутайте ничего.
Так прошу прощения, костыль помог пару раз из 20 попыток выполнить функцию, потом контроллер замер. Если я не буду использовать прерывания, а сделаю выполнение функции при условии лог.единицы на цифровом порту, то это может помочь ситуации? Или разницы не будет?
Знаете, я краем глаза посмотрел на код.... Пока Вы серьёзно за него не возьмётесь, не поможет ничего. У Вас проблема не в прерывании, а либо в крайней невнимательности, либо в полном незнании языка.
Я не совсем нуб.
Это заметно.
Сделал не через attach, разницы никакой нет. пищит.
Знчит, последнее китайское предупреждение (для особо понятливых)
Код нужен полностью! Делайте его сворачиваемым, но публикуйте полнстоью.
Сделал не через attach
Что сделал? Как сделал? ХЗ! Не через какой attach, когда было прямо сказано - оставьте с прерываниями, только исправьте ошибки добавьте sei()? ХЗ!
Господи хватит обвинений)) Что с вами? У вас на форуме какая то мания принизить достоинство другого человека, в чем то обвинить, сказать что ничего ты не знаешь ты тупой и прочее. Ну да ладно.
Я к коду вернулся спустя год. Второпях напутал, нет, даже возможно даже тупанул, ведь год вообще не кодил. Действительно if напутал, когда переделывал с delay на micros.
603 вы правы я это давно уже написал. Естественно там сравнение, что самое странное что это условие работало, даже с присвоением, но исправил, спасибо.
Удалил точки с запятой - не работает. Вставил костыль - не работает.
Цикл Nalit выполняется но в функци step не работают micros. Т.е. одно действие выполняется сразу после другого без задержки.
Ну, как знаете. Дело Ваше.