Σελίδα 2 από 9 ΠρώτηΠρώτη 1 2 3 4 ... ΤελευταίαΤελευταία
Εμφάνιση αποτελεσμάτων : 11 έως 20 από 81

Θέμα: Arduino:Πάλι μη-γραμμικότητα, κάνω κάτι λάθος?

  1. #11
    Μέλος
    Όνομα
    Γιάννης
    Εγγραφή
    May 2011
    Περιοχή
    Πέραμα
    Μηνύματα
    3.042

    Προεπιλογή

    Nemmesis την έχω κάνει την διαίρεση και ξέρω ότι ακόμα και αν δουλεύει 100% σαν 12bit το "κόλπο" με το oversample δεν θα έχω 10mV ακρίβεια, η τιμή των "10mV" είναι στο περίπου. Αυτό που είδα μετρώντας 0-1V είναι ότι αν πάω στα 0-50V μέσω διαιρέτη δεν θα έχω ~50mV ακρίβεια όπως θα έπρεπε θεωρητικά, αλλά κάπου στα 100mV, οπότε τα πχ 12.3V μπορεί να τα διαβάζει 12.2V ή 12.4V και αυτό είναι κομματάκι πολύ σφάλμα για εμένα... Θα προτιμούσα να γράφω στην LCD με δεύτερο δεκαδικό και να έχω τουλάχιστον 2-3 βήματα για 100mV, το οποίο θα γινόταν με 12bit πιστεύω.
    Ναι διάβασα τι κάνει η βιβλιοθήκη. Όχι όλο το pdf αλλά αρκετά για να καταλάβω (?) πως δουλεύει και το πως δεν δουλεύει αν δεν υπάρχει "θόρυβος" στο σήμα μέτρησης κτλ, που φυσικά θα έχω γιατί ότι φτιάξω θα είναι σε διάτρητη και όχι σε PCB διπλής όψεως με Ground Plane και τα συναφή.
    Ξαναλέω ότι είδα διαφορά στις μετρήσεις με την χρήση της βιβλιοθήκης.

    Ο λόγος που ξεκίνησα αυτό το thread όπως λέει και ο τίτλος είναι η μη-γραμμικότητα στην μέτρηση. Στο άλλο thread που είχα θέμα μη-γραμμικότητας ο FILMAN έγραψε ότι θα έπρεπε να έχω γραμμική σχέση και τελικά ήταν στο κύκλωμα (hardware) το πρόβλημα, έτσι και τώρα είπα ότι ίσως κάνω κάτι λάθος στον κώδικα (κύκλωμα ουσιαστικά δεν υπάρχει) αφού μόνο 1 μήνα εμπειρία έχω με τους Arduino και είπα "δεν ανεβάζω τον κώδικα και τις μετρήσεις που έχω μήπως κάποιος μου ανοίξει τα μάτια?"...


    Kernal Panic το link του έβαλες είναι ένα από τα 3-4 πιο χρήσιμα που βρήκα, ανάμεσα στα παααααρα πολλά που διάβασα στην φάση του Googlαρίσματος, που ήταν οι βδομάδες που περίμενα να παραλάβω τους Arduino από την Κίνα... Ιδιαίτερα το κομμάτι του "float voltage = ((float) rawADC + 0.5 ) / 1024.0 * Vref;" το έχω κάνει κλόπι-paste τελείως, ακριβώς αυτό χρησιμοποιώ! Σε αυτό το άρθρο είδα μεταξύ άλλων την μέθοδο του να προσθέτει μία "φιξ" τιμή στην "raw" μέτρηση του ADC: αυτός έχει "0.5" στον κώδικα, εγώ είχα "1.2" σε έναν Arduino και "2.0" σε άλλον, που είναι και στον κώδικα του πρώτου ποστ.
    Επίσης εκεί χρησιμοποιεί "1024" αντί του "1023", αλλά πάνω σε αυτό δεν βρήκα "σίγουρη" απάντηση όταν το έψαχνα: μισοί λέγανε 1024, και άλλοι τόσοι 1023... Η αλήθεια είναι ότι δεν θυμάμαι γιατί κατέληξα να χρησιμοποιώ 1024, μάλλον θα είχα καλύτερα αποτελέσματα με αυτό. Θα κάνω δοκιμή και με 1023 όμως, ίσως αυτό να βελτιώσει την γραμμικότητα!

    Σας ευχαριστώ για τις απαντήσεις

    0 Not allowed! Not allowed!

  2. #12
    Μέλος Το avatar του χρήστη Nemmesis
    Όνομα
    Παναγιωτης
    Εγγραφή
    Jun 2006
    Περιοχή
    Πτολεμαιδα
    Μηνύματα
    3.299

    Προεπιλογή

    τα 10bit "μετρανε" απο 0-1023 αρα εχουμε 1024 διακριτες τιμε... τοσο απλο ειναι... με το 1024 ειναι σωστο...

    0 Not allowed! Not allowed!
    φανατικος αντιαεικινηστης....
    δεν επιτρεπω την εξελιξη γιατι εχω πετρελαια...

  3. #13
    Μέλος Το avatar του χρήστη SProg
    Όνομα
    Σάββας
    Εγγραφή
    Mar 2014
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    2.612

    Προεπιλογή

    1023 ειναι το σωστο.


    Η μονη περιπτωση που θα σου χρειαζοταν το 1024 θα ηταν εαν ηθελες να βρεις το βημα.


    Προφανως το οτι το 1024 σε βολευει...δε σημαινει οτι ειναι το σωστο.

    -1 Not allowed! Not allowed!

  4. #14
    Μέλος Το avatar του χρήστη Fire Doger
    Όνομα
    Στέφανος
    Εγγραφή
    Jan 2015
    Περιοχή
    .
    Μηνύματα
    1.519

    Προεπιλογή

    value = (adc/1023)*Vref
    Αν το adc είναι ίσο με Vref σου επιστρέφει 1023. Στον παραπάνω τύπο το value θα είναι όντως ίσο με Vref. Αν είχαμε 1024 τότε το value θα ήταν μικρότερο.

    Δεν είμαι σίγουρος αν η πραγματική τιμή είναι + - (Vref/2048) δηλαδή + - το μισό ενώς βήματος ή το adc κάνει στρογγυλοποίηση μόνο πρός τα πάνω ή κάτω.

    0 Not allowed! Not allowed!

  5. #15
    Μέλος Το avatar του χρήστη Nemmesis
    Όνομα
    Παναγιωτης
    Εγγραφή
    Jun 2006
    Περιοχή
    Πτολεμαιδα
    Μηνύματα
    3.299

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από SavKok Εμφάνιση μηνυμάτων
    1023 ειναι το σωστο.


    Η μονη περιπτωση που θα σου χρειαζοταν το 1024 θα ηταν εαν ηθελες να βρεις το βημα.


    Προφανως το οτι το 1024 σε βολευει...δε σημαινει οτι ειναι το σωστο.
    καταρχάς δεν με βολέυει τίποτα και μάθε να γράφεις πιο σωστά... οκ? διαβασσε και λιγο για να μάθεις γιατι με το 1024 έχεις καλήτερα αποτελέσματα...

    http://www.electro-tech-online.com/t...-wrong.132570/

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη Nemmesis : 02-04-17 στις 19:15
    φανατικος αντιαεικινηστης....
    δεν επιτρεπω την εξελιξη γιατι εχω πετρελαια...

  6. Ένα μέλος ευχαρίστησε τον Nemmesis για αυτό το χρήσιμο μήνυμα:

    selectronic (03-04-17)

  7. #16
    Μέλος Το avatar του χρήστη SProg
    Όνομα
    Σάββας
    Εγγραφή
    Mar 2014
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    2.612

    Προεπιλογή

    Μαλλον δεν ξερεις να διαβαζεις, εγω ξερω και να διαβαζω και να γραφω.Επισης ξερω που και σε ποιον απανταω.


    Παράθεση Αρχικό μήνυμα από selectronic Εμφάνιση μηνυμάτων
    Επίσης εκεί χρησιμοποιεί "1024" αντί του "1023", αλλά πάνω σε αυτό δεν βρήκα "σίγουρη" απάντηση όταν το έψαχνα: μισοί λέγανε 1024, και άλλοι τόσοι 1023... Η αλήθεια είναι ότι δεν θυμάμαι γιατί κατέληξα να χρησιμοποιώ 1024, μάλλον θα είχα καλύτερα αποτελέσματα με αυτό.

    0 Not allowed! Not allowed!

  8. #17
    Μέλος Το avatar του χρήστη Nemmesis
    Όνομα
    Παναγιωτης
    Εγγραφή
    Jun 2006
    Περιοχή
    Πτολεμαιδα
    Μηνύματα
    3.299

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από SavKok Εμφάνιση μηνυμάτων
    Μαλλον δεν ξερεις να διαβαζεις, εγω ξερω και να διαβαζω και να γραφω.Επισης ξερω που και σε ποιον απανταω.

    δηλαδη θελεις να μου πεις οτι με το ποστ σου #13 δεν επαντας στο δικο μου #12 αλλα στου sele #11?? και άντε πες ειναι έτσι... μόνο εσύ ξέρεις που απαντάς εάν δεν βαλεις quote και επίσης όταν δεν υπάρχει quote στην ουσία δείχνεις να απαντάς στον προηγούμενο σου... και αφου ξέρεις να διαβάζεις, διάβεσε γιατι με το 1024 έχουμε μικρότερο error.. εσένα βολέυει το 1023 που δεν ειναι το σωστό ομως....

    0 Not allowed! Not allowed!
    φανατικος αντιαεικινηστης....
    δεν επιτρεπω την εξελιξη γιατι εχω πετρελαια...

  9. #18
    Μέλος
    Εγγραφή
    Nov 2007
    Μηνύματα
    1.459

    Προεπιλογή

    Βρήκα ενα παλιό (2005 παρακαλώ) projectaki με AVR και τον ενσωματωμένο ADC. Γράφω τα βασικά σημεία που έχουν να κάνουν με τάση

    #define AVER_CONST 200
    unsigned int adc_data;
    #define ADC_VREF_TYPE 0x00

    Εδώ του είπαμε να χρησιμοποιεί εξωτερική τάση αναφοράς (βαλαμε 2500 mV // δε θυμάμαι τι chipaki)

    // ADC interrupt service routine
    #pragma savereg-
    interrupt [ADC_INT] void adc_isr(void)
    {
    #asm
    push r30
    push r31
    #endasm
    // Read the ADC conversion result
    adc_data=ADCW;
    //PORTB.0=1;
    #asm
    pop r31
    pop r30
    #endasm
    }


    // Read the ADC conversion result
    // with noise canceling
    unsigned int read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input|ADC_VREF_TYPE;
    #asm
    in r30,mcucr
    sbr r30,__se_bit
    cbr r30,__sm_mask
    out mcucr,r30
    sleep
    cbr r30,__se_bit
    out mcucr,r30
    #endasm
    return adc_data;
    }

    O ADC διαβάζει βάσει του δικού του interrupt, ώστε να ελαχιστοποιήσουμε το θόρυβο. Δηλ όταν διαβάζει το ADC το AVR σταμάταγε ρολόγια, ΙΟ, uart κλπ.

    Εχουμε την εξης συνάρτηση, η οποία διαβάζει συνεχόμενα δείγματα και δίνει μέσο όρο. Το Ν μπορεί να είναι ~50-100


    int read_channel(char channel,int n)
    { unsigned long int sum;

    int i;
    int average;

    sum=0;
    for (i=0;i<n;i++)
    {
    read_adc(channel);
    sum=sum+adc_data;
    }
    average= sum/n;

    return average;
    }

    Θα χρειαστούμε και την συναρτηση μετατατροπής σε mVolts

    unsigned int mvolts (unsigned int adc)
    { int voltage;
    double mvolts1;
    double mult=2.4437927; //2500/1023 se mvolts
    mvolts1= mult* adc;
    voltage= (unsigned int)mvolts1;
    return voltage;}


    Οπότε στην main είχαμε (διαβαζαμε 4 κανάλια, με μεσο ορο δειγμάτων σε mVolts στις μεταβλητες V1,V2,V3,V4)

    for(i=0;i<4;i++) average[i]=0;
    while (1)
    {

    PORTB.0=1;
    delay_ms(200);
    PORTB.0=0;
    for(i=0;i<4;i++) average[i]= read_channel(i,AVER_CONST);

    V0=mvolts(average[0]);
    V1=mvolts(average[1]);
    V2=mvolts(average[2]);
    V3=mvolts(average[3]);





    Από οτι θυμάμαι μετά από 10+ χρόνια.......
    Τα ADC των AVR ήταν θορυβόδη... 10bit αλλά στην πραξη 9βιτ και αν.....
    Η εσωτερική τάση αναφοράς εξαρτώταν από την τάση τροφοδοσίας!!! Αναγκαστικά εξωτερική τάση αναφοράς, με τον δικό της μάλιστα regulator
    Ακόμα και οι τάσεις που διάβαζε το AVR εξαρτιώντουσαν από το φορτίο στα άλλα pin - εξόδους.
    Αρα για γλήγορες/χοντρες δουλειες με πατέντες κάτι κάνεις. Αν θες να γίνεις σοβαρός πας σε εξωτερικούς ADC /isp ή σε άλλες οικογένεις mcu

    1 Not allowed! Not allowed!

  10. #19
    Μέλος Το avatar του χρήστη SProg
    Όνομα
    Σάββας
    Εγγραφή
    Mar 2014
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    2.612

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από pstratos Εμφάνιση μηνυμάτων
    O ADC διαβάζει βάσει του δικού του interrupt, ώστε να ελαχιστοποιήσουμε το θόρυβο. Δηλ όταν διαβάζει το ADC το AVR σταμάταγε ρολόγια, ΙΟ, uart κλπ.
    Σωστα.Το αναφερει στα datasheet σαν Noise Reduction Sleep.

    0 Not allowed! Not allowed!

  11. #20
    Μέλος
    Όνομα
    Γιάννης
    Εγγραφή
    May 2011
    Περιοχή
    Πέραμα
    Μηνύματα
    3.042

    Προεπιλογή

    Από ότι καταλαβαίνω δεν θα έχω την ακρίβεια που θέλω απλώς μετρώντας με τον ενσωματωμένο ADC όπως πίστευα... :/
    Ακόμα θέλω όμως να φτιάξω το όργανο για το τροφοδοτικό με Arduino, γιατί εκτός από Βολτ και Αμπέρ θέλω να υπολογίζει και τα Βατ, οπότε μάλλον θα πρέπει να μάθω και πως δουλεύει η επικοινωνία με I2C/SPI και το κάνω με εξωτερικό ADC.

    Έχω είδη πάρει 16bit DACs να έχω να παίζω, έχει κάποιος να μου προτείνει κάποιο "απλό" ADC σε DIP πάντα, να δοκιμάσω να το δουλέψω?


    EDIT:
    Παράθεση Αρχικό μήνυμα από pstratos Εμφάνιση μηνυμάτων
    ...Η εσωτερική τάση αναφοράς εξαρτώταν από την τάση τροφοδοσίας!!! Αναγκαστικά εξωτερική τάση αναφοράς, με τον δικό της μάλιστα regulator...
    Από τα όσα βρήκα και διάβασα στον μαγευτικό κόσμο του internet, η εσωτερική ~1.1V Vref (για ΑΤmega32 είναι αρκετά σταθερή... Επίσης ένα "απλό" LM385 έχει 2% ακρίβεια ενώ ένα LT1086 Linear Regulator στα πχ 5V μπορεί να είναι και κάτω από 1%. Όχι ότι δεν υπάρχουν πολύ καλύτερα από το LM385 για αυτούς που δεν φτιάχνουν απλός ένα "LCD βολτόμετρο" και όχι ότι θα έχω εγώ 0.1% ακρίβεια an χρησιμοποιούσα το LT1086, αλλά αν το φορτίο είναι μικρό και σταθερό, ένα LT1086 δεν θα μπορούσε να κάνει για Vref, με τα χαρακτηριστικά που έχει (Line/Load/Thermal regulation, Ripple Rejection κτλ)... Αν είμαι λάθος παρακαλώ διορθώστε με, να μαθαίνω

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη selectronic : 02-04-17 στις 23:24

Σελίδα 2 από 9 ΠρώτηΠρώτη 1 2 3 4 ... ΤελευταίαΤελευταία

Παρόμοια Θέματα

  1. Εργαλείο πρεσαρίσματος UTP (Κάνω κάτι λάθος;)
    By fragment in forum Όργανα & Εξοπλισμός
    Απαντήσεις: 43
    Τελευταίο Μήνυμα: 12-01-13, 21:53
  2. Απαντήσεις: 2
    Τελευταίο Μήνυμα: 08-04-12, 11:54
  3. Λάθος IP σε PC. Τι να κάνω;
    By Hary Dee in forum Software Η/Υ
    Απαντήσεις: 20
    Τελευταίο Μήνυμα: 08-03-11, 13:51
  4. Μετρήσεις-Κάνω κάτι λάθος
    By ba99297 in forum Ερωτήσεις Αρχάριων
    Απαντήσεις: 5
    Τελευταίο Μήνυμα: 25-02-11, 23:00
  5. Σκέφτηκα κάτι.. Πώς θα το κάνω?
    By egmajo in forum Ερωτήσεις Αρχάριων
    Απαντήσεις: 23
    Τελευταίο Μήνυμα: 13-05-10, 20:01

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας