Перейти к содержанию

Помогите разработать схему специфического таймера


Рекомендуемые сообщения

4 часа назад, Просто зашёл сказал:

чем больше ёмкость, тем губительнее

естественно, все должно быть в разумных пределах

если поставить 100мкФ, то кнопки надолго не хватит :)

а 0,1-1,0 мкф вряд ли сильно скажется на долговечности кнопки

при 5 вольтах питания, ну для полного счастья можно последовательно с конденсатором поставить еще и резистор на 10 Ом.

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

@Просто зашёл если вы знаете простой способ подавления дребезга простым путем программно без задержки времени - поделитесь, буду благодарен!

все гениальное просто. чем проще тем надежнее.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

50 минут назад, v1ct0r сказал:

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

чушь, код Вашей задержки
tmr = millis();
tmr: if (millis() - tmr < 500) {
работает в разы дольше...

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

42 минуты назад, v1ct0r сказал:

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

Дело в том, что какая бы длительная задержка времени на подавления дребезга не была бы выбрана, она никаким образом на отработку пауз алгоритма не повлияет, так как выполнение алгоритма начнётся только после того, как МК зафиксирует нажатие на кнопку (замыкание контакта). А когда это произойдёт, сразу, через 30 мс или через 100 мс после как была нажата кнопка роли по большому счёту нет. Огромная (300 мс и более) задержка для устранения дребезга контактов может негативно повлиять лишь для восприятия процесса пользователем, типа нажал на кнопку, а нечего не происходит… но на временные задержки в алгоритме это никак повлиять не может от слова совсем. :)

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

@IMXO извините не понял

17 минут назад, IMXO сказал:

if (millis() - tmr < 500) {
работает в разы дольше...

это задержка согласно ТЗ

все гениальное просто. чем проще тем надежнее.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, v1ct0r сказал:

если вы знаете простой способ подавления дребезга простым путем программно без задержки времени

По моим экспериментам в прошлом, можно сказать, что дребезг контактов в самом длительном его выражении, не превышает 30 мс. Таким образом задержку на дребезг можно игнорировать только тогда, когда это не повлияет на правильность выполнения алгоритма...  то есть Ваш алгоритм, это не тот случай... :)

Изменено пользователем Просто зашёл
Ссылка на комментарий
Поделиться на другие сайты

объясняю, millis() использует 32-битную математику, + задействует прерывание по 8ми битному таймеру TMR0 который по определению не может формировать точную задержку 1мс + задержки на атомарный доступ
и тд и тп.  Все это в совокупности по времени эквивалентно опросу АЦП , который нужен только для получения констант таймеров и спокойно может быть сделан по время паузы ни на что не влияя.  

+ к этому кто вам сказал что пороги переключения входов МК есть величина постоянная? если че она как минимум зависит от напряжения питания и температуры и не стабильна по времени.
о каких точных задержках речь при использовании RC-цепи?

Изменено пользователем IMXO
Ссылка на комментарий
Поделиться на другие сайты

@Просто зашёл @IMXO убедили :) 

@san911 конденсатор параллельно кнопке не нужен

доработанные  скетчи:

 первый первого варианта

Спойлер
[code]
//активный сигнал с датчика "0", если "1",
//то инвертировать, или изменить настройку входа 9

void setup() {
  pinMode(11, OUTPUT);//не обязат.  индикация паузы
  pinMode(12, OUTPUT);//на включение реле
  pinMode(8, INPUT_PULLUP);//кнопка пуск
  pinMode(9, INPUT_PULLUP);//сигнал с датчика-"0"

}

void loop() {
  if ( digitalRead(8) == LOW )// кнопка пуск
  { delay(20);       //задержка на дребезг контактов
    digitalWrite(12, HIGH);//сигнал на включение реле
    delay(500);//время включенного реле(мс)
    digitalWrite(12, LOW);//выключение реле

    //регулировка паузы(мс) переменным резистором
    int t = 4 * analogRead(A0);

    digitalWrite(11, HIGH);//индикация начала паузы
    delay(t); //время паузы
    digitalWrite(11, LOW);//конец паузы
  }
}

void yield() {
  ///варианты отключение реле///
  //отпускание кнопки пуск
  if ( digitalRead(8) == HIGH or
       //сигнал с датчика - задержка(мс) RC цепью
       //регулировка задержки переменным резистором
       digitalRead(9) == LOW)
  {
    digitalWrite(12, LOW);//выключение реле
  }
}
[/code]

 

