как сделать? Ш Д по таймеру

sergei 22
Offline
Зарегистрирован: 22.10.2020

Ребята тут стала такая необходимость сделать устроиство , чтоб ШД работал по таймеру и задавлись обороты кнопками , я не прогер от слова вообще только начал в виду необходимости вникать, но то что ШД и таймер используют для работы (TIMER 0) меня ввело в полный ступор помогните :) пожалуйста

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sergei 22 пишет:

тут стала такая необходимость сделать устроиство

закажи за деньги, коли сам ни в зуп ногой. 

sergei 22
Offline
Зарегистрирован: 22.10.2020

вот вот , в них та курвах и вся проблемма, точнее в их отсутствии

rkit
Offline
Зарегистрирован: 23.11.2016

А сколько планируешь заработать на этом проекте?

sergei 22
Offline
Зарегистрирован: 22.10.2020

это мой личный проект в смысле для себя(не комерческий)  он очень длинный  а эта часть конкретный затык в остальном идут к нопки , реле по времени  но с этим думаю разберусь както через пень колоду, но думаю осилю

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sergei 22 пишет:

вот вот , в них та курвах и вся проблемма, точнее в их отсутствии

Т.е. отсутствуют и знания, и деньги? Нет ни того, ни другого? Правильно?

rkit
Offline
Зарегистрирован: 23.11.2016

Ну тут явно проблема в трате времени на ерунду, когда нужно работать.

sergei 22
Offline
Зарегистрирован: 22.10.2020

ну как то так, но есть желание, и по тихоньку пытаюсь вникать в тему, я понимаю все что можно потрогать руками, гайки сварку и т.д , что не могу потрогать (программа) для меня это тяжело в понимании

sergei 22
Offline
Зарегистрирован: 22.10.2020

можно пожалуйста точное определение слову работать?

b707
Offline
Зарегистрирован: 26.05.2017

Опять веселие намечается, что ли?

sergei 22
Offline
Зарегистрирован: 22.10.2020

а как без этого , обгадить кого нибудь , поплевать, надо ж на ком то свое самолюбие потешить

b707
Offline
Зарегистрирован: 26.05.2017

sergei 22 пишет:

а как без этого , обгадить кого нибудь , поплевать, надо ж на ком то свое самолюбие потешить

это мы тебе завсегда пожалуйста...

А вот код писать тебе придется самому...

sergei 22
Offline
Зарегистрирован: 22.10.2020

 а никто и не говорит что напишите за меня ,тут вопрос как ? в смысле (используется один и тот же таймер для обеих вещей , или я чтото не допонимаю?

b707
Offline
Зарегистрирован: 26.05.2017

sergei 22 пишет:

используется один и тот же таймер для обеих вещей , или я чтото не допонимаю?

каких "обеих" ?

sergei 22
Offline
Зарегистрирован: 22.10.2020

шаговик как я понял для работы использует (TIMER 0) и реле времени(таймер) использует (TIMER0) или их можно как то перераспределить на разные таймера?

b707
Offline
Зарегистрирован: 26.05.2017

sergei 22 пишет:

шаговик как я понял для работы использует (TIMER 0)

вы как что-то пишете - сразу указывайте, откуда вы это взяли - быстрее будет

Шаговиком можно управлять с любого таймера, не обязательно нулевого... можно и вообще без таймера.

sergei 22
Offline
Зарегистрирован: 22.10.2020

просто во всех примерах которые я встречал используется таймер исполль зоваться будет STEP DIR сигналы

b707
Offline
Зарегистрирован: 26.05.2017

sergei 22 пишет:

просто во всех примерах которые я встречал используется таймер исполль зоваться будет STEP DIR сигналы

и везде - таймер0 ? - не верю

 

sergei 22
Offline
Зарегистрирован: 22.10.2020

а регулировка оборотов осуществляется за счет импульсов (прерываний таймера ) я правильно понимаю?

sergei 22
Offline
Зарегистрирован: 22.10.2020

но судя по настройкам CLSK 0 'это настройки таймера 0 ? надеюсь правильно написал абривиатуру

b707
Offline
Зарегистрирован: 26.05.2017

sergei 22 пишет:

а регулировка оборотов осуществляется за счет импульсов (прерываний таймера ) я правильно понимаю?

откуда я знаю, как она у вас осуществляется? Я уже написал. что вариантов не один и не два.

неужели трудно набрать в гугле что-нить типа "ардуино и шаговый мотор" ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Без дополнительных приказов таймер0 не управляет никаким ШД. Он даже не знает, что это такое.

sergei 22
Offline
Зарегистрирован: 22.10.2020

так набирал правда в тындыксе думаю разница не существенна

b707
Offline
Зарегистрирован: 26.05.2017

так и я о чем :))))

"столбы повреждают автомобили только в порядке самообороны" (с)

b707
Offline
Зарегистрирован: 26.05.2017

sergei 22 пишет:

так набирал правда в тындыксе думаю разница не существенна

ну как сказать... любителей ардуино в мире раз в 100 больше, чем в РФ. Соответственно и результатов в гугле и яндексе

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

sergei 22 пишет:

так набирал правда в тындыксе думаю разница не существенна

ну как сказать... любителей ардуино в мире раз в 100 больше, чем в РФ. Соответственно и результатов в гугле и яндексе

чего так занижать то, больше, значительно больше

sergei 22
Offline
Зарегистрирован: 22.10.2020

ну так тактовая частота , Т.Есть задающая для определения скорости оборотов использует таймер? 

sergei 22
Offline
Зарегистрирован: 22.10.2020

попробую с этой стороны зайти , мож найду ответ что и от чего 

sadman41
Offline
Зарегистрирован: 19.10.2016

Если напишете в коде, то будет использовать. А так - этим железкам до фени работа. Абсолютли.

rkit
Offline
Зарегистрирован: 23.11.2016

А вот еще проблема: полез в таймеры, когда даже самых основ программирования не умеешь.  Опять неправильная расстановка приоритетов.

sergei 22
Offline
Зарегистрирован: 22.10.2020

на сегодняшний день спасибо всем! но вопросов будет еще куча

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

Опять веселие намечается, что ли?

Готовимся к завтрашней пятнице :-)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sergei 22 пишет:

вопросов будет еще куча

Приятно слышать.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Оттачиваем сарказм на зафтра.

Logik
Offline
Зарегистрирован: 05.08.2014

sergei 22 пишет:

Ребята тут стала такая необходимость сделать устроиство , чтоб ШД работал по таймеру и задавлись обороты кнопками , я не прогер от слова вообще только начал в виду необходимости вникать, но то что ШД и таймер используют для работы (TIMER 0) меня ввело в полный ступор помогните :) пожалуйста

Та бери дорогой, не стесняйся. ШД, как просил, только обороты я енкодером меняю. Извини  шо не кнопками, так получилось...

#include "Encoder.h"


#define DRV_DIR_PIN 12
#define DRV_STEP_PIN   9
#define DRV_ENABLE_PIN 10

#define DRV_BUTTON_PIN   7

#define ENCODER_PIN2      11
#define ENCODER_PIN1      8


#define LED_PIN A3
#define LED_PIN_NUM   ARDUINO_PIN_NUM(LED_PIN)
#define LED_PORT      ARDUINO_PORT(LED_PIN)

#define ENCODER_INPUT_PORT     ARDUINO_PIN(ENCODER_PIN1)
#define ENCODER_INPUT_PIN1      ARDUINO_PIN_NUM(ENCODER_PIN1)
#define ENCODER_INPUT_PIN2      ARDUINO_PIN_NUM(ENCODER_PIN2)

ENCODER2<ENCODER_INPUT_PIN1, ENCODER_INPUT_PIN2> enc(0);

#define DRV_DIR_HIGH    digitalWrite(DRV_DIR_PIN, HIGH);
#define DRV_DIR_LOW     digitalWrite(DRV_DIR_PIN, LOW);

union  COLOR
{
struct  {
 byte GREEN;     
 byte RED;   
 byte BLUE;   
};
byte Color24[3];
};

#define RGB(r,g,b)  {(g),(r),(b)}

extern "C" {
void OutFrame(COLOR* buf, word len)
{
asm volatile (
     "push r24 \n\t"
     "push r25 \n\t"
     "push r26 \n\t"
     "push r27 \n\t"
     "push r28 \n\t"
     "push r29 \n\t"

     "movw r28, %[ptr]  \n\t" //загрузка Y
     "movw r26, %[L]  \n\t"
     
     "add  r26,r28 \n\t"
     "adc  r27,r29 \n\t"
     "cli \n\t"
 //  вывод первого бита 
"aa:           ld   r24, Y+  \n\t" //инициализация отправки первого байта
              "ldi r25, 8 \n\t"

 
"bb:           sbi  %[PP], %[pin] \n\t"       //1 цикл линию в высокий уровень
        "nop \n\t"     
        "nop \n\t"     
                 "sbrs  r24, 7 \n\t"       //проверка бита и скачек на +2
                 "cbi %[PP], %[pin] \n\t"       //0,375us линию в низкий уровень
                 "lsl r24 \n\t"         //1 цикл сдвиг в лево
        "nop \n\t"     
        "nop \n\t"     
                 "cbi %[PP], %[pin] \n\t"       //1 цикл 0,5us линию в низкий уровень
        "nop \n\t"     
        "nop \n\t"     
                  "dec r25  \n\t"         //1 цикл
                 "brne bb  \n\t"      // 1 цикл без перехода и 2 с переходом
                 
//байт выведен проверяем завершение и переходим к следующему

                 "cpse r28, r26 \n\t"    //1 цикл  проверка Y на конец массива 
                 "rjmp aa \n\t"      //2 цикла
                 "cpse r29, r27 \n\t"    //1 цикл  проверка Y на конец массива 
                 "rjmp aa \n\t"      //2 цикла
     "sei \n\t"
     "pop r29 \n\t"
     "pop r28 \n\t"
     "pop r27 \n\t"
     "pop r26 \n\t"
     "pop r25 \n\t"
     "pop r24 \n\t"

                 : 
                 :[ptr] "r" (buf) ,
                  [L] "r" (len), 
                  [PP] "I" (_SFR_IO_ADDR(LED_PORT)),
                  [pin] "I" (LED_PIN_NUM)
     );

   }
}

ISR(PCINT0_vect)
{
    enc.Interrupt();
}

#define ENC_MAX_VAL 117
uint16_t GetDurationPulse(uint8_t N)
{
  return 200+5*N+((uint16_t)(N*N)>>4);
}

volatile uint16_t SpeedICR;
volatile uint16_t pulse_cnt;

volatile uint8_t SteperFl;
volatile uint8_t fl;
volatile uint8_t start_cnt;


void SetTimer(uint16_t t)
{
 cli();
 for(;TCNT1>t-3;)
 {
  sei();
  cli();
  }

 SpeedICR=t-1;

 if((SpeedICR>ICR1) || (SpeedICR>700)) //тормозим или медленно
 {
   ICR1 =SpeedICR;
//   OCR1B=ICR1;
   fl|=4;
 }
 else
 {
   fl|=4;
 }
 sei();
}
void Rotation(bool f)
{
  if(f)
  {
   if(!(fl&8)) return; //уже вращаемся
  cli();
   if(SpeedICR<700)  //нужен разгон
   {
     ICR1=700; //стартуем на такой скорости
   }
   fl&=~8;  //флаг останова сняли
  }
  else
   fl|=8;
  fl|=4;   //флаг актуализации взвели
 sei();
}

//выполнить заданное количество шагов с заданой скоростью, если требуется то и с разгоном
void SetCountPulse(uint16_t p, uint16_t v)
{
  pulse_cnt = p;
  SetTimer(v);
  Rotation(true);
}


ISR(TIMER1_COMPA_vect)
{
static uint16_t c;

 c++;
 if(c==400)
 {
  c=0;
  SteperFl=1;
 }

 if(pulse_cnt)
 {
  pulse_cnt--;
  if(!pulse_cnt) //нужное число шагов выполнено, остановка
  {
    fl|=4|8;
  }
 }
 
 if(fl & 4)  //обработать флаги
 {
   fl &= ~4;  //выполняем однократно
   if(fl & 8)  //останов
   {
    OCR1B=0; //нет тока
    start_cnt=0;
   }
   else  //пуск
   {
     start_cnt=5;  //кол-во тактов для разгона
     OCR1B=ICR1;  //есть ток разгона 
   }


   if(fl & 1)  //смена направления
   {
    DRV_DIR_HIGH;      
   }
   else
   {
    DRV_DIR_LOW;
   }

 }

 
 if(start_cnt)
 {
   start_cnt--;
   if(!start_cnt)
   {
    if(ICR1>SpeedICR)
    {
      uint16_t i;
      if(ICR1-SpeedICR>20)
      i=10;  //ограничение ускорения
       else
       i=1;
      ICR1-=i;
      OCR1B=ICR1;
      start_cnt =2;
    }
    else
     OCR1B=ICR1;
   }
 }
 
}


void setup() {
  // put your setup code here, to run once:

 pinMode(DRV_DIR_PIN, OUTPUT);
 pinMode(DRV_STEP_PIN, OUTPUT);
 pinMode(DRV_ENABLE_PIN, OUTPUT);

 pinMode(LED_PIN, OUTPUT); 
 COLOR c;
 c=RGB(0xff, 0, 0);

 OutFrame(&c,3);
 
 pinMode(ENCODER_PIN1, INPUT_PULLUP);
 pinMode(ENCODER_PIN2, INPUT_PULLUP);
 pinMode(DRV_BUTTON_PIN, INPUT_PULLUP);

 enc.SetMaxValue(ENC_MAX_VAL);
 enc.Run();



//Режим 10 Phase Correct

  TCCR1A=1<<COM1A0 | 1<<COM1A1  | 1<<COM1B0 | 1<<COM1B1  | 1<<WGM11; //подключить выход OC1A первого таймера WGM11=1 WGM10=0 WGM13=1 WGM12=0
  uint32_t ocr;

  TCCR1B=3|(1<<WGM13); // 64 4usec
 ICR1=GetDurationPulse(1);
 
 OCR1A=5;
 OCR1B=200;
 
 TIMSK1 |= (1 << OCIE1A);

  Rotation(false); //стоп

 Serial.begin(9600);
 Serial.println("StepPump"); 
}

#define BTN_TIME_CLICK 4  //4*80=60msec
#define BTN_TIME_LONG  40 //40*20=800msec
#define BTN_TIME_PAUSE 10 //10*20=200msec
enum BTN
{
  PRESS,      //удерживается нажатой короткое время, 1 раз на нажатие
  LONG_PRESS, //удерживается нажатой длинное время, 1 раз на нажатие
  CLICK,      //отпущена после нажатия в течении времени больше короткого но меньше длинного, 1 раз на нажатие
  DONE,       //нажата, 1 раз на нажатие
  UP,         //отпущена но не CLICK и не DBLCLICK, 1 раз на нажатие
  PRESSED,    //удерживается нажатой, но не PRESS, не LONG_PRESS и не DBLPRESS, ***** многократно
  TOP,        //не нажата, ***** многократно
  DBLPRESS,   //повторно нажата и удерживается нажатой короткое время, 1 раз на нажатие
  DBLCLICK,   //повторный CLICK, ранее был CLICK с паузой менее заданой, 1 раз на нажатие
  ONE_CLICK   //отпущена и истекла пауза для повторного нажатия, 1 раз на нажатие
  
};


uint8_t GetBtnCmdLow(uint8_t scan = false)
{
 static uint8_t b_old;
 uint8_t b;

 if(scan)
 {
  b=bit_is_set(ARDUINO_PIN(DRV_BUTTON_PIN), ARDUINO_PIN_NUM(DRV_BUTTON_PIN));  // digitalRead(DRV_BUTTON_PIN);

  if(b_old!=b)
  {
    b_old=b;
    return b?BTN::UP:BTN::DONE;
  }
 }
 return b_old?BTN::TOP:BTN::PRESSED;
}

uint8_t GetBtnCmd()
{
 static uint8_t t;
 static uint8_t btn_press;
 static uint8_t FlDBL;
 uint8_t i;
 uint8_t r;

 t++;
 i=t-btn_press;
 r=GetBtnCmdLow(true);
 switch(r)
 {
  case BTN::UP:                                                        //отпускание
      if((i<BTN_TIME_LONG) && (i>=BTN_TIME_CLICK))
      {
        btn_press=t;
        r=FlDBL?BTN::DBLCLICK:BTN::CLICK;
        FlDBL=!FlDBL;
      }
      break;
  case BTN::DONE:   btn_press=t;      break;                          //обнаружено нажатие
  case BTN::TOP:                                                      // не нажата
      if(i>BTN_TIME_PAUSE)
      {
        if(FlDBL) 
          r=BTN::ONE_CLICK;
        FlDBL=false;
      }
      break;          
  case BTN::PRESSED:                                                  //удерживается нажата
      if(i==BTN_TIME_CLICK) return FlDBL?BTN::DBLPRESS:BTN::PRESS;
      if(i==BTN_TIME_LONG) return BTN::LONG_PRESS;
      break;
  
 }
 return r ;

}



void loop() {
 uint8_t n;
 static uint8_t n_old;
 uint16_t p;
 static uint8_t takt;
 static uint8_t mode;
 
 uint8_t t=millis();

 n=enc.Get();
 if(n!=n_old)
 {
  n_old=n;

  if(GetBtnCmdLow()==BTN::PRESSED) //вращение при нажатой
  {
    if(mode==0)
    {
     mode=1;
     Rotation(false);  //стоп
     enc.SetMaxValue(14);
     enc.SetValue(7);
     n=8;
    }
  }
  else
  {
   p=GetDurationPulse(ENC_MAX_VAL+1-n);
//  Serial.println(p);
   SetTimer(p);
  }
 }

 if(uint8_t(t-takt)>=20)
 {
   takt+=20;
   COLOR c;

   if(mode==1)
   {
    
    long int L;
    if(n>7) n=n-8; //0-6
    L=0;
    if(!(n&1)) L|=0xff;
    if(!(n&2)) L|=0xff00;
    if(!(n&4)) L|=0xff0000;
  
    OutFrame((COLOR*)&L,3);
    
    if(GetBtnCmd()==BTN::TOP /*UP 18.04.2020*/)
    {
      mode=0;
      enc.SetMaxValue(ENC_MAX_VAL);
      enc.SetValue(0);
      n_old=0;
      if(n!=7)
      {
        SetTimer(200+n*150);
      }
      fl&=~2; 
      
    }
     return;
   }
   
   if(SteperFl)
   {
    c = RGB(0,ENC_MAX_VAL+1-n,fl & 2?0:n);
    SteperFl=0; 
   }
   else
    c =  RGB(fl & 1?0x10:0, 0, fl & 2?0:0x10);
    
   OutFrame(&c,3);

   n=GetBtnCmd();
   switch (n)
   {
    case BTN::DONE:
            Rotation(false);  //стоп
        break;

    case BTN::LONG_PRESS:
            fl^=1;//реверс
            fl&=~2; 
            fl|=4;
        break;

    case BTN::ONE_CLICK:
            fl^=2; //старт-стоп
            Rotation(fl&2);
        break;
  case BTN::DBLCLICK:
            SetCountPulse(1000, 700);
        break;
   }
 }

 if(Serial.available())
 {
  if(Serial.read()==' ')
   SetCountPulse(200, 700);
 }
 
 
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

в 280 строке константа не та, подсовываешь непроверенный код )))

sergei 22
Offline
Зарегистрирован: 22.10.2020

не проверенный так проверим :) ну хотя бы по коду попробую разобраться что на что влияет , 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sergei 22 пишет:

не проверенный так проверим :) ну хотя бы по коду попробую разобраться что на что влияет , 

то-есть, даже с арифметикой не в ладах

sergei 22
Offline
Зарегистрирован: 22.10.2020

так я его еще не читал, дома буду читать, ща на работе ,дома интернета нет, а с арифметикой порядок  :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sergei 22 пишет:

так я его еще не читал, дома буду читать, ща на работе ,дома интернета нет, а с арифметикой порядок  :)

это наврядли, глянь, строка 280 не смутила?

sergei 22
Offline
Зарегистрирован: 22.10.2020

смутить то смутила но еще не разобрался в чем непорядок, в самой сумме или в множителе а как следствие сумме , Т,Е либо 320 либо нолик потеряли и должно быть 3200 думаю электронный макет даст определенность этого вопроса , а в остальном нужно будет дома внимательно просмотреть , мож еще где то бяка сидит

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а говорил с арифметикой у тебя зашибись ))) _
#define BTN_TIME_CLICK 4  //4*80=60msec

sergei 22
Offline
Зарегистрирован: 22.10.2020

4х80=320 и что не правильно посчитал?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sergei 22 пишет:

4х80=320 и что не правильно посчитал?

а там что написано?

sergei 22
Offline
Зарегистрирован: 22.10.2020

ну так сразу же я и написал что с суммой не порядок

Logik
Offline
Зарегистрирован: 05.08.2014

ua6em пишет:

в 280 строке константа не та, подсовываешь непроверенный код )))

Код рабочий. Прям с насоса.  Мои коменты - шо хочу, то пишу. Можешь себе в коментах написать что ты думаеш о моих коментах)))

ПС. это же надо как пристально изучал, аж в 280-й строке в коментах опиську найти )))) При том  отсутствие либки на энкодер никого не смутило ;)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Logik пишет:

ua6em пишет:

в 280 строке константа не та, подсовываешь непроверенный код )))

Код рабочий. Прям с насоса.  Мои коменты - шо хочу, то пишу. Можешь себе в коментах написать что ты думаеш о моих коментах)))

ПС. это же надо как пристально изучал, аж в 280-й строке в коментах опиську найти )))) При том  отсутствие либки на энкодер никого не смутило ;)

Логик, это особенности психики, код ваабще не изучал, мельком глянул, максимум одну секунду и, нисколько не сомневаюсь, что он рабочий...ТС... просто потролю маленько, это жеж он говорит, что с математикой хорошо...если число 60 правильное, то должно было быть 3, а не 4, а если с четвёркой работает. значит там должно быть 80 )))

PS это просто визуальная память на цифры, я жеж говорю, в юности матрицу булевых уравнений >20 на >20 решал в уме секунд за 20-30...

Logik
Offline
Зарегистрирован: 05.08.2014

Та ладно, оправдываться! Я денег не беру за изучение ;) 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Logik пишет:

Та ладно, оправдываться! Я денег не беру за изучение ;) 

да не, я более 100 строк не одолеваю ...
PS написал тут на досуге аж на 900 строк, теперь поправить...по вновь открывшимся обстоятельствам ...надо кого-то просить, не удерживаю в голове, что от чего и как зависит )))