Sari la conținut
ELFORUM - Forumul electronistilor

Numarare pulsuri rapide


Vlad Mihai

Postări Recomandate

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

Editat de Vlad Mihai
Link spre comentariu

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 spre comentariu
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 spre comentariu

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

Link spre comentariu

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

Editat de Vlad Mihai
Link spre comentariu

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 spre comentariu
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 spre comentariu

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

Link spre comentariu
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 spre comentariu
  • 2 săptămâni mai târziu...

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

Editat de Vlad Mihai
Link spre comentariu

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 spre comentariu

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 spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări