управление шаговым двигателем без delay

petras11
Offline
Зарегистрирован: 14.11.2012

Здравствуйте форумчане!

Проблема такова что надо соеденить две программы в одно целое.

Первоя программа ето считывания инфо. с энкодера.

Другая же врашчение шагового двигателя, в одну или другую сторану в зависимости от положеня энкодера.

Дело в том что программа для врашчение шагового двигателя написана с 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 )]);
}

Отредактировано админом. Пользуйтесь правильной вставкой кода.

leshak
Offline
Зарегистрирован: 29.09.2011

Первое: стоило прочитать  прикрепленную ветку в начале форума Вставка программного кода в тему/комментарий

Второе: http://www.open.com.au/mikem/arduino/AccelStepper/

petras11
Offline
Зарегистрирован: 14.11.2012

новичек, простимо :) я ангиисгог незнаю :(

leshak
Offline
Зарегистрирован: 29.09.2011

Ну значит пришла пора учить. В програмирование - без этого никак. Тем более что "знать как на экзамене" и не обязательно. берете словарик и начинаете читать/догадыватся. В технических текстах - слованый запас не такой уже и большой. От пары дней до недели - уже без словаря начинаешь читать. Может и "не все подряд", но смысл уже будешь улавливать.

На крайний случай - есть google translate (но я бы рекомендовал словарь, через транслейт иногда вообще фиг поймешь).

А это - ссылка на библиотеку, которая умеет степерами крутить без delay. Так что ставте lingvo  и вперед. Тем более что всего пару абзацев перевести нужно. И то "детальность не требуется". Достаточно "общий смысл уловить". При желании - не архисложная задача.

petras11
Offline
Зарегистрирован: 14.11.2012

ну, спосибо. Буду пробывать.

А там по ссылке, библиотека та которая мне нужна в присланом файле ест?

leshak
Offline
Зарегистрирован: 29.09.2011

Я понятия не имею про какой присланный файл вы говорите. Я вам ничего не присылал.

Вы спросили  "как крутить степпером без delay()".  Я вам подсказал что уже есть готовая библиотека AccelStepper которая умеет это делать. В отличие от стандартной библиотеки Stepper (которую вы почему-то не использовали). И даже дал ссылку на ее домашнюю страницу этой AccelStepper. Но можете и сами потренироватся погуглить по слову AccelStepper. Может и по русски какой-то рассказ про нее найдете.

Если же хотите сами, без библиотек с помощью digitalWrite крутить - то это разбиратся, учится. Начиная с со стандартного примера "Мигаем светодиодом без delay()" , который вы надйте в разделе Программирование из шапки сайта. И "рыться по форуму" в обсуждениях тоже можно найти десятки примеров как "избавлся от delay()".

И третитий вариант - брать какую нибудь библиотеку таймеров. И по таймеру свои digitalWrite делать.

 

 

petras11
Offline
Зарегистрирован: 14.11.2012

да нет я имел ввиду файлы которые есть в ссылкe.

дело в том что у нас двигатель несовсем шаговый, это новой  конструкции двигатель который еще не исследован и нужно будет менять последовательность импульсов, поэтому стандартная библиотека не годится.

пробовал я сделать без delay, но чтото не так было, поскольку не работало. 

leshak
Offline
Зарегистрирован: 29.09.2011

В примере кода который вы дали - никакой "экзотики" - нет. По очереди дергаются четере выхода. Что в этом нестандартного?

Во вторых. AccelStepper позволяет задать свою собственную функцию которые вызывается на каждый шаг (правда, к сожалению в нее не передается "номер фазы"). 

В третьих - можно взять библиотеку и "подточить ее под свои последовательности". Она же идет как "исходные коды".  Можете ее рассматиривать "как пример".