доработанный первого варианта

Спойлер
[code]
//активный сигнал с датчика "0", если "1",
//то инвертировать, или изменить настройку входа 9

unsigned long tmr ;        // переменная таймера

void setup() {
  pinMode(11, OUTPUT);      //не обязат.  индикация паузы
  pinMode(12, OUTPUT);      // реле и светодиод
  pinMode(8, INPUT_PULLUP); //кнопка пуск
  pinMode(9, INPUT_PULLUP); //сигнал с датчика-"0"
}

void loop() {
  if ( digitalRead(8) == LOW ) //если кнопка пуск нажата
  { delay(20);           //задержка на дребезг контактов
    digitalWrite(12, HIGH);    // включение реле

    //время включенного реле(мс)
    tmr = millis();
tmr:
    if (millis() - tmr < 500) {
      ///варианты отключение реле///
      if ( digitalRead(8) == HIGH or//если кнопка пуск отжата
           digitalRead(9) == LOW)  //или сигнал с датчика -
 // регулировка задержки(мс) RC цепью(перем.резистор)
      {
        goto pauza;
      }
      goto tmr;
    }
pauza:
    digitalWrite(12, LOW);  //выключение реле
    digitalWrite(11, HIGH); //индикация начала паузы
    //регулировка паузы(мс) переменным резистором
    int t = 4 * analogRead(A0);
    delay(t);               //время паузы
    digitalWrite(11, LOW);  //конец паузы
  }
}
[/code]

 

второй вариант

Спойлер
[code]
//       !!!ВНИМАНИЕ!!!
//пины ввода/вывода можно заменить на любые удобные
//только в строках #define !!!
//кроме А0 и А1 - их можно менять на любые аналоговые

#define PUSK_PIN 8      // номер вывода кнопки "пуск"
#define DATCHIK_PIN 9   // номер вывода сигнала датчика 
#define LedPUSK_PIN 10  // номер вывода светодиода "пуск"
#define LedPAUSA_PIN 11 // номер вывода светодиода "пауза"
#define RELE_PIN 12     // номер вывода светодиодa c реле

unsigned long tmr ;     // переменная таймера
unsigned long tmr1 ;    // переменная таймера1

void setup() {
  pinMode(PUSK_PIN, INPUT_PULLUP);    // кнопка пуск
  pinMode(DATCHIK_PIN, INPUT_PULLUP); // !!!сигнал с датчика-"0"!!!
  pinMode(LedPUSK_PIN, OUTPUT);       // индикация пуска
  pinMode(LedPAUSA_PIN, OUTPUT);      // индикация паузы
  pinMode(RELE_PIN, OUTPUT);          // реле и светодиод
}
void loop() {
  if ( digitalRead(PUSK_PIN) == LOW ) //если кнопка пуск нажата
  { delay(20);                  //задержка на дребезг контактов
    digitalWrite(LedPUSK_PIN, HIGH);  // вкл. светодиода "пуск"

    tmr = millis();
tmr:
    if (millis() - tmr < 500) //время включенного светодиода "пуск"
    {
      if ( digitalRead(PUSK_PIN) == HIGH) //пауза если отжата "пуск"
      {
        goto pauza;
      }
      if ( digitalRead(DATCHIK_PIN) == LOW) //если есть сигнал датчика
      {
        digitalWrite(RELE_PIN, HIGH);      // вкл.реле и светодиода

 //время на отключение реле регулировка(мс) переменным резистором
        int t1 =  analogRead(A1) / 2 ;
        tmr1 = millis();
tmr1:
        if (millis() - tmr1 > t1 or
            digitalRead(PUSK_PIN) == HIGH)
        {
          goto pauza;
        }
        goto tmr1;
      }
      goto tmr;
    }
pauza:
    digitalWrite(LedPUSK_PIN, LOW);  // выкл. светодиода "пуск"
    digitalWrite(RELE_PIN, LOW);      //выключение реле
    digitalWrite(LedPAUSA_PIN, HIGH); //индикация паузы
    //регулировка паузы(мс) переменным резистором
    int t0 = 4 * analogRead(A0);
    delay(t0);                         //время паузы
    digitalWrite(LedPAUSA_PIN, LOW);  //конец паузы
  }
}
[/code]

 

 

я тут подумал... по моему, в данном случае задержка на дребезг вообще не нужна

Изменено пользователем v1ct0r

все гениальное просто. чем проще тем надежнее.

Ссылка на комментарий
Поделиться на другие сайты

58 минут назад, v1ct0r сказал:

в данном случае задержка на дребезг вообще не нужна

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

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, v1ct0r сказал:

по моему, в данном случае задержка на дребезг вообще не нужна

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

Ссылка на комментарий
Поделиться на другие сайты

19 часов назад, v1ct0r сказал:

номинал не критичен от 0,1мкФ и выше

Кнопка замыкает заряженный конденсатор - будет искрение, быстрый износ контактов. Вот здесь есть про устранение дребезга.

Ссылка на комментарий
Поделиться на другие сайты

@IMXO @Просто зашёл и может кто еще!

я  в программировании профаном себя уже не считаю, но и до программиста мне еще далеко, скажем так я себя оцениваю в программировании как Дилетант(с большой буквы :) )

объясните мне пожалуйста, если не трудно, почему в последнем скетче в строках программы

if (millis() - tmr < 500)

и

if (millis() - tmr1 > t1

которые выполняют в общем то одинаковые действия, для правильной отработки выдержки в первом случае мне пришлось ставить "<" а во втором "> " ???

у меня уже мозги "кипят" - не понимаю :( 

@IMXO если вы опять будете выражать "фу" по поводу "goto", то без него  "millis()"  вообще не работает у меня почему то 

все гениальное просто. чем проще тем надежнее.

Ссылка на комментарий
Поделиться на другие сайты

37 минут назад, v1ct0r сказал:

у меня уже мозги "кипят" - не понимаю

Я "Ваш" язык программирования не знаю... извиняюсь, помочь не смогу. :unknw:

Ссылка на комментарий
Поделиться на другие сайты

18 минут назад, IMXO сказал:

потомушта ИЛИ....  :)

если вы имеете в виду 

if (millis() - tmr1 > t1 or

  digitalRead(PUSK_PIN) == HIGH)

то нет, я думал об этом и проверил, убрав

"or  digitalRead(PUSK_PIN) == HIGH)"

результат тот же, так что дело не в этом

 

"ты просто не умеешь"

не спорю 

1 час назад, v1ct0r сказал:

я себя оцениваю в программировании как Дилетант

 

Изменено пользователем v1ct0r

все гениальное просто. чем проще тем надежнее.

Ссылка на комментарий
Поделиться на другие сайты

1 hour ago, v1ct0r said:

выполняют в общем то одинаковые действия

Эти сравнения выполняют противоположные действия:

первое условие если true, то оставайся в цикле задержки.

второе условие если true, то выходи из цикла задержки.

Поэтому, чтобы отработать задержку во втором условии противоположный знак сравнения >.

Ссылка на комментарий
Поделиться на другие сайты

56 минут назад, IMXO сказал:

как из 2И получить  2ИЛИ

интересное кино, но я не вижу 2И, а только 2ИЛИ

при завершении одной любой из задержек - переход к паузе

не нужно завершения обеих

16 минут назад, Yurkin2015 сказал:

чтобы отработать задержку во втором условии противоположный знак сравнения >.

во втором условии я вынужденно - "методом научного тыка" :)  изменил знак < на  >  

ладно, будем считать, что объяснили

все гениальное просто. чем проще тем надежнее.

Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, v1ct0r сказал:

интересное кино, но я не вижу 2И, а только 2ИЛИ

if (millis() - tmr1 > t1 or digitalRead(PUSK_PIN) == HIGH) { goto pauza; }

==

if (!((millis() - tmr1 < t1) && (digitalRead(PUSK_PIN) == LOW))) { goto pauza; }

Ссылка на комментарий
Поделиться на другие сайты

12 минут назад, IMXO сказал:

if (!((millis() - tmr1 < t1) && (digitalRead(PUSK_PIN) == LOW))) { goto pauza; }

еще интереснее :) я же писал

1 час назад, v1ct0r сказал:

если вы имеете в виду 

if (millis() - tmr1 > t1 or

  digitalRead(PUSK_PIN) == HIGH)

то нет, я думал об этом и проверил, убрав

"or  digitalRead(PUSK_PIN) == HIGH)"

результат тот же

т.е. вместо 

if (millis() - tmr1 > t1 or   digitalRead(PUSK_PIN) == HIGH)

{   goto pauza;     }

я подставлял      if (millis() - tmr1 < t1)   {   goto pauza;  }   -  не работало, а работало все равно только с

if (millis() - tmr1 > t1)    {   goto pauza;  }

все гениальное просто. чем проще тем надежнее.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...