Несимметричный генератор сигнала

nobel
Offline
Зарегистрирован: 01.09.2022

Доброго времени суток. помогите пожалуйста оптимизировать кусок кода. Нужно получить не симметричный мультивибратор с возможностью задавать длительность импульса и паузы. но убрав из кода delay(). Поиск по просторам интернета успехов не дали.

int pulse = 3;              // тут значение  будет меняться от 3 до 50
int pause = 160;        // тут значение будет меняться от 160 до 50

void setup() {
  pinMode(12,OUTPUT);
}

void loop() {
  digitalWrite(12,HIGH);
  delay(pulse);
  digitalWrite(12,LOW);
  delay(pause);

}

 

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

посмотрите пример "Blink without delay" из комплекта Ардуино ИДЕ - он как раз об этом.

nobel
Offline
Зарегистрирован: 01.09.2022

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

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Это почему это?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

nobel пишет:
Этот пример я знаю и работать с ним могу. Но там время импульса и время паузы будет всегда совпадать, не зависимо от того, какое значение выставить.

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

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

Kakmyc пишет:
nobel пишет:
Этот пример я знаю и работать с ним могу. Но там время импульса и время паузы будет всегда совпадать, не зависимо от того, какое значение выставить.
А менять после каждого переключения не пробовал ? Голова тебе зачем, что бы в нее кушать ?

голова, чтобы ею вертеть, а для кушать есть уста...

PS Если покопаться тут на форуме целая ветка примеров несимметричного мигания светодиодом была и, даже я там отметился, реализация вплоть до таймеров

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

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

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Alexey_Rem пишет:

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

Ну как бы смысла нет делать на таймерах такое, учитывая требуемую точность.

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

nobel пишет:
Этот пример я знаю и работать с ним могу. Но там время импульса и время паузы будет всегда совпадать, не зависимо от того, какое значение выставить.

судя по ответу - пример не знаешь и работать не могешь

Green
Offline
Зарегистрирован: 01.10.2015

Kakmyc пишет:
Голова тебе зачем, что бы в нее кушать ?

"Мне говорят обидные слова. Зачем тебе, мол, Коля голова?
Держать удар. Отвечу я вам всем. И между прочим, головой я ем."

NikShel
Offline
Зарегистрирован: 21.01.2018

Вот хороший вариант разных мигалок:
https://arduino.ru/forum/programmirovanie/upravlenie-neskolkimi-protsess...

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

А это разве не обычный ШИМ ???

nobel
Offline
Зарегистрирован: 01.09.2022

Спасибо тебе добрый человек "NikShel". Решение наедено. если честно замучился я жир с монитора вытирать, выделяемый некоторыми ... с не измеримым ЧСВ. 

uint32_t tmr;
bool flag;
int16_t pulse 3; 
int16_t pause 160;

void setup() {
  pinMode(12, OUTPUT);
}
void loop() {
  if (millis() - tmr >= (flag ? pulse : pause)) {
    tmr = millis();
    flag = !flag;
    digitalWrite(12, flag);
  }
}

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

nobel пишет:

Спасибо тебе добрый человек "NikShel". Решение наедено. если честно замучился я жир с монитора вытирать, выделяемый некоторыми ... с не измеримым ЧСВ. 

uint32_t tmr;
bool flag;
int16_t pulse 3; 
int16_t pause 160;

void setup() {
  pinMode(12, OUTPUT);
}
void loop() {
  if (millis() - tmr >= (flag ? pulse : pause)) {
    tmr = millis();
    flag = !flag;
    digitalWrite(12, flag);
  }
}

 

А не сдаётся ли тебе , что в итоге сделано именно так как я и сказал в #4 ?
Просто кто то слишком туп и ему нужен код а не понимание.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

В таком виде скетчи можно сказать ни чем не отличаются !!!

Вот если внутри будет выполняться полезная работа, то тогда смыл есть. Главное что бы длительность этой работы не превысила один из периодов ...

Для ПРАВИЛЬНОГО решения подобных задач в микроконтроллере есть таймеры и прерывания !

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

Komandir пишет:

В таком виде скетчи можно сказать ни чем не отличаются !!!

Вот если внутри будет выполняться полезная работа, то тогда смыл есть. Главное что бы длительность этой работы не превысила один из периодов ...

Для ПРАВИЛЬНОГО решения подобных задач в микроконтроллере есть таймеры и прерывания !

да и на миллисах (микросах) эта задача решена неверно, как удержать частоту при изменении скважности, правильно! нужен ГЛАВНЫЙ коэффициент частоты, а из него формировать нужные скважности:
 

tau = 20
is_off =1
is_on = tau-is_off

Или частота должна скакать?

 

 

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

Период нужен, от него и скакать с заполнением

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Самый цимес в названии темы: сигнал может быть каким угодно, главное, чтобы генератор был "не симметричным".

nobel
Offline
Зарегистрирован: 01.09.2022

задачи удержать частоту не стоит.

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

nobel пишет:

задачи удержать частоту не стоит.

а разве такое нужно бывает?

nobel
Offline
Зарегистрирован: 01.09.2022

ua6em пишет:

nobel пишет:

задачи удержать частоту не стоит.

а разве такое нужно бывает?


Работа форсунки на разных оборотах

SAB
Offline
Зарегистрирован: 27.12.2016

Руки прочь от форсунок. Сам убьешься ладно, но ведь невинного за сбой можешь потянуть :((

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

SAB пишет:

Руки прочь от форсунок. Сам убьешься ладно, но ведь невинного за сбой можешь потянуть :((

может он себе электрогенератор делает, правда обороты до 1500 не дотягивают )))

nobel
Offline
Зарегистрирован: 01.09.2022

ua6em пишет:

SAB пишет:

Руки прочь от форсунок. Сам убьешься ладно, но ведь невинного за сбой можешь потянуть :((

может он себе электрогенератор делает, правда обороты до 1500 не дотягивают )))


Все проще. Промывку форсунок.

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

nobel пишет:
ua6em пишет:

SAB пишет:

Руки прочь от форсунок. Сам убьешься ладно, но ведь невинного за сбой можешь потянуть :((

может он себе электрогенератор делает, правда обороты до 1500 не дотягивают )))

Все проще. Промывку форсунок.

так тут есть готовый проект

nobel
Offline
Зарегистрирован: 01.09.2022

ua6em пишет:

nobel пишет:
ua6em пишет:

SAB пишет:

Руки прочь от форсунок. Сам убьешься ладно, но ведь невинного за сбой можешь потянуть :((

может он себе электрогенератор делает, правда обороты до 1500 не дотягивают )))

Все проще. Промывку форсунок.

так тут есть готовый проект


Это понятно. Но хочется самому. И для мозгов полезно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nobel пишет:
Но хочется самому. И для мозгов полезно.
Тогда зачем было писать на форум?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

andriano пишет:

nobel пишет:
Но хочется самому. И для мозгов полезно.
Тогда зачем было писать на форум?

Ну как же...
Сам , все сам...
Сам придумал, сам на форуме спросил, сам ответ прочитал...

Morroc
Offline
Зарегистрирован: 24.10.2016

Стиль программирования "эффективный манагер" )