PDA

Επιστροφή στο Forum : Arduino Nano ταχύτητα δειγματοληψίας (analogRead σε ATmega328P)



selectronic
14-04-19, 03:55
Κύριοι, θέλω να ξέρω την μέγιστη τιμή μίας τάσης η οποία θα αλλάξει γρήγορα (πχ από μηδέν σε 1V) και σκέφτηκα ότι ένας Κινέζικος 5V Arduino Nano με ATmega328P στα 16MHz (https://www.ebay.com/itm/5V-16MHz-Nano-V3-0-Mini-USB-ATmega328P-AU-Micro-Controller-CH340G-Driver-Arduino/143199953989?hash=item215761e445%3Ag%3ALF0AAOSwk1B cpMOG&LH_BIN=1) (είναι όντως 16MHz???) με ένα πολύ light πρόγραμμα θα είναι αρκετά γρήγορος.
Αυτό είναι μέρος ενός τεστ, μια-δυο μετρήσεις σε μία μέρα θέλω να πάρω, δεν μιλάω για μόνιμη κατασκευή.

Η τιμή της τάσης θα είναι λογικά <1V άρα μάλλον θα μπορέσω να χρησιμοποιήσω την εσωτερική Vref=1.1V, αν και πρώτα θα μετρήσω σε σχέση με την 5Vcc για να είμαι σίγουρος, θα μπει και 5V TVS στην είσοδο για ασφάλεια. Ας πούμε ότι δεν υπάρχουν προβλήματα με θόρυβο και άλλα τέτοια, το PCB του Arduino θα είναι κολλητά με την αντίσταση της οποίας την τάση στα άκρα θα μετράω.
Το πρόγραμμα θα είναι όσο μπορεί πιο λιτό (για ταχύτητα), χωρίς LCD ή serialPrint:

1)analogRead Α0 (0-1023)
2)if Α0 > Β then Β=A0 (Β θα είναι η μέγιστη τιμή Α0 που μέτρησε)
3)analogWrite Α1(B) (που θα γίνει μία τάση περίπου 0-5V με ένα RC για να μπορώ να την διαβάσω με πολύμετρο)

Οι απορίες μου:

Πόσο γρήγορα θα διαβάζει την τάση το κύκλωμα (hardware/software) που περιέγραψα πριν, πόσες μετρήσεις το δευτερόλεπτο περίπου να περιμένω?
Είναι σωστή η σκέψη μου ότι το βήμα 3 (analogWrite) είναι το πιο γρήγορο, ή κάτι σε serialPrint μέσω του USB θα ήταν πιο γρήγορο?
Θα είναι πιο γρήγορο το πρόγραμμα αν αντί να γραφεί με τις απλές εντολές που ξέρω (analogRead, if then, κτλ) γίνει με κώδικα τύπου "ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1)"?
Είναι κάτι άλλο που μου διαφεύγει?
Μήπως ένα απλό κύκλωμα "peak detector (https://www.youtube.com/watch?v=jllsqRWhjGM)" με ή ακόμα και χωρίς τελεστικό/ους θα ήταν καλύτερο? Πόσο πιο αργός ή γρήγορος είναι ένας Arduino από πχ ένα peak detector με LM741 (http://www.learningaboutelectronics.com/Articles/Precision-peak-detector-circuit.php) (slew rate ~0.7V/s)?

Για την ιστορία θέλω να μετρήσω το πόσο παραπάνω από το ιδανικό φτάνει το ρεύμα σε δύο διαφορετικά κυκλώματα περιορισμού ρεύματος, το ένα όσο γίνεται πιο γρήγορο (με ένα τρανζίστορ και Rsense (https://www.rlocman.ru/i/Image/2016/11/23/Fig_1_Eng.gif)) και πόσο πιο αργό είναι ένα κύκλωμα με τελεστικό (LM358 (http://www.ti.com/lit/ds/slos068v/slos068v.pdf)) που πάλι μετράει τάση πάνω σε μία Rs, δεν ξέρω αν έχω υπερεκτιμήσει κατά πολύ την ταχύτητα του Arduino... :001_unsure:

aris285
14-04-19, 06:39
βασικα ποσο θα ειναι ο ελαχιστος χρονος που θες να μετρησει mS, nS? Με την analogWrite δεν μετρας με πολυμετρο διοτι ειναι PWM.

nestoras
14-04-19, 09:39
Γιάννη, γιατι δε ζητάς απο κάποιο μέλος της περιοχής σου να πας να κανεις τις μετρήσεις σου με ένα παλμογράφο και να τελειώνεις;

Θα ταλαιπωρηθείς αδικα και ισως χωρίς τα επιθυμητά αποτελέσματα.

SProg
14-04-19, 11:08
Κάνε αυτό που λέει ο Παγαγιώτης αλλά γενικά:

Μόνο η ταχύτητα του κρυστάλλου ενός μικροελεγκτή δεν ορίζει το πόσο γρήγορος είναι, πόσο μάλλον σε συγκεκριμένες διεργασίες ή για τα περιφερειακά.

Αν ανοίξεις το datasheet του συγκεκριμένου μΕ:
By default, the successive approximation circuitry requires an input clock frequency between 50kHz and200kHz to get maximum resolution. If a lower resolution than 10 bits is needed, the input clock frequency to theADC can be higher than 200kHz to get a higher sample rate.The ADC module contains a prescaler, which generates an acceptable ADC clock frequency from any CPUfrequency above 100kHz. The prescaling is set by the ADPS bits in ADCSRA. The prescaler starts countingfrom the moment the ADC is switched on by setting the ADEN bit in ADCSRA. The prescaler keeps running foras long as the ADEN bit is set, and is continuously reset when ADEN is low.When initiating a single ended conversion by setting the ADSC bit in ADCSRA, the conversion starts at thefollowing rising edge of the ADC clock cycle.A normal conversion takes 13 ADC clock cycles.

Αν διαβάσεις για την Wiring:
Ο Prescaler που έχουν ορίσει είναι 128. Αυτό σημαίνει ότι για 16MΗz κρύσταλλο, κάθε μετατροπή χρειάζεται στο περίπου
(128/16MHz) * 13 ticks = 104 μSec


Αν ο κρύσταλλος ήταν 12MHz και όριζες Prescaler 64 τότε:


(64/12MHz) * 13 ticks = 69.3 μSec

selectronic
14-04-19, 11:46
βασικα ποσο θα ειναι ο ελαχιστος χρονος που θες να μετρησει mS, nS? Με την analogWrite δεν μετρας με πολυμετρο διοτι ειναι PWM.

...3)analogWrite Α1(B) (που θα γίνει μία τάση περίπου 0-5V με ένα RC για να μπορώ να την διαβάσω με πολύμετρο...)

Δεν ξέρω τι χρόνους να περιμένω, φαντάζομαι πολύ γρήγορα για Arduino με μόνο τρανζίστορ (άρα η μέγιστη τιμή θα είναι κοντά στην τάση Vbe) αλλά ο "αργός" τελεστικός να έχει διαφορά, οπότε να μετρήσω πιο μεγάλη τάση με αυτόν?
Το να μετατρέψω έξοδο analogWrite PWM σε αναλογική με RC το έχω ξανακάνει και δούλεψε ΟΚ (https://www.hlektronika.gr/forum/showthread.php?t=88586&p=803938&viewfull=1#post803938) όταν πέτυχα τις τιμές αντιστάσεων/πυκνωτών (διπλό RC), δεν πιστεύω να έχω πρόβλημα εκεί...


Γιάννη, γιατι δε ζητάς απο κάποιο μέλος της περιοχής σου να πας να κανεις τις μετρήσεις σου με ένα παλμογράφο και να τελειώνεις;
Θα ταλαιπωρηθείς αδικα και ισως χωρίς τα επιθυμητά αποτελέσματα.

Είπα μήπως και ο Arduino είναι αρκετά γρήγορος, δεν ξέρω από μΕ αλλά 16MHz που ακούγονται πολλά και παρότι έψαξα για το πως θα μπορούσα να υπολογίζω την ταχύτητα που τρέχει όλο το πρόγραμμα, δεν έβγαλα άκρη: άλλο είναι η ταχύτητα του κρυστάλλου, άλλο είναι τα ticks (clock cycle) και πόσο γρήγορα τρέχει το πρόγραμμα, άλλο timer έχει ο ADC μέσα στον ATmega, δεν ξέρω από αυτά και είπα μήπως κάποιος που ξέρει έχει απλή απάντηση του τύπου "με 16MHz κρύσταλλο και 3 εντολές πρόγραμμα περίμενε περίπου 4,000 μετρήσεις το δευτερόλεπτο" ή κάτι τέτοιο αλλά βλέπω ότι δεν είναι τόσο απλό τελικά...:saad:
Δεν έχω πρόσβαση σε παλμογράφο δυστυχώς και ο gadgetογράφος ενώ έχει manual trigger με τάση και έχω δει πχ το bouncing των επαφών ρελέ (https://www.hlektronika.gr/forum/showthread.php?t=93291&p=852753&viewfull=1#post852753), στην μέτρηση της τάσης δεν μου τα λέει σωστά και δεν το εμπιστεύομαι...


Μόνο η ταχύτητα του κρυστάλλου ενός μικροελεγκτή δεν ορίζει το πόσο γρήγορος είναι, πόσο μάλλον σε συγκεκριμένες διεργασίες ή για τα περιφερειακά.

Αν ανοίξεις το datasheet του συγκεκριμένου μΕ:
By default, the successive approximation circuitry requires an input clock frequency between 50kHz and200kHz to get maximum resolution. If a lower resolution than 10 bits is needed, the input clock frequency to theADC can be higher than 200kHz to get a higher sample rate.The ADC module contains a prescaler, which generates an acceptable ADC clock frequency from any CPUfrequency above 100kHz. The prescaling is set by the ADPS bits in ADCSRA. The prescaler starts countingfrom the moment the ADC is switched on by setting the ADEN bit in ADCSRA. The prescaler keeps running foras long as the ADEN bit is set, and is continuously reset when ADEN is low.When initiating a single ended conversion by setting the ADSC bit in ADCSRA, the conversion starts at thefollowing rising edge of the ADC clock cycle.A normal conversion takes 13 ADC clock cycles.

Αν διαβάσεις για την Wiring:
Ο Prescaler που έχουν ορίσει είναι 128. Αυτό σημαίνει ότι για 16MΗz κρύσταλλο, κάθε μετατροπή χρειάζεται στο περίπου
(128/16MHz) * 13 ticks = 104 μSec


Ευχαριστώ για τις πληροφορίες, όπως έγραψα και πριν δεν ξέρω τίποτα από μΕ πέραν από 5-6 εντολές στον Arduino, πχ δεν ξέρω τι είναι ο "prescaler" αλλά μπορώ να το ψάξω (https://www.google.com/search?q=prescaler)!

Όταν λες κάθε μετατροπή θέλει περίπου 104μs (=> ~9.6KHz) εννοείς μόνο για την μέτρηση με analogRead, μετά πρέπει να βρω το ίδιο για την analogWrite και να προσθέσω τους δύο χρόνους για να βρω το σύνολο του χρόνου που θέλει κάθε loop του προγράμματος? Για να εκτελέσει την εντολή 2 (σύγκριση δύο τιμών και αποθήκευση μίας αν A0>B) πόσο χρόνο θέλει?

SProg
14-04-19, 11:55
Όταν λες κάθε μετατροπή θέλει περίπου 104μs (=> ~9.6KHz) εννοείς μόνο για την μέτρηση με analogRead, μετά πρέπει να βρω το ίδιο για την analogWrite και να προσθέσω τους δύο χρόνους για να βρω το σύνολο του χρόνου που θέλει κάθε loop του προγράμματος?


Τόσο θέλει μία μόνο μετατροπή με βάση αυτά που έχουν ορίσει σαν default στη Wiring. Η analogWrite είναι ουσιαστικά PWM και απλά αλλάζεις το όριο σε έναν Timer (ποσοστό ή κύκλο εργασίας δηλαδή), οπότε σαν εντολή είναι γρήγορη ΑΛΛΑ τη μεταβολή στο κύκλο εργασίας θα τη δεις στην έξοδο στην επόμενη περίοδο. Αυτός ο χρόνος δηλαδή μπορεί είναι ίσος T >~0 και T < T_pwm, άρα όχι σταθερός!


Ξέχνα τον ADC και το PWM.

selectronic
14-04-19, 12:04
Κατάλαβα, την ξεχνάω την ιδέα με τον Arduino και πάω σε κύκλωμα peak detector με LM741 σε voltage follower που λογικά θα είναι πιο γρήγορος (slew rate 0.7V/μs vs 0.3V/μs) από το LM358 που θα είναι στο κύκλωμα current limit...

http://www.learningaboutelectronics.com/Articles/Precision-peak-detector-circuit.php

http://www.learningaboutelectronics.com/images/Precision-peak-detector-circuit.png

nestoras
14-04-19, 13:23
Γιάννη, πάρε κάποιον πιο σύγχρονο τελεστικο για να κάνεις τη δουλειά σου. Ο 741 ειναι καμια 40αρια χρονών.

selectronic
14-04-19, 13:34
Το ξέρω, έχεις κάποιον άλλο υπόψιν?
Μόνο με LM358 (Dual) έχω παίξει μέχρι στιγμής (και κάτι LM833 κινέζικους που δεν ξέρω τι ψάρια πιάνουν). LM301 είναι πάλι αρχαίοι, δεν ξέρω κάποιον μονό τελεστικό σε DIP που να δουλεύεται πολύ (άρα φτηνός) να πάρω καμιά δεκαριά να παίζω...

Τα LM358 με βολεύουν γιατί η έξοδος κατεβαίνει σχεδόν μέχρι την -Vcc που βολεύει σε single supply κυκλώματα, αν δεν πειράζει να έχεις μερικά mV στην έξοδο αντί για 0.00V

selectronic
14-04-19, 14:00
Ξέρω και τους TL08x που υπάρχει σε μονό και έχει και καλό slew rate (13 typ / 5 min unity gain) και κοντινά voltage/current input offset με τον LM358.
Ένα περίεργο που βλέπω όμως είναι ότι πουθενά στο datasheet (http://www.ti.com/lit/ds/symlink/tl082b.pdf) δεν μιλάει για ρεύμα εξόδου... Στην σελίδα της ΤΙ (http://www.ti.com/product/TL084) λέει για "10mA typical"...

SProg
14-04-19, 14:05
Dissipation Rating Table

selectronic
14-04-19, 14:24
Dissipation Rating Table

OK, μπορείς να υπολογίσεις το ρεύμα έτσι, αλλά γιατί δεν το γράφουν στο datasheet?
Ούτε στο datasheet των TL07x (http://www.ti.com/lit/ds/symlink/tl074b.pdf) το γράφει...

SProg
14-04-19, 17:57
Γιατί δεν είναι σταθερό. Η μέγιστη τιμή αλλάζει με βάση τη θερμοκρασία, τάση τροφοδοσίας, dissipation κτλ.

Πόσο ρεύμα θέλεις στην έξοδο;

selectronic
14-04-19, 22:37
Γιατί δεν είναι σταθερό. Η μέγιστη τιμή αλλάζει με βάση τη θερμοκρασία, τάση τροφοδοσίας, dissipation κτλ.

Το ίδιο ισχύει και το ρεύμα Συλλέκτη ενός 2Ν3055, αλλά κάτι γράφει στο datasheet... Τέλος πάντων αυτό διάλεξε η κάνει η ΤΙ, δεν υπάρχει λόγος να το συζητάω.


Πόσο ρεύμα θέλεις στην έξοδο;

Κάτω από 5mA πάντα, συνήθως πολύ πιο κάτω (πχ Ib σε BC547 για μερικά mA ρεύμα Συλλέκτη), πχ LED στα 10mA το ανάβω πάλι μέσω ΤΟ-92 τρανζίστορ.

Θα δω αν έχουν TL071 ή 081 οι αγαπημένοι μου Πειραιώτες...

chip
15-04-19, 01:21
για γρήγορη ταχύτητα θα έβαζα ne5532 ή lm833.
Αλλά το πιθανότερο είναι ότι θα έβαζα TL071-2 ή TL081-2 γιατί απλά τους βρίσκεις εύκολα σε λογική τιμή, είναι αρκετά γρήγοροι και έχουν πολύ καλή συμπεριφορά και λίγες παραξενιές....

SProg
15-04-19, 06:33
Εαν μιλάς για 5mA τότε δε σε νοιάζει αν σου δίνουν το μέγιστο ρεύμα ή όχι, για παρόμοιο φορτίο σου δίνουν και μετρήσεις:

77820

tsimpidas
15-04-19, 08:26
για γρήγορη ταχύτητα θα έβαζα ne5532 ή lm833.
.

για γρηγορότερο απο το ne5532 το ne5534 δοκιμασμένο.