Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

monser
2019-11-11 10:25:45

Я не понял, что вы хотели сказать, но вопрос про импульсы решен!
Начинается со строки:
if(digitalRead(IMP)==LOW)     //если есть импульсы
И ни какой разницы нет какие импульсы хоть 1 кгц хоть 10.
как только вход IMP = 1 начинается счет в 100 секунд.

Watchdog
2019-11-11 10:17:17
monser пише:

Спасибо за подсказку. pulseIn я в принципе и хотел использовать, но на всякий случай всё же решил задать вопрос более продвинутым пользователям. Может есть  что то более подходящее для такой задачи. 
Точность тут особо и не нужна. ...

Куда уж мне, из будки, до продвинутых пользователей! Поможет RESET. cool

Watchdog
2019-11-11 10:12:25

Или я дурак или лыжи не едут. Речь же шла об импульсах частотой 1-2 кгц. А счетчик millis() даёт разрешение в 1 мс и то с дрожанием. И какая будет разность моментов времени, в единицах millis(), на 2-х кГц-ах - адын? Так и на 1 кГц-е может быть адын, в зависимости от фазы измерений.

monser
2019-11-11 06:54:27

Сделал все таки на digitalRead  без pulseIn. Получилось именно то, что и требовалось.
Но...именно с простой логикой , где казалось проблем не возникнет оказалась засада.
Вот привожу скетч( не нашел как включить нумерацию строк)

#define U17v 3   // 12 PIC
#define in540 6  // 5 PIC 
#define kz 2     // 13 PIC
#define FUN 7    // 7 PIC 
#define IMP 5    // 3 PIC


byte val;        //переменная времени 
byte flag;       //флаг состояния FUN
long previousMillis = 0;

void setup() 
{

  pinMode(U17v, OUTPUT);
  pinMode(FUN, OUTPUT);                     
  pinMode(in540, INPUT_PULLUP);   //   1/0 540v
  pinMode(kz, INPUT_PULLUP);      //   1/0 КЗ на вых 5С 
  pinMode(IMP, INPUT_PULLUP);     //   1/0 ПУСК
}

void loop() 
{
  boolean v540 = digitalRead(in540);
  boolean KZout = digitalRead(kz);
  
  if (v540 || !KZout)
  {
  digitalWrite(U17v, LOW);
  }
  else
  {
  digitalWrite(U17v, HIGH);
  }

  if(digitalRead(IMP)==LOW)     //если есть импульсы 
  { 
    previousMillis = millis();
    flag=1;
    val=0;
  }
  if(flag==1)
  {
    digitalWrite(FUN,HIGH);
  }  
  if(flag==1&&digitalRead(IMP)==HIGH)
  {
    if (millis() -previousMillis >1000)
    { 
     previousMillis = millis();     
     val++;                 // работает счет, FUN включен 
    }  
  }
  if(val>=100)             //через 100 сек FUN выключается
  { 
    digitalWrite(FUN,LOW);
    flag=0;
  }  
}

Как видно из скетча,  выводы in540, kz и U17v связаны между собой:

  if (v540 || !KZout)
  {
  digitalWrite(U17v, LOW);
  }
  else
  {
  digitalWrite(U17v, HIGH);
  }

но, как оказалось на входе kz , ноль действует всего в течении 2х секунд. Соответственно и на выходе U17v столько же, а необходимо, чтобы ноль на U17v продолжал висеть до перезагрузки ардуино.
Уже голову сломал, но так и не смог добиться желаемого результата.
Подтолкните плиз в нужном направлении.

monser
2019-10-23 01:55:38

Спасибо за подсказку. pulseIn я в принципе и хотел использовать, но на всякий случай всё же решил задать вопрос более продвинутым пользователям. Может есть  что то более подходящее для такой задачи. 
Точность тут особо и не нужна.
Вообще эта конструкция должна заменить PIC16F505 в частотном преобразователе.
Должно быть 6 входов и 3 выхода. 3 входа и 2 выхода завязаны между собой простой логикой  И ИЛИ.
А еще на 3 входа  начинают поступать импульсы (3х фазный частотник) при пуске частотника и сразу должен включиться вентилятор охлаждения.
После СТОПа импульсы идти соответственно перестают и через 1-2 минуты вентилятор выключается.

Watchdog
2019-10-22 15:05:52
Kaka пише:

Да почему не подойдёт-то? Для 1-2 кГц? Делов-то. Ещё как можно сделать.

Всё зависит от требуемой точности и взаимодейсвия основной программой. Я, почему-то, подумал про МГц-ы! smile Есть ещё pulseIn(...), для подобного.

Kaka
2019-10-22 14:35:28

Да почему не подойдёт-то? Для 1-2 кГц? Делов-то. Ещё как можно сделать.

Watchdog
2019-10-22 14:31:34
monser пише:

Имеется такая задача: включить  релюшку, при поступлении импульсов порядка 1-2 кгц на вход ардуино.
Что то не соображу как справиться с этой задачей. digital read похоже что не пойдет. Толкните плиз в нужном направлении.

Да, digitalRead(.) точно не подойдет. Вы можете использовать таймеры  микроконтроллера напрямую, в качестве частотомера, написав соответсвующую системную программу.  cool

monser
2019-10-22 12:50:34

Имеется такая задача: включить  релюшку, при поступлении импульсов порядка 1-2 кгц на вход ардуино.
Что то не соображу как справиться с этой задачей. digital read похоже что не пойдет. Толкните плиз в нужном направлении.

Підвал форуму