таймер и шаговый двигатель

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

Вечер добрый! Такая проблема- с помощью библиотеки AccelStepper.h управляем шаговым двигателем(крутим с определенной скоростью), одновременно с этим необходимо через 1 сек после начало вращения движка выдать на одном порту лог 1. Как это реализовать не могу понять, голова вскипела, возможно ли это вообще, ибо пока двигатель делает обороты, в loop-е ардуина больше ничего делать не может(я так понял).
Подскажите как написать что-то вроде внешнего таймер, чтобы независимо от loop-а работало.
Буду крайне благодарен за помощь. По идее даже если подскажите на С+, дальше переиначу, там ничего трудного не будет.
кусок кода приложил который крутит движку:

Код: Выделить всё

void goTo()
{ lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Press Select");
  
  if (key == 4) {
        isRun = 1 - isRun; 
        if (isRun == 1) {  
          lcd.clear();
          lcd.print("+++ Running +++ "); 
          stepper1.runSpeed();
                 
        } else { 
          lcd.print("    Stopped     ");  
        }
    
      }
}
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Самое простое - запустить таймер и следить за его переполнениями/сравнениями. Хоть в прерывании, хоть в основном цикле.
Реклама
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

не совсем понимаю его использование, видимо еще дошел... есть вот пример из статьи возился с ним, когда хотел хоть что то понять... но в моем случаем как реализовать тоже, когда функция stepper1.runSpeed() работает?

Код: Выделить всё

#include <mega8.h>
#asm
  .equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
 unsigned int num; // наша переменная  
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
  TCNT1H=0;
  TCNT1L=0;
  num++; // инкрементирруем
   
}
// Declare your global variables here
void main(void)
{
PORTB=0x00;
DDRB=0xFF;

PORTC=0x03;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

lcd_init(16);

// Global enable interrupts
#asm("sei")

while (1)
  { // Place your code here 
  if (num==30) //если 30 сек. "зажигаем" ПОРТ В.0 
  PORTB.0=1;
   
  if (num==100) // если num = 100 сек. зануляем num и тушим ПОРТ В.0
  {
    num=0;
    PORTB.0=0;
  }
  // выводим значение переменной на экран
  lcd_gotoxy(0,0);  
  lcd_putchar(num/10+0x30);
  lcd_putchar(num%10+0x30);

  };
}
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Если по первой ссылке по RunSpeed() не обманули, этот метод надо вызывать периодически. В Вашем случае, если прошло меньше 100 секунд (или сколько там?) - вызывать, если больше - не вызывать, да и счетчик тогда можно остановить.
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «AVR»