• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Komparator czestotliwosci
#1
Witam Wszystkich Specjalistow Smile

Mozna by powiedziec ze przyszla znow koza do woza Smile

Moze pytanie jest proste ?

Na wejscie IN doprowadzana  jest czestotliwosc prostokatna o amplitudzie 3,3V i czestotliwosci 0-50HZ.
Po przekroczeniu czestotliwosci zapisanej w programie (np. 10 HZ), wyjscie OUT usrtawiane jest na HIGH,
wszystko ponizej tej czestotliwosci LOW.

Bardzo prosze o te cudowne dwie linijki Smile

Pozdrawiam Serdecznie .
 
#2
https://docs.arduino.cc/tutorials/zero/s...ency-meter - nie testowałem, ale jak większość pytań o Arduino gotowa odpowiedź jest już w Google, tu drukuje coś na serial gdy Hz>0, to sobie to zmień na digitalWrite gdy >10, tylko zakres zmień od 0Hz.
https://www.instructables.com/Arduino-Fr...y-Counter/
https://www.youtube.com/watch?v=4tkyQ8n02Zg
Miło być decenianym https://buycoffee.to/kaczakat
 
#3
Elektronicznie to to ogarne to nie problem dla mnie Smile
ale czy nie ma jakiegos prostego triku zeby takt dac na wejscie esp i na wyjsciu miec chciany sygnal??

Sprobuje to moze opisac po mojemu tak lopatologicznie Smile :

Jesli 2 impulsy mieszcza sie w przedziale czasu (timer) 100ms to wtedy wyjscie jest HIGH, jezeli nie mieszcza sie w przedziale 100ms wtedy LOW.
Oczywiscie mam na mysli zbocza impulsow.

i zeby permamentnie kontrolowalo to albo chociaz co sekunde
 
#4
Nic nie wspominałeś o ESP, a z drugiego opisu wiem tyle co z pierwszego. 3.3V może i coś sugerowało, ale UNO sobie by poradziło z takim sygnałem.
No to zmieniam szukany ciąg znaków z Arduino na ESP8266 Frequency Counter, znajduję pierwszy z brzegu:
https://github.com/kapraran/FreqCountESP...Serial.ino
Może zanim napiszesz kolejny post to wgraj bibliotekę i przetestuj przykład, zapytaj jak już będziesz miał faktyczne pytanie.
Oczywiście nie trzeba do tego biblioteki, ale trzeba umieć mierzyć czas nie używając delay, tu wystarczy wpisać na tym forum wyszukanie w moich postach "funkcja czas". Potem trzeba zapisać stan przycisku i odczytać aktualny, jeśli aktualny jest inny niż poprzedni to był impuls i trzeba go zliczyć, zaktualizować stan poprzedni, jak minęło 100ms i zliczyłeś więcej niż 1 to znaczy, że częstotliwość jest większa. Albo inaczej jeśli między zliczeniami minęło mniej niż 100ms to od razu wiadomo, że jest więcej niż 10Hz. Jeśli nic więcej nie robisz w programie to będzie działać OK, ale jak robisz to lepiej użyć przerwań bo jak program gdzieś utyka na kilkanaście ms by coś pokazać np. na ekranie OLED i2c to może nie zauważyć krótkiego impulsu. Jest biblioteka, to skorzystaj.
Miło być decenianym https://buycoffee.to/kaczakat
 
#5
Witam jeszcze raz w tym samym Roku i Zycze wpierw Zdrowego Szczesliwego Nowego!

Nawiazujac do mojego problemiku j , nie Gram w Waszej Lidze, Wy gracie Szopena, a ja sie ucze
"wlaz kotek na plotek".

I dlaletego bardzo bym prosil zeby jakis magik przetlumaczyl mi to z fotki na arduino (ESP).
Wejscie  potem timer opuzniajacy wylaczenie za nim timer opuzniajacy wlaczenie i wyjscie.

Wypije Wasze Zdrowie Jutro  Smile

   
 
#6
Chociaz

Jak napisac cos takiego ? 


A= (time(High) input , hal) ;

if 
(A > timer(1000));
{digitalWrite(zas, LOW);  }  //zasilanie wylacz
 
wiem ze to kompletnie nie tedy droga ! ale moze cos by szlo?
 
#7
(06-01-2024, 09:10)wowo napisał(a): Chociaz

Jak napisac cos takiego ? 


A= (time(High) input , hal) ;

if 
(A > timer(1000));
{digitalWrite(zas, LOW);  }  //zasilanie wylacz
 
wiem ze to kompletnie nie tedy droga ! ale moze cos by szlo?

rozumie ze wpierw trzeba zdekodowac i poukladac co tam nabazgralem u gory, albo inaczej mowiac zrobic nowa babke z piasku.
 
#8
Przykład jak zmierzyć czas stanu na pinie:
Kod:
const int led=4,input=6;
bool stanAktualnyPinu, stanPoprzedniPinu;
uint32_t teraz, poprzednio,roznica;

void setup() {
  // put your setup code here, to run once:
pinMode(led,OUTPUT);
  //zmienna stanAktualnyPinu ma poczatkowa wartosc 0, sprawdzdamy wstepnie co jest na pinie
  stanAktualnyPinu = digitalRead(input);
  stanPoprzedniPinu=stanAktualnyPinu;
}

void loop() {
  teraz=millis();
//po wejsciu w loop patrzymy na pierwsza zmiane 
stanAktualnyPinu = digitalRead(input);
if(stanAktualnyPinu == stanPoprzedniPinu)
{
// stan sie nie zmienil, jesli to potrwa powyzej 100ms to mamy <10Hz
if(( teraz-poprzednio)>100 ) digitalWrite (led,LOW);
}
else
{
  if ((teraz-poprzednio)<=100) digitalWrite(led,HIGH);
  else digitalWrite (led,LOW);
  //stan sie zmienil, zapiszmy czas
  poprzednio=teraz;
}
  // put your main code here, to run repeatedly:

}
Napisane na kolanie i nietestowane, by zmierzyć okres trzeba zmierzyć dwa kolejne stany niski/wysoki, a to zadziała przy wypełnieniu 50%. Ale to coś w ten deseń. Można to rozpisać dokładnie w switch case. Poczytaj, potestój, pomyśl. Oczywiście są też gotowce, wystarczy dobre pytanie w google zadać.
 
#9
(06-01-2024, 15:18)Irvin napisał(a): Przykład jak zmierzyć czas stanu na pinie:
Kod:
const int led=4,input=6;
bool stanAktualnyPinu, stanPoprzedniPinu;
uint32_t teraz, poprzednio,roznica;

void setup() {
  // put your setup code here, to run once:
pinMode(led,OUTPUT);
  //zmienna stanAktualnyPinu ma poczatkowa wartosc 0, sprawdzdamy wstepnie co jest na pinie
  stanAktualnyPinu = digitalRead(input);
  stanPoprzedniPinu=stanAktualnyPinu;
}

void loop() {
  teraz=millis();
//po wejsciu w loop patrzymy na pierwsza zmiane 
stanAktualnyPinu = digitalRead(input);
if(stanAktualnyPinu == stanPoprzedniPinu)
{
// stan sie nie zmienil, jesli to potrwa powyzej 100ms to mamy <10Hz
if(( teraz-poprzednio)>100 ) digitalWrite (led,LOW);
}
else
{
  if ((teraz-poprzednio)<=100) digitalWrite(led,HIGH);
  else digitalWrite (led,LOW);
  //stan sie zmienil, zapiszmy czas
  poprzednio=teraz;
}
  // put your main code here, to run repeatedly:

}
Napisane na kolanie i nietestowane, by zmierzyć okres trzeba zmierzyć dwa kolejne stany niski/wysoki, a to zadziała przy wypełnieniu 50%. Ale to coś w ten deseń. Można to rozpisać dokładnie w switch case. Poczytaj, potestój, pomyśl. Oczywiście są też gotowce, wystarczy dobre pytanie w google zadać.


Dziekuje Smile
Juz z tym powalcze Smile
 
#10
Zrobilem to tak jak ponizej,

Program steruje moim prototypowym rowerem elektrycznym.

Adoptowalem to od kolegi z postu powyzej , troszke pozmienialem i kompiluje sie 

tam jak jedynke zmienie na 0 to czeka na sygnal z krecenia, jak wpisze jeden to kreci sie od razu.
 WEJSCIE HALOTRONU TO hal input
narazie steruje tym wyjscie hamout.
dlugosc jedynki halotronu to mniej wiecej 1/10 okresu

#define capin 25
#define lion 26
#define zas  33
#define lad 23
int hamin = 16; // LED an pin 13
int hamout = 32; // Taster an Digital-Pin 7
int hamuj = 0; // variable um den Pinstatus zu speichern
#define capout 22
#define hal 15
#define go 18

int stanAktualnyhal, stanPoprzednihal, taktout, golow, gohigh ;
uint32_t teraz, poprzednio, roznica;

void setup()

{
pinMode(lion, INPUT) ;
  pinMode(zas, OUTPUT)  ;
  pinMode(lad, OUTPUT) ;
  pinMode(hamout, OUTPUT);
  pinMode(hamin, INPUT);
  pinMode(capin, INPUT) ;
  pinMode (capout, OUTPUT);
pinMode(hal, INPUT) ;
  pinMode(go, OUTPUT);
  //zmienna stanAktualnyhal ma poczatkowa wartosc 0, sprawdzdamy wstepnie co jest na pinie
  stanAktualnyhal= digitalRead(hal);
  stanPoprzednihal=stanAktualnyhal;
}

void loop() {

teraz=millis();
//po wejsciu w loop patrzymy na pierwsza zmiane
stanAktualnyhal= digitalRead(hal);
if(stanAktualnyhal == stanPoprzednihal)
{
// stan sie nie zmienil, jesli to potrwa powyzej 100ms to mamy <10Hz
if(( teraz-poprzednio)>100 );
taktout = 0;

}
else
{
  if(( teraz-poprzednio)<=100);
  taktout = 1;
  //stan sie zmienil, zapiszmy czas
poprzednio=teraz;
}

delay(100);

//
if
    (analogRead(lion) < 1750)    //niski poziom +++++acu
  {digitalWrite(zas, LOW);  }  //zasilanie wylacz
 
  if
  (analogRead(lion) < 2200)
{ digitalWrite(lad, LOW) ; }  //ladowanie wlacz

delay(10);
if
  (analogRead(lion) > 2100)          //minimalny  poziom acu
  { digitalWrite(zas, HIGH) ; }  //zasilanie wlacz
 
 
  if
  (analogRead(lion) > 2500)    // wysoki poziom Accu
 
  {digitalWrite(lad, HIGH) ;  }        //Ladowanie wylacz (HIGH)

if
  (analogRead(capin) > 3500)    // wysoki poziom condnsatora
 
  {digitalWrite(capout, HIGH) ;  }        //Ladowanie condensatora wlacz (HIGH)

if
  (analogRead(capin) < 2300)    // niski poziom condnsatora
 
  {digitalWrite(capout, LOW) ;  }        //Ladowanie condensatora wylacz (LOW)

hamuj = digitalRead(hamin);

if (taktout = 0) //  TO TUTAJ TO 0 ALBO 1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{ digitalWrite (hamout, HIGH); }
else
{ digitalWrite (hamout, LOW);}


Prosze o porade Smile
}
 
  


Skocz do:


Przeglądający: 1 gości