Vlad Mihai Postat Mai 4, 2015 Partajează Postat Mai 4, 2015 (editat) 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! Editat Mai 4, 2015 de Vlad Mihai Link spre comentariu
nico_2010 Postat Mai 4, 2015 Partajează Postat Mai 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 spre comentariu
Liviu M Postat Mai 4, 2015 Partajează Postat Mai 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 spre comentariu
nico_2010 Postat Mai 4, 2015 Partajează Postat Mai 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 spre comentariu
Vlad Mihai Postat Mai 4, 2015 Autor Partajează Postat Mai 4, 2015 Salutare, da latimea pulsului e de 10ns... stiu ca e ceva misiune imposibila cu arduino, dar mi-am incercat norocul. Link spre comentariu
Liviu M Postat Mai 4, 2015 Partajează Postat Mai 4, 2015 Eu ma gandeam la ceva in genul asta http://interface.khm.de/index.php/lab/interfaces-advanced/arduino-frequency-counter-library/ Link spre comentariu
Vlad Mihai Postat Mai 4, 2015 Autor Partajează Postat Mai 4, 2015 (editat) 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 Editat Mai 4, 2015 de Vlad Mihai Link spre comentariu
Liviu M Postat Mai 4, 2015 Partajează Postat Mai 4, 2015 Ai dreptate, am mai citit si e prea scurt. Link spre comentariu
Vlad Mihai Postat Mai 4, 2015 Autor Partajează Postat Mai 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 spre comentariu
nico_2010 Postat Mai 4, 2015 Partajează Postat Mai 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 spre comentariu
Vlad Mihai Postat Mai 5, 2015 Autor Partajează Postat Mai 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 spre comentariu
nico_2010 Postat Mai 5, 2015 Partajează Postat Mai 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 spre comentariu
Vlad Mihai Postat Mai 13, 2015 Autor Partajează Postat Mai 13, 2015 (editat) 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. Editat Mai 13, 2015 de Vlad Mihai 1 Link spre comentariu
Vlad Mihai Postat Mai 14, 2015 Autor Partajează Postat Mai 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 spre comentariu
nico_2010 Postat Mai 14, 2015 Partajează Postat Mai 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 spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum