Ви не увійшли.
Сторінки 1
Имеется такая задача: включить релюшку, при поступлении импульсов порядка 1-2 кгц на вход ардуино.
Что то не соображу как справиться с этой задачей. digital read похоже что не пойдет. Толкните плиз в нужном направлении.
Неактивний
Имеется такая задача: включить релюшку, при поступлении импульсов порядка 1-2 кгц на вход ардуино.
Что то не соображу как справиться с этой задачей. digital read похоже что не пойдет. Толкните плиз в нужном направлении.
Да, digitalRead(.) точно не подойдет. Вы можете использовать таймеры микроконтроллера напрямую, в качестве частотомера, написав соответсвующую системную программу.
Да почему не подойдёт-то? Для 1-2 кГц? Делов-то. Ещё как можно сделать.
Всё зависит от требуемой точности и взаимодейсвия основной программой. Я, почему-то, подумал про МГц-ы! Есть ещё pulseIn(...), для подобного.
Спасибо за подсказку. pulseIn я в принципе и хотел использовать, но на всякий случай всё же решил задать вопрос более продвинутым пользователям. Может есть что то более подходящее для такой задачи.
Точность тут особо и не нужна.
Вообще эта конструкция должна заменить PIC16F505 в частотном преобразователе.
Должно быть 6 входов и 3 выхода. 3 входа и 2 выхода завязаны между собой простой логикой И ИЛИ.
А еще на 3 входа начинают поступать импульсы (3х фазный частотник) при пуске частотника и сразу должен включиться вентилятор охлаждения.
После СТОПа импульсы идти соответственно перестают и через 1-2 минуты вентилятор выключается.
Остання редакція monser (2019-10-23 01:58:28)
Неактивний
Сделал все таки на 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 продолжал висеть до перезагрузки ардуино.
Уже голову сломал, но так и не смог добиться желаемого результата.
Подтолкните плиз в нужном направлении.
Неактивний
Или я дурак или лыжи не едут. Речь же шла об импульсах частотой 1-2 кгц. А счетчик millis() даёт разрешение в 1 мс и то с дрожанием. И какая будет разность моментов времени, в единицах millis(), на 2-х кГц-ах - адын? Так и на 1 кГц-е может быть адын, в зависимости от фазы измерений.
Спасибо за подсказку. pulseIn я в принципе и хотел использовать, но на всякий случай всё же решил задать вопрос более продвинутым пользователям. Может есть что то более подходящее для такой задачи.
Точность тут особо и не нужна. ...
Куда уж мне, из будки, до продвинутых пользователей! Поможет RESET.
Я не понял, что вы хотели сказать, но вопрос про импульсы решен!
Начинается со строки:
if(digitalRead(IMP)==LOW) //если есть импульсы
И ни какой разницы нет какие импульсы хоть 1 кгц хоть 10.
как только вход IMP = 1 начинается счет в 100 секунд.
Остання редакція monser (2019-11-11 14:19:38)
Неактивний
Сторінки 1