синхронизация 5 сек по переднему фронту 50 мс импульса или по заднему?
Синхронизация каждые 5 сек импульса 50мс по заднему фронту это синхронизация каждые 4.95 сек по переднему - сводится к первоначальной
мне нужно будет параллельно выдавать ещё одну череду импульсов, поэтому я не связывался с 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;
}
}
}
и оно работает, но получались паразитные импульсы, исправить которые не вышло
Обязательно попробую чуть позже, пока занят, спасибо за ответ!
я тебе дал рыбу, добавить еще канал аналогично и всё будет работать, но с библиотекой будет красивше
и чем твое мнение отличается от моего? сам ведь задаешь фронт и спад по отдельности:
значит я тебя не понял
Есть такая штука, как кратность. На каждом третьем мелком импульсе включать ногу большого импульса, на каждом 135-м - выключать.
можно и через счётчик, если кратность выдерживается
Этот еще не созрел