Vlad Mihai Posted May 4, 2015 Share Posted May 4, 2015 (edited) 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! Edited May 4, 2015 by Vlad Mihai Link to comment
nico_2010 Posted May 4, 2015 Share Posted May 4, 2015 Va trebui sa folosesti si un timer (cu sau fara prescaler) si o baza de timp (generata de un alt timer, sau cu delay_ms), altfel nu are cine sa numere impulsuri si nici in ce perioada de timp. O posibil inspiratie: http://www.gammon.com.au/timers Link to comment
Liviu M Posted May 4, 2015 Share Posted May 4, 2015 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 Posted May 4, 2015 Share Posted May 4, 2015 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
Vlad Mihai Posted May 4, 2015 Author Share Posted May 4, 2015 Salutare, da latimea pulsului e de 10ns... stiu ca e ceva misiune imposibila cu arduino, dar mi-am incercat norocul. Link to comment
Liviu M Posted May 4, 2015 Share Posted May 4, 2015 Eu ma gandeam la ceva in genul asta http://interface.khm.de/index.php/lab/interfaces-advanced/arduino-frequency-counter-library/ Link to comment
Vlad Mihai Posted May 4, 2015 Author Share Posted May 4, 2015 (edited) 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. 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 May 4, 2015 by Vlad Mihai Link to comment
Liviu M Posted May 4, 2015 Share Posted May 4, 2015 Ai dreptate, am mai citit si e prea scurt. Link to comment
Vlad Mihai Posted May 4, 2015 Author Share Posted May 4, 2015 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 Posted May 4, 2015 Share Posted May 4, 2015 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
Vlad Mihai Posted May 5, 2015 Author Share Posted May 5, 2015 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 Posted May 5, 2015 Share Posted May 5, 2015 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
Vlad Mihai Posted May 13, 2015 Author Share Posted May 13, 2015 (edited) 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. Edited May 13, 2015 by Vlad Mihai 1 Link to comment
Vlad Mihai Posted May 14, 2015 Author Share Posted May 14, 2015 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). Link to comment
nico_2010 Posted May 14, 2015 Share Posted May 14, 2015 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now