управление шаговым двигателем без delay
- Войдите на сайт для отправки комментариев
Здравствуйте форумчане!
Проблема такова что надо соеденить две программы в одно целое.
Первоя программа ето считывания инфо. с энкодера.
Другая же врашчение шагового двигателя, в одну или другую сторану в зависимости от положеня энкодера.
Дело в том что программа для врашчение шагового двигателя написана с delay, а вы же знаите что когда используется delay, микрокомпьютер ничего другого не может делать, здес и вся проблема. Надо исползыват таимер или чтото вроде. Если есть кто понимает, помогите пожалуиста.
Сама программа врашчение шагового двигателя с delay у меня не сложная, и мне хотелосбы заменит в ней тока delay. выглядит както так.
digitalWrite(led4, HIGH); delay(pause); digitalWrite(led4, LOW); digitalWrite(led2, HIGH); delay(pause); digitalWrite(led2, LOW); digitalWrite(led3, HIGH); delay(pause); digitalWrite(led3, LOW); digitalWrite(led1, HIGH); delay(pause); digitalWrite(led1, LOW); вот программа энкодера. /* Rotary encoder read example */ #define ENC_A 14 #define ENC_B 15 #define ENC_PORT PINC void setup() { /* Setup encoder pins as inputs */ pinMode(ENC_A, INPUT); digitalWrite(ENC_A, HIGH); pinMode(ENC_B, INPUT); digitalWrite(ENC_B, HIGH); Serial.begin (115200); Serial.println("Start"); } void loop() { static uint8_t counter = 0; int8_t tmpdata; /**/ tmpdata = read_encoder(); if( tmpdata ) { Serial.print("Counter value: "); Serial.println(counter, DEC); counter += tmpdata; } } /* returns change in encoder state (-1,0,1) */ int8_t read_encoder() { static int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0}; static uint8_t old_AB = 0; /**/ old_AB <<= 2; old_AB |= ( ENC_PORT & 0x03 ); return ( enc_states[( old_AB & 0x0f )]); }
Отредактировано админом. Пользуйтесь правильной вставкой кода.
Первое: стоило прочитать прикрепленную ветку в начале форума Вставка программного кода в тему/комментарий
Второе: http://www.open.com.au/mikem/arduino/AccelStepper/
новичек, простимо :) я ангиисгог незнаю :(
Ну значит пришла пора учить. В програмирование - без этого никак. Тем более что "знать как на экзамене" и не обязательно. берете словарик и начинаете читать/догадыватся. В технических текстах - слованый запас не такой уже и большой. От пары дней до недели - уже без словаря начинаешь читать. Может и "не все подряд", но смысл уже будешь улавливать.
На крайний случай - есть google translate (но я бы рекомендовал словарь, через транслейт иногда вообще фиг поймешь).
А это - ссылка на библиотеку, которая умеет степерами крутить без delay. Так что ставте lingvo и вперед. Тем более что всего пару абзацев перевести нужно. И то "детальность не требуется". Достаточно "общий смысл уловить". При желании - не архисложная задача.
ну, спосибо. Буду пробывать.
А там по ссылке, библиотека та которая мне нужна в присланом файле ест?
Я понятия не имею про какой присланный файл вы говорите. Я вам ничего не присылал.
Вы спросили "как крутить степпером без delay()". Я вам подсказал что уже есть готовая библиотека AccelStepper которая умеет это делать. В отличие от стандартной библиотеки Stepper (которую вы почему-то не использовали). И даже дал ссылку на ее домашнюю страницу этой AccelStepper. Но можете и сами потренироватся погуглить по слову AccelStepper. Может и по русски какой-то рассказ про нее найдете.
Если же хотите сами, без библиотек с помощью digitalWrite крутить - то это разбиратся, учится. Начиная с со стандартного примера "Мигаем светодиодом без delay()" , который вы надйте в разделе Программирование из шапки сайта. И "рыться по форуму" в обсуждениях тоже можно найти десятки примеров как "избавлся от delay()".
И третитий вариант - брать какую нибудь библиотеку таймеров. И по таймеру свои digitalWrite делать.
да нет я имел ввиду файлы которые есть в ссылкe.
дело в том что у нас двигатель несовсем шаговый, это новой конструкции двигатель который еще не исследован и нужно будет менять последовательность импульсов, поэтому стандартная библиотека не годится.
пробовал я сделать без delay, но чтото не так было, поскольку не работало.
В примере кода который вы дали - никакой "экзотики" - нет. По очереди дергаются четере выхода. Что в этом нестандартного?
Во вторых. AccelStepper позволяет задать свою собственную функцию которые вызывается на каждый шаг (правда, к сожалению в нее не передается "номер фазы").
В третьих - можно взять библиотеку и "подточить ее под свои последовательности". Она же идет как "исходные коды". Можете ее рассматиривать "как пример".