Jump to content
ELFORUM - Forumul electronistilor

Numarare pulsuri rapide


Vlad Mihai

Recommended Posts

Salut, lucrez   la un proiect  pentru care e necesar sa numar  niste pulsuri de la un anumit senzor. Partea electronica am rezolvat-o in sensul ca obtin pulsuri de tip TTL la iesirea unui comparator high speed. Folosesc  arduino mega si o librarie pentru intreruperi pentru a numara pulsurile dar cred ca nu functioneaza cum  vreau eu. Va rog sa va uitati peste el, poate ma puteti ajuta sa il optimizez. Codul meu vreau sa faca asta:

-sa numere pulsuri timp de  un minut si dupa sa trimita numarul de pulsuri pe serial si sa reaia numararea.

 #define INTERRUPT_INPUT 2 int pulse_counter = 0;  void setup(){  Serial.begin(9600);       // For noise suppression, enable pullup on interrupt pin  digitalWrite(INTERRUPT_INPUT, HIGH);  attachInterrupt(INTERRUPT_INPUT - 2,                  interrupt_handler,                  RISING);}  void loop(){  // Keep LCD blank till a pulse comes in  if (pulse_counter > 0)  {     Serial.print("Z");   //sync data    Serial.println(pulse_counter);    Serial.print("n");    delay(20);  }  delay(20);}  void interrupt_handler(){  pulse_counter = pulse_counter + 1;}

Atasez  o imagine cu o oscilograma ce  ilustreaza cu mov pulsul pe care  vreau sa il numar. Multumesc anticipat!

post-216107-0-10646500-1430729364_thumb.png

Edited by Vlad Mihai
Link to comment

Pulsurile tale au ~10 ns lungime? Mi-e teama ca Arduino e prea lent pentru asa ceva. Ce-i drept, nu prea stiu eu cum e cu intreruperile la atmeli, da' daca sunt IOC...

Arduino asta nu are nici un timer/numarator care sa primeasca clock de la un pin? Cred ca ar merge mai bine.

Link to comment
nico_2010

Daca este asa cum a observat LiviuM, atunci numararea impulsurilor nu o vei putea face cu Arduino, decat daca folosesti un prescaler extern (tipul 74VHC4040) care accepta o latime a impulsului de minim 5ns.

Restul e aritmetica curata.

@LiviuM: ATMega2560 are destule timere (7 la numar), deci are de unde sa-si faca si baza de timp si numarator.

Link to comment

Salutare, da latimea pulsului e de 10ns... stiu ca e ceva misiune  imposibila cu arduino, dar mi-am incercat norocul.

Link to comment

Liviu stiu de link-ul respectiv, am facut montajul cu tranzistor si tot nu merge, imi da 0 tot timpul. nu simte nimic. macar cu,codul postat de mine mai  numara ceva. :rade:

E prea mic pulsul ca latime sa il prinda arduino doar daca  folosesc un prescaler ceva....

 

O sa aplic maine o sugestie  sugerata de   giongiu si o sa    revin cu detalii

Edited by Vlad Mihai
Link to comment

abia imi prinde  pulsul osciloscopul , mi-a sugerat  giongiu sa fac un montaj cu monostabil si sa vad daca  imi iese ceva, daca nu, nu am alta solutie. Multumesc pentru timp!

Link to comment
nico_2010

Tie iti trebuie cam ce ti-am spus mai sus: un prescaler de tipul 74VHC4040, sau un monostabil facut cu SN74LVC1G14 (care sa-ti lungeasca durata impulsului).

Link to comment

Salut, se pare ca   varianta cu LM555 nu merge, ramane sa incerc cu ceea ce mi-a recomandat nico_2010 mai sus. 

Link to comment
nico_2010

La impuls de 10ns latime, 555-ul ramane inert si nepasator. Dar e bine ca ai descoperit singur asta.

Folosind un 74VHC4040 pe iesirea de 2^11 vei avea o latime a impulsului de circa 2us, utilizabila pentru contorizare

Link to comment
  • 2 weeks later...

Salut,

 

Azi am terminat de facut circuitul care imi lungeste  pulsurile, astfel din   pulsuri de 10ns am pulsuri de circa 1.5us. nu stiu sigur daca imi ajunge  ca sa le numar cu arduino dar o sa caut ceva   documentatie sa ma conving, sau daca nu mai maresc pulsurile cat imi permite   perioada de repetitie a pulsurilor. Atasez o oscilograma:

 

Mentionez ca nu am folosit decat un tranzistor RF, un rezistor si un condensator ca sa lungesc pulsul (ideea ii apartie lui smilex), cu mov sunt pulsurile de  1.5us si cu albastru sunt pulsurile de 10ns  care au fost convertite ulterior.

 

Maine o sa testez  software-ul postat in primul post sa vad cum se comporta, in caz ca e functional.

post-216107-0-10016200-1431526005_thumb.png

Edited by Vlad Mihai
Link to comment

Salut, am testat astazi codul de mai sus dar putin modificat si tot nu merge. Acesta este codul pe care l-am testat.

 #define INTERRUPT_INPUT 2 int pulse_counter = 0;  void setup(){  Serial.begin(9600);       // For noise suppression, enable pullup on interrupt pin  digitalWrite(INTERRUPT_INPUT, HIGH);  attachInterrupt(INTERRUPT_INPUT - 2,                  interrupt_handler,                  FALLING);}  void loop(){  // Keep LCD blank till a pulse comes in  if (pulse_counter > 0)  {    Serial.print("Z");   //sync data    Serial.println(pulse_counter);    Serial.print("n");    delay(100);  }  delay(150);}  void interrupt_handler(){  pulse_counter = pulse_counter + 1;}

Pulsul pe care vreau sa il numar este atasat (cu mov).

post-216107-0-73869400-1431590933_thumb.png

Link to comment

Prima remarca: variabila pulse_counter nu ai declarat-o ca fiind volatile (Arduino:"To make sure variables used in an ISR are updated correctly, declare them as volatile".

A doua remarca: de ce nu folosesti tu INPUT COMPARE a Timer-ului 1?

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines