PDA

Επιστροφή στο Forum : Μη-γραμμική σχέση δύο τιμών σε Arduino



selectronic
22-03-17, 00:54
Καλησπέρα σε όλους,

Έχω μία έξοδο PWM σε Arduino Nano v3 που βάζω τιμές 0-1023 σε 7KHz συχνότητα, την οποία περνάω από ένα RC φίλτρο και έναν διαιρέτη τάσης για να πάρω μία τάση 0 - ~271mV (για Duty Cycle 0-100%). Ως εδώ όλα καλά, αλλά θέλω να υπολογίσω (όχι μετρήσω) στον κώδικά τι τάση θα έχω για την Χ τιμή PWM. Όμως η σχέση PWM / Vout δεν είναι γραμμική, και δεν ξέρω τι μαθηματική πράξη πρέπει να χρησιμοποιήσω για να έχω σωστά αποτελέσματα σε όλο το φάσμα τιμών.

Το πιο κοντινό που βρήκα (κατά την γνώμη μου) στο Google είναι αυτό (http://forum.arduino.cc/index.php?topic=299704.15), αλλά δεν έδινα προσοχή όταν μαθαίναμε μαθηματικά στο σχολείο, οπότε δεν ξέρω αν κάτι τόσο απλό όσο μια γραμμή κώδικα (μία πράξη) σαν αυτή θα κάνει αυτό που θέλω ή αν χρειάζεται "πίνακας αξιών" και πάει μακριά η βαλίτσα...

Βάζω μερικές τιμές για να δείτε την σχέση μεταξύ τιμής PWM και Τάσης εξόδου:

PWM ____925 ____836 ___651 ___437 ____296 ___113 ___74 ____13
mVolts __245.8 __222.6 _174.6 __118.6 ___82.0 __34.2 __24.1 ___8
Rate ____3763 ___3756__3728 ___3684 __3609 __3304 __3070 __1625

Αν μπορεί κάποιος να μου πει τον τύπο που θα κάνει αυτό που θέλω, αν γίνεται βέβαια απλά με μία πράξη, θα ήταν μεγάλη βοήθεια.

Ευχαριστώ πολύ για τον χρόνο σας!

osek
22-03-17, 08:45
Καλημέρα,
αν και δεν κατάλαβα τι είναι το "Rate" που αναφέρεις, νομίζω πως ο τύπος που ψάχνεις είναι
Τιμή_PWM / 1023 * Voutmax

selectronic
22-03-17, 12:15
Καλημέρα,
αν και δεν κατάλαβα τι είναι το "Rate" που αναφέρεις, νομίζω πως ο τύπος που ψάχνεις είναι
Τιμή_PWM / 1023 * Voutmax

Αυτό που θέλω είναι να υπολογίσω στον κώδικα (για να το εμφανίσω στην LCD), είναι τι τάση θα έχω στην έξοδο (Vout ή "mVolt" στον ας πούμε πίνακα τιμών που έβαλα) για Χ τιμή PWMout (1-1023, "PWM" στον πίνακα).

Πχ αν δώσω εντολή PWMout=925 ξέρω μετρώντας με το πολύμετρο ότι θα έχω στην έξοδο ~246mV, οπότε θα μπορούσα να πω ότι 925/0.246=3760.1 βρήκα την "σταθερά" μου (Rate?) για να υπολογίζω στον κώδικα τι θα έχω στην έξοδο.
Αλλά δυστυχώς δεν συμβαίνει αυτό γιατί αν αλλάξω τιμή PWM, σε πχ PWMout=296 και έχω στον κώδικα Vout=PWMout/3760.1 τότε στον κώδικα έχω 296/3760.1= 78.7mV αλλά στην πραγματικότητα στην έξοδο έχω 82mV !!!

Οπότε η σχέση των τιμών PWMout και Vout δεν είναι γραμμική.

pstratos
22-03-17, 12:20
Μια πιο σωστή προσέγγιση αν έχεις ADC στο μΕ σου είναι να διαβάζεις την έξοδο του PWM και με ενα PID ή PI έλεγχο να μεταβάλεις το Duty ώστε η έξοδος να είναι πάντα η επιλεγμένη. Γιατί όμως έχεις τότο ακανόνιστη συμπεριφορά? Τραβάς φορτίο από την έξοδο? Έχεις κάποιο buffer (πχ τελεστικός?)

selectronic
22-03-17, 12:44
Το ξέρω ότι θα μπορούσα να μετράω την έξοδο, γι' αυτό και το έγραψα καθαρά στο αρχικό ποστ ότι "θέλω να υπολογίσω (όχι μετρήσω) στον κώδικά". Δεν λέω ότι το να μετρήσω την έξοδο χρησιμοποιώντας μία αναλογική είσοδο του Arduino δεν μπορεί να γίνει ή δεν είναι πιο "σωστό" ή θα δώσει καλύτερη ακρίβεια ή οτιδήποτε, απλώς δεν είναι αυτό που θέλω να κάνω αυτή τη στιγμή.
Δεν έχει σημασία αν μετράω PWM ή οτιδήποτε άλλο, αυτό που θέλω είναι να μάθω πως γίνεται και αν γίνετε εύκολα (χωρίς πίνακα στον κώδικα) να υπολογίσω την σχέση μεταξύ δύο τιμών που δεν είναι γραμμική.

Για την ιστορία το RC είναι διπλό, 4.7K/1uF + 3.9K/1uF (με την 4.7Κ σε σειρά το ρεύμα που τραβάω από το πιν είναι περίπου 1mA), και μετά ένας διαιρέτης 680Κ/56Κ, πάλι μεγάλες σε τιμή αντιστάσεις για μικρό ρεύμα (10μΑ στα 5V για τον διαιρέτη). Οι πυκνωτές μπορεί να είναι μεγάλοι σε τιμή, αλλά δεν με ενδιαφέρει η ταχύτητα (απόκρισή?) του RC σε αυτή τη φάση, με ενδιαφέρει πιο πολύ να έχει η έξοδος όσο το δυνατόν λιγότερη κυμάτωση...
Δεν υπάρχει κάτι μετά από εκεί, ακόμα είμαι στην φάση του σχεδιασμού. Πριν βάλω τον διαιρέτη, είχα δώσει τα 0-4.9V που βγαίνουν από το RC σε έναν OpAmp (LM324) σε συνδεσμολογία Voltage Follower και είχα τα αναμενόμενα 0-4.9V στην έξοδο αυτού.

Ευχαριστώ για τις απαντήσεις :)

FILMAN
22-03-17, 12:55
Η σχέση PWM και αναλογικής τάσης μετά το φιλτράρισμα είναι γραμμική. Αυτό που δεν ξέρω αν ισχύει στην περίπτωσή σου είναι, η έξοδος του μ/ε έχει την ίδια ικανότητα παροχής και απορρόφησης ρεύματος; Γιατί αν όχι, έχοντας περισσότερο ή λιγότερο χρόνο την έξοδο σε μια από τις δύο αυτές καταστάσεις, αλλοιώνεις την αναμενόμενη αναλογική τάση εξόδου. Επίσης κάποιες διαφορές στον πίνακα που συνέταξες είναι ομολογουμένως πολύ μικρές και μπορεί να οφείλονται και σε σφάλμα μετρήσεων (π.χ. 3763 vs 3756)

selectronic
22-03-17, 13:12
Η σχέση PWM και αναλογικής τάσης μετά το φιλτράρισμα είναι γραμμική. Αυτό που δεν ξέρω αν ισχύει στην περίπτωσή σου είναι, η έξοδος του μ/ε έχει την ίδια ικανότητα παροχής και απορρόφησης ρεύματος; Γιατί αν όχι, έχοντας περισσότερο ή λιγότερο χρόνο την έξοδο σε μια από τις δύο αυτές καταστάσεις, αλλοιώνεις την αναμενόμενη αναλογική τάση εξόδου. Επίσης κάποιες διαφορές στον πίνακα που συνέταξες είναι ομολογουμένως πολύ μικρές και μπορεί να οφείλονται και σε σφάλμα μετρήσεων (π.χ. 3763 vs 3756)

Χμ, δεν το ξέρω αυτό, είμαι και τελείως πρωτάρης με τον Arduino...

Πίστευα ότι για να δουλεύουν τα φίλτρα RC με τις PWM εξόδους του Arduino (το όποιο το έχω δει παντού στο Google), θα πρέπει η τάση στον πυκνωτή του RC να ξεφορτίζεται "από τον ίδιο δρόμο", δηλαδή μέσο του πιν, οπότε όταν ο παλμός είναι "λογικό μηδέν" να απορροφάει (sink) ρεύμα...
Πέρα από μια LCD δεν υπάρχει τίποτα άλλο πάνω στον Arduino αυτή τη στιγμή, οπότε το 1mA που ζητάω από το πιν είναι πολύ πιο κάτω από το μέγιστο που μπορεί να δώσει η πλακέτα.
Συμφωνώ ότι μικρές διαφορές είναι μέσα στο "σφάλμα μέτρησης", δεν έχω πρόβλημα για μικρές αποκλίσεις, δεν αναζητώ την τελειότητα, αλλά κάτω από περίπου 6-7% Duty Cycle ο υπολογισμός βγαίνει τελείως λάθος όπως είναι τώρα τα πράγματα...

Θα το παλέψω λίγο στο hardware κομμάτι λοιπόν σήμερα, να δω αν βελτιώνεται η κατάσταση με άλλες τιμές αντιστάσεων/πυκνωτών στο RC. Θα βάλω μικρότερη αντίσταση για 6-7mA ρεύμα και/ή μικρότερους πυκνωτές και θα δω..

Το RC-διαιρέτης είναι αυτό:
6915769159


Παρόλα αυτά, θα ήθελα να μάθω πως μπορείς να υπολογίσεις δύο τιμές που δεν έχουν γραμμική σχέση μεταξύ τους με τον Arduino, αν κάποιος ξέρει :)

selectronic
22-03-17, 13:27
Μέτρησα τώρα το ρεύμα που τραβάει ο διαιρέτης και αν πιστέψουμε ότι το πολύμετρό μου μπορεί να μετρήσει τόσο χαμηλά ρεύματα με ακρίβεια, ο διαιρέτης τραβάει από τίποτα (PWM=0) έως 6.60μΑ (PWM=Max)...
Μπορεί να χαλάνε την γραμμική συμπεριφορά του κυκλώματος αυτά τα δεκάδες μΑ ???

69160




EDIT:

Άλλαξα την αντίσταση μόνο του πρώτου RC από 4.7Κ σε 820Ω για να έχω ~6mΑ ρεύμα φόρτισης του πρώτου πυκνωτή (πριν ήταν μόνο 1mA), και έφτιαξε λίγο η "γραμμικότητα":

PWM __________19 ____31 ___111 ____498 ___1023
Duty Cycle% ___1.86 __3.0 ___10.8 ____48.6 __100%
mVolt _________6.73 _10.91 __39.45 __177.3 __363.4
PWM/mV ______2.82 __2.84 __ 2.81 ___ 2.80 ___2.81

Οπότε θα ξαναυπολογίσω αντιστάσεις/ρεύματα κτλ και μάλλον θα είμαι OK.

Πέραν αυτού, αν κάποιος ξέρει τον τύπο για αυτό που ζήτησα στο αρχικό ποστ, ας τον γράψει παρακαλώ και για εμένα αλλά και για άλλους στο μέλλον που ενδεχομένως θα διαβάσουν αυτό το θέμα ;)

Ευχαριστώ πολύ!

FILMAN
22-03-17, 14:03
Πίστευα ότι για να δουλεύουν τα φίλτρα RC με τις PWM εξόδους του Arduino (το όποιο το έχω δει παντού στο Google), θα πρέπει η τάση στον πυκνωτή του RC να ξεφορτίζεται "από τον ίδιο δρόμο", δηλαδή μέσο του πιν, οπότε όταν ο παλμός είναι "λογικό μηδέν" να απορροφάει (sink) ρεύμα...
Έτσι ακριβώς πρέπει να είναι.

Συμφωνώ ότι μικρές διαφορές είναι μέσα στο "σφάλμα μέτρησης", δεν έχω πρόβλημα για μικρές αποκλίσεις, δεν αναζητώ την τελειότητα, αλλά κάτω από περίπου 6-7% Duty Cycle ο υπολογισμός βγαίνει τελείως λάθος όπως είναι τώρα τα πράγματα...
Η ορθογώνια κυματομορφή σε αυτά τα επίπεδα ελεγμένη με παλμογράφο έχει τους σωστούς χρόνους; Διότι αν δεν τους έχει, επόμενο είναι και η αναλογική τάση να είναι με απόκλιση!

Θα το παλέψω λίγο στο hardware κομμάτι λοιπόν σήμερα, να δω αν βελτιώνεται η κατάσταση με άλλες τιμές αντιστάσεων/πυκνωτών στο RC. Θα βάλω μικρότερη αντίσταση για 6-7mA ρεύμα και/ή μικρότερους πυκνωτές και θα δω..

Το RC-διαιρέτης είναι αυτό:
6915769159
Με μικρότερες αντιστάσεις ίσως χειροτερέψει η κατάσταση...


Μέτρησα τώρα το ρεύμα που τραβάει ο διαιρέτης και αν πιστέψουμε ότι το πολύμετρό μου μπορεί να μετρήσει τόσο χαμηλά ρεύματα με ακρίβεια, ο διαιρέτης τραβάει από τίποτα (PWM=0) έως 6.60μΑ (PWM=Max)...
Μπορεί να χαλάνε την γραμμική συμπεριφορά του κυκλώματος αυτά τα δεκάδες μΑ ???

69160
Όχι, και όσο μεγάλο ρεύμα και να τράβαγε ο διαιρέτης δεν θα είχες πρόβλημα γραμμικότητας.

FILMAN
22-03-17, 14:09
EDIT:

Άλλαξα την αντίσταση μόνο του πρώτου RC από 4.7Κ σε 820Ω για να έχω ~6mΑ ρεύμα φόρτισης του πρώτου πυκνωτή (πριν ήταν μόνο 1mA), και έφτιαξε λίγο η "γραμμικότητα":

PWM __________19 ____31 ___111 ____498 ___1023
Duty Cycle% ___1.86 __3.0 ___10.8 ____48.6 __100%
mVolt _________6.73 _10.91 __39.45 __177.3 __363.4
PWM/mV ______2.82 __2.84 __ 2.81 ___ 2.80 ___2.81

Οπότε θα ξαναυπολογίσω αντιστάσεις/ρεύματα κτλ και μάλλον θα είμαι OK.
:confused1:
Δεν το βρίσκω λογικό
Οι δυο πυκνωτές του 1μF που έχεις βάλει είναι ηλεκτρολυτικοί; Αν ναι κάνε μια δοκιμή με την αρχική αντίσταση των 4.7kΩ και με πυκνωτές 1μF πολυεστερικούς

selectronic
22-03-17, 14:38
:confused1:
Δεν το βρίσκω λογικό
Οι δυο πυκνωτές του 1μF που έχεις βάλει είναι ηλεκτρολυτικοί; Αν ναι κάνε μια δοκιμή με την αρχική αντίσταση των 4.7kΩ και με πυκνωτές 1μF πολυεστερικούς

Τί να πω, δουλεύει... Μάλλον δεν είναι το πρόβλημα η αποφόρτιση του πυκνωτή αλλά το ότι σε χαμηλό Duty Cycle οι παλμοί είναι πολύ σύντομοι για να φορτίσουν τον πυκνωτή και "ο στραγγαλισμός" του 1mΑ με την 4.7Κ δεν βοήθαγε τα πράγματα...
Τώρα με πιο πολύ ρεύμα φόρτισης ο πυκνωτής φορτίζει πιο γρήγορα κατά την θετική περίοδο του παλμού από ότι ξεφορτίζει κατά την χαμηλή (μηδέν βόλτ) περίοδο, αυτό καταλαβαίνω ότι συμβαίνει εγώ τουλάχιστον :/

Στην σύντομη δοκιμή που έκανα τώρα με "Vout=PWMout / 2.81" στον κώδικα, ο υπολογισμός είναι αρκετά καλός, με λίγη δουλειά θα γίνει ακόμα καλύτερος πιστεύω:

6916169162

Οι πυκνωτές δεν είναι ηλεκτρολυτικοί, 1000nF/63V φιλμ είναι.
Παλμογράφο δεν έχω δυστυχώς, αλλά έχω ένα gadget παλμογράφο με bandwidth μόνο 20KHz ή 200KHz από ότι θυμάμαι, και με αυτό δουλεύω...

Περισσότερες φωτό εδώ (http://imgur.com/a/zK1iq)

pstratos
22-03-17, 15:18
αν εχεις φτάσει ενα ψηλο ικανοποιητικό επίπεδο υπάρχει το εξής κόλπο. Βάλε στο excel se στήλες έξοδο / είσοδο. Πλόταρε και έχεις την χαρακτηριστική του κυκλώματος. Με γραμμή τάσης βάλε να εμφανίζει και τον τύπο. Αυτόν τον τύπο εφάρμοσέ τον στον κόδικά σου. Αν δεν το έπιασες, το βράδυ θα επανέλθω....

pstratos
22-03-17, 16:59
Με 2,8139 έδωσε R^2 ~1 οπότε μάλλον είσαι οκ. Δηλ PWM(counts) = V(mV) * 2.8139 αντίστοιχα V(mV)= 0,35538 * PWM(counts)

selectronic
22-03-17, 19:07
αν εχεις φτάσει ενα ψηλο ικανοποιητικό επίπεδο υπάρχει το εξής κόλπο. Βάλε στο excel se στήλες έξοδο / είσοδο. Πλόταρε και έχεις την χαρακτηριστική του κυκλώματος. Με γραμμή τάσης βάλε να εμφανίζει και τον τύπο. Αυτόν τον τύπο εφάρμοσέ τον στον κόδικά σου. Αν δεν το έπιασες, το βράδυ θα επανέλθω....

Με 2,8139 έδωσε R^2 ~1 οπότε μάλλον είσαι οκ. Δηλ PWM(counts) = V(mV) * 2.8139 αντίστοιχα V(mV)= 0,35538 * PWM(counts)

Δυστυχώς δεν μιλάω κινέζικα XD

Δεν έχω δουλέψει ποτέ MS Excel και οτιδήποτε πέρα από το να βάλω τιμές σε "κελιά" μου ακούγονται κινέζικα...
Πάντως αυτό που έχεις γράψει το βλέπω ίδιο με αυτό που κάνω εγώ, δηλαδή στην μορφή "x * ψ = ω" ή "x / Ψ = ω", δεν βλέπω κάτι σε καμπύλη κάπου.
Εγώ είχα σκεφτεί ότι αν δεν βρω κάτι εδώ ή στο Google, θα έκανα κάτι στο στυλ:
if (PWMout <= 200) {Multiplier=2.7;}
if (PWMout > 200 && PWMout <= 400) {Multiplier=2.73;}
if (PWMout > 400 && PWMout <= 600) {Multiplier=2.75;}
.
.
Vout = PWMout / Multiplier
κτλ, αλλά εκτός ότι είναι κάπως άκομψη λύση, θα υπήρχε και σαφές "σκαλοπάτι" όταν θα άλλαζε η PWMout τιμή πχ από 199 σε 200.

Πάντως με 820Ω/1μF + 270Ω/1μF RC, ίδιο 680Κ/56Κ διαιρέτη και "Vout = PWMout / 2.8" δουλεύει μια χαρά (για εμένα) το κύκλωμα: γράφω στην LCD σε mV και έχω ακρίβεια μέχρι τον πρώτο δεκαδικό σε σχεδόν όλο το φάσμα. Δηλαδή από 3mv μέχρι τα ~290mV είναι στο +-100μV που είναι ΟΚ για εμένα.

pstratos
22-03-17, 22:34
Στειλε με πμ το mail σου να σου στειλω ενα αρχειο