Работа с функцией

синхронизация 5 сек по переднему фронту 50 мс импульса или по заднему?

Синхронизация каждые 5 сек импульса 50мс по заднему фронту это синхронизация каждые 4.95 сек по переднему :slight_smile: - сводится к первоначальной

мне нужно будет параллельно выдавать ещё одну череду импульсов, поэтому я не связывался с delay. Сформулирую тогда общую задачу. Нужно подавать череду импульсов на лазер шириной условно 10х, одновременно с этим подать импульс на камеру шириной Х опять же повторяя его во времени

да, сам импульс проверял, то что нужно

и что мешает? перепиши без делея один импульс а далее по аналогии

наконец я понял смысл вашего вопроса.

Ответ - нет, то что вы хотите, сделать только внутри функции не получится. Если вам нужно ОДНОВРЕМЕННО с подачей одного импульса отслеживать другой - то всю задачу надо разбивать на элементарные стадии и после каждой стадии выходить в основной луп и делать другие задачи.

То есть применительно к подаче одного импульса - вы НЕ МОЖЕТЕ выполнить все это не выходя из функции ИМПУЛЬС - ничего не выйдет.
Надо так - включили пин в HIGH - вышли из своей процедуры в ЛУП, отсчитали время, когда наступил момент - снова вошли в процедуру и выключили пин…

А вообще читайте про конечные автоматы. Это именно то, что вы пытаетесь сделать, но идете неверным путем

Я хотел вторую череду импульсов задать в лупе, все как вы и говорите. Проблема встала с тем, что приходит на камеру. Поэтому я начал с этого. Нужна последовательность импульсов, которые приходят на камеру

почему нельзя обе пачки импульсов задать в ЛУПе?

Главное, что вам нужно понять - каждый импульс это не одно событие, а два - один передний фронт, другой задний. И задавать их надо по отдельности.

Приведите проверочный код.

int imp_l = 1000;
int imp_c = 50;
int delta = 30;
unsigned long t0 = 0;
unsigned long t = 0;
unsigned long t1 = 0;
bool state = 0;

void setup() {
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}
void impuls()
{ t=0;
  t = millis() - t0;
  if (t >= (imp_l + delta))
  {
    if (t <= imp_l + delta + imp_c)
    {
      state = HIGH;
      digitalWrite(7, state);
    }
    else
    {
      state = LOW;
      digitalWrite(7, state);
    }
  }
}
void loop() {
    impuls();
}

с чего бы это, скока людей стока мнений:

// ATMEL                                ATtiny 25/45/85
//                                           +-\/-+
//             !RESET PCINT5 5/A0 (D 5) PB5 1|    |8  Vcc
//  XTAL1 CLKI !OC1B  PCINT3 3/A3 (D 3) PB3 2|    |7  PB2 (D 2) 2/A1 PCINT2 USCK SCK T0   INT0 SCL
//  XTAL2 CLKO  OC1B  PCINT4 4/A2 {D 4) PB4 3|    |6  PB1 (D 1) pwm1 PCINT1 MISO DO  OC0B AIN1
//                                      GND 4|    |5  PB0 (D 0) pwm0 PCINT0 MOSI DI  OC0A AIN0 SDA AREF
//                                           +----+

#define PULSE_PIN 3

volatile uint32_t old_m1;
volatile uint32_t old_m2;
bool sets_pulse = false;
bool pulse_ison = false;

#define tau_pulse 5
#define tau_sihro 50

// функция формирования импульса
void pulseOut(uint8_t pin) {
  if (!sets_pulse && pulse_ison) {
    digitalWrite(pin, LOW);
    pulse_ison = false;
  }

  if (sets_pulse) {
    digitalWrite(pin, HIGH);
    pulse_ison = true;
    sets_pulse = false;
    old_m1 = millis();
  }
}


void setup() {
  pinMode(3, OUTPUT);
  old_m2 = millis();
}


void loop() {
  if (millis() - old_m1 >= tau_pulse) {
    old_m1 = millis();
    pulseOut(PULSE_PIN);
  }
  if (millis() - old_m2 >= tau_sihro) {
    old_m2 = millis();
    sets_pulse = true;
    pulseOut(PULSE_PIN);
  }
}

Я пробовал, но у меня не вышло)
Первую череду задать довольно просто

int imp_l = 1000;
int imp_c = 50;
int delta = 30;
uint32_t tmr1 = 0;
uint32_t tmr2 = 0;
uint32_t timer = 0;
unsigned long a = 500;
unsigned long b = 0;
bool state1 = 0;
bool state2 = 0;
bool flag = 0;

void setup() {
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}
void loop() {
  if (millis() - tmr1 >= imp_l)
  {
    state1 = !state1;
    tmr1 += imp_l;
    digitalWrite(6, state1);
  }

cо второй у меня была беда, пробовал что-то вроде:

   if ((millis() - tmr2 >= (imp_l + delta)))
  {
    if (millis() - tmr2 <= (imp_l + delta + imp_c))
    {
      state2 = HIGH;
      digitalWrite(7, state2);
      flag = 1;
    }
    else
    {
      digitalWrite(7, LOW);
      tmr2 = tmr2 + imp_l + delta;
      }
  }
}

и оно работает, но получались паразитные импульсы, исправить которые не вышло

У DetSimen есть готовая библиотека аж на 10 таймеров

Обязательно попробую чуть позже, пока занят, спасибо за ответ!

я тебе дал рыбу, добавить еще канал аналогично и всё будет работать, но с библиотекой будет красивше

и чем твое мнение отличается от моего? :slight_smile: сам ведь задаешь фронт и спад по отдельности:

значит я тебя не понял

1 лайк

Есть такая штука, как кратность. На каждом третьем мелком импульсе включать ногу большого импульса, на каждом 135-м - выключать.

можно и через счётчик, если кратность выдерживается

Этот еще не созрел