|
1. Σύνδεση του ανώτερου και του κατώτερου επιπέδου Στα ασύρματα δίκτυα αισθητήρων, είναι σημαντικό να μετατρέπονται οι αναλογικές τιμές των αισθητήρων σε ψηφιακές ποσότητες για εύκολη μετάδοση και επεξεργασία. Το ADC (Analog-to-Digital Converter) χρησιμοποιείται για την ολοκλήρωση αυτής της μετατροπής. Στην προηγούμενη ενότητα, παρουσιάσαμε την επικοινωνία σειριακής θύρας μεταξύ του CC2430 και ενός υπολογιστή. Το CC2430 έχει ενσωματωμένο έναν αισθητήρα θερμοκρασίας και αυτή η ενότητα θα εφαρμόσει ένα απλό πείραμα για την παρακολούθηση της θερμοκρασίας στο τσιπ με βάση την προηγούμενη ενότητα: χρησιμοποιήστε το ADC για να μετατρέψετε την τιμή τάσης του αισθητήρα θερμοκρασίας στο τσιπ σε ψηφιακή ποσότητα, χρησιμοποιήστε τον τύπο για να υπολογίσετε την τιμή θερμοκρασίας και, στη συνέχεια, μεταδώστε την τιμή θερμοκρασίας στον υπολογιστή μέσω της σειριακής θύρας και εμφανίστε την. 2. Μονή δειγματοληψία ADC(1) Εισαγωγή στο πείραμαΤο ADC χρησιμοποιείται για τη μετατροπή της τιμής θερμοκρασίας του αισθητήρα θερμοκρασίας CC2430 στο τσιπ και η τιμή θερμοκρασίας αποστέλλεται στον υπολογιστή μέσω της σειριακής θύρας και εμφανίζεται. (2) Διάγραμμα ροής προγράμματος
(3) Πειραματικός πηγαίος κώδικας και ανάλυση/*
Πειραματική περιγραφή: Το πείραμα απόκτησης θερμοκρασίας στο τσιπ στέλνει τα δεδομένα στον υπολογιστή μέσω της σειριακής θύρας 0
*/
#include
#define LED1 P1_0
#define LED2 P1_1
#define LED3 P1_2
#define LED4 P1_3
/*32M晶振初始化
-------------------------------------------------------*/
άκυροxtal_init(άκυρο)
{ ΥΠΝΟΣ &= ~0x04; //都上电
ενώ(! (ΥΠΝΟΣ &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Επιλέξτε έναν κρυσταλλικό ταλαντωτή 32 MHz ΥΠΝΟΣ |=0x04;
}
/*LED灯初始化
-------------------------------------------------------*/
άκυροled_init(άκυρο)
{ Ρ1ΣΕΛ =0x00; Το P1 είναι η κανονική θύρα εισόδου/εξόδου P1DIR |=0x0F; Έξοδος P1.0 P1.1 P1.2 P1.3
LED1 =1; LED2 =1; LED3 =1; LED4 =1;
}
/*UART0初始化
-------------------------------------------------------*/
άκυρο Uart0Init(ανυπόγραφο κάρβουνοStopBits,ανυπόγραφο κάρβουνοΙσοτιμία)
{ P0SEL |= 0x0C; //初始化UART0端口 PERCFG&= ~0x01; //选择UART0为可选位置一 U0CSR =0xC0; σε λειτουργία UART και ενεργοποιήστε τον αποδέκτη U0GCR =11; U0BAUD =216; //设置UART0波特率为115200bps U0UCR |= StopBits| Ισοτιμία; //设置停止位与奇偶校验
}
/*UART0发送字符
-------------------------------------------------------*/
άκυρο Uart0Αποστολή(ανυπόγραφο κάρβουνοδεδομένα)
{
ενώ(U0CSR&0x01); //等待UART空闲时发送数据 U0DBUF = δεδομένα·
}
/*UART0发送字符串
-------------------------------------------------------*/
άκυροUart0SendString(ανυπόγραφο κάρβουνο*ιθ)
{
ενώ(*s !=0) Uart0Send(*s++);
}
/*UART0接收数据
-------------------------------------------------------*/
ανυπόγραφο κάρβουνοUart0Receive(άκυρο)
{
ανυπόγραφο κάρβουνοδεδομένα·
ενώ(! (U0CSR&0x04));//查询是否收到数据,否则继续等待 δεδομένα=U0DBUF;
Επιστροφήδεδομένα·
}
/*延时函数
-------------------------------------------------------*/
άκυροΚαθυστέρηση(ανυπόγραφο Διεθνέςn)
{
ανυπόγραφο Διεθνέςi;
Για(i=0; i<n; i++);
Για(i=0; i<n; i++);
Για(i=0; i<n; i++);
Για(i=0; i<n; i++);
Για(i=0; i<n; i++);
}
/*得到实际温度值
-------------------------------------------------------*/
επιπλέουνgetTemperature(άκυρο)
{
ανυπόγραφο Διεθνές αξία;
ADCCON3 = (0x3E); //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
ADCCON1 |=0x30; //选择ADC的启动模式为手动 ADCCON1 |=0x40; Έναρξη μετατροπών AD
ενώ(! (ADCCON1 &0x80)); //等待ADC转化结束
τιμή = ADCL >>2; τιμή |= (ADCH <<6); //取得最终转化结果,存入value中
Επιστροφήαξία*0.06229-311.43; //根据公式计算出温度值
}
/*主函数
-------------------------------------------------------*/
άκυροmain(άκυρο)
{
κάρβουνοi;
επιπλέουνavgTemp;
ανυπόγραφο κάρβουνοέξοδος[]="";
xtal_init(); led_init();
LED1 =0;
Uart0Init(0x00, 0x00); //初始化串口:无奇偶校验,停止位为1位
Uart0SendString("Γεια σας CC2430 - TempSensor!");
ενώ(1) { LED1 =0; μέση θερμοκρασία =0;
Για(i =0; i <64; i++) { avgTemp += getTemperature(); avgTemp = avgTemp/2; //每采样1次,取1次平均值 }
output[0] = (ανυπόγραφο κάρβουνο)(avgTemp)/10 + 48; //十位 output[1] = (ανυπόγραφο κάρβουνο)(μέση θερμοκρασία)%10 + 48; //个位 output[2] ='.'; //小数点 output[3] = (ανυπόγραφο κάρβουνο)(avgTemp*10)%10+48; //十分位 output[4] = (ανυπόγραφο κάρβουνο)(avgTemp*100)%10+48; //百分位 έξοδος[5] =''; //字符串结束符
Uart0SendString(έξοδος); Uart0SendString("°C"); LED1 =1; //LED熄灭,表示转换结束,
Καθυστέρηση(20000); Καθυστέρηση(20000); Καθυστέρηση(20000); Καθυστέρηση(20000); Καθυστέρηση(20000); Καθυστέρηση(20000); Καθυστέρηση(20000); Καθυστέρηση(20000); Καθυστέρηση(20000); Καθυστέρηση(20000); }
}
Για το περιεχόμενο κώδικα της επικοινωνίας σειριακής θύρας, ανατρέξτε στην προηγούμενη ενότητα, η οποία δεν θα εξηγηθεί εδώ~ Τα ADC περιλαμβάνουν γενικά 6 SFR: | ADCCON1 | Για γενικό έλεγχο ADC, συμπεριλαμβανομένης της σημαίας τέλους μετατροπής, της μεθόδου ενεργοποίησης ADC, της γεννήτριας τυχαίων αριθμών | | ADCCON2 | Διαμόρφωση για συνεχή μετατροπή ADC (αυτό το πείραμα δεν περιλαμβάνει συνεχή μετατροπή ADC και επομένως δεν χρησιμοποιεί αυτό το SFR) | | ADCCON3 | Διαμόρφωση για μία μόνο μετατροπή ADC, συμπεριλαμβανομένης της επιλογής τάσης αναφοράς, ανάλυσης, πηγής μετατροπής | | ΑΔΧ[7:0] | Το υψηλό επίπεδο του αποτελέσματος μετατροπής ADC, δηλαδή ADC [13:6] | | ADCL[7:2] | Το χαμηλό επίπεδο του αποτελέσματος μετατροπής ADC, δηλαδή ADC [5:0] | | ADCCFG | AIN0~AIN7 με P0.0~P0.7 ως είσοδο ADC (αυτό το SFR δεν χρησιμοποιείται επειδή ο αισθητήρας θερμοκρασίας στο τσιπ έχει επιλεγεί ως πηγή μετατροπής σε αυτήν τη δοκιμή και δεν περιλαμβάνει AIN0~AIN7) |
(Σημείωση: Ανατρέξτε στο κινεζικό εγχειρίδιο CC2430 για τις παραπάνω λεπτομέρειες SFR) Στη συνέχεια, ας επικεντρωθούμε σε αυτόgetTempuratureλειτουργία, η οποία είναι το κλειδί για τη λήψη της τιμής θερμοκρασίας: (1) Αρχικά, διαμορφώστε το ADC για μία μόνο δειγματοληψία: ορίστε ADCCON3=0x3E, επιλέξτε 1.25 V ως τάση συστήματος, επιλέξτε ανάλυση 14 bit και επιλέξτε τον αισθητήρα θερμοκρασίας CC2430 στο τσιπ ως πηγή μετατροπής ADC (2) Στη συνέχεια, ρυθμίστε ADCCON1 |= 0x30 για να ρυθμίσετε τη μέθοδο ενεργοποίησης ADC σε μη αυτόματη (δηλαδή, όταν ADCCON.6=1, ξεκινήστε τη μετάβαση ADC) (3) Στη συνέχεια, αφήστε ADCCON1 |= 0x40 για να ξεκινήσει η μεμονωμένη μετατροπή ADC (4) Χρησιμοποιήστε τη δήλωση while(!( ADCCON1 &0x80)) Περιμένετε για το τέλος της μετάβασης ADC (5) Το αποτέλεσμα μετατροπής αποθηκεύεται σε ADCH[7:0] (ύψος 8 bit), ADCH [7:2] (6 bit χαμηλότερα) και περνάει: τιμή = ADCL >>2; τιμή |= (ADCH <<6);
Αποθηκεύστε το αποτέλεσμα μετατροπής στην τιμή (6) Τέλος, χρησιμοποιήστε τον τύποθερμοκρασία= τιμή*0,06229-311,43, υπολογίστε την τιμή θερμοκρασίας και επιστρέψτε Συμβουλές CC2430Πρέπει να σας προβληματίσει ο τελευταίος τύπος, γιατί μια εφάπαξ συνάρτηση; Γιατί έχει κλίση 0,06229 και τομή 211,43; Εντάξει, εδώ είναι η απάντηση: Αυτός ο αισθητήρας θερμοκρασίας βρίσκεται μέσα στο τσιπ CC2430, επομένως η περιγραφή του μπορεί σίγουρα να βρεθεί στο εγχειρίδιό του. Σίγουρα, είμαι εδώΗλεκτρικές προδιαγραφέςΤο σχετικό περιεχόμενο βρίσκεται σε αυτήν την ενότητα και το στιγμιότυπο οθόνης έχει ως εξής:
Αυτός ο πίνακας περιγράφει τη θερμοκρασία (°C) του αισθητήρα θερμοκρασίας σε σχέση με την τάση εξόδου (V). Πρώτη ματιά στο δεύτερο κόκκινο πλαίσιο:Συντελεστής θερμοκρασίας。 "Συντελεστής"; Δεν νιώθεις λίγο; Στη συνέχεια, κοιτάξτε τη μονάδα του: mV/°C, και ξαφνικά θα συνειδητοποιήσετε ότι η σχέση θερμοκρασίας και τάσης είναι γραμμική~ Δηλαδή: όπου V είναι η τιμή της τάσης εξόδου, T είναι η τιμή θερμοκρασίας και 2.45 είναι η κλίση. Το σημείο τομής b πρέπει να προσδιοριστεί παρακάτω. Με την πρώτη ματιά, θα βρούμε στο πρώτο κόκκινο κουτί ότι η τάση στους 0°C είναι 743mV, άρα το b είναι ίσο με 743; Διαφορετικά, αν συνεχίσετε να κοιτάτε προς τα κάτω, θα διαπιστώσετε ότι το απόλυτο σφάλμα του φτάνει έως και τους 8°C! Στη συνέχεια, κοιτάζοντας προς τα δεξιά, θα δούμε ότι παρέχει ήδη την καταλληλότερη τομή, δηλαδή: b=763, οπότε υπάρχει ο ακόλουθος τύπος: Εντάξει, τώρα έχουμε ήδη τον αισθητήρα θερμοκρασίαςΕισαγάγετε τη θερμοκρασία TκαιΤάση εξόδου VΤο επόμενο βήμα είναι να βρείτε το ADCΤάση εισόδου VκαιΤιμή εξόδου N(δηλαδή, το αποτέλεσμα μετατροπής των 14 bit) και τελικά βρείτε τον τύπο μετατροπής των N και T. Το αποτέλεσμα μετατροπής N είναι 14 bit και όταν N=11 1111 1111 1111 (δυαδικό), η τάση εξόδου πρέπει να είναι η μέγιστη τιμή (δηλαδή τάση αναφοράς 1.25V). Επομένως, έχουμε την ακόλουθη αναλογική σχέση:
(Σημείωση: Δεδομένου ότι η έξοδος των 14 bit είναι ένα δυαδικό συμπλήρωμα, το 14ο bit είναι το bit συμβόλου.) Έτσι, σε απόλυτες τιμές, η πραγματική τιμή είναι μόνο 13 bit, άρα είναι 2 στη δύναμη του 13) Συνδυάζοντας τους δύο τύπους, η σχέση μεταξύ T και N μπορεί να εξαχθεί: ΠΑΝΩ ΑΠΟ ~
Τέλος, λίγα λόγια για το γιατί απαιτούνται 64 κύκλοι ανά δείγμα. Επειδή οι αισθητήρες υπόκεινται αναπόφευκτα σε παρεμβολές ή τυχαία σφάλματα κατά τη μέτρηση της θερμοκρασίας, τα δεδομένα που λαμβάνονται από τους αισθητήρες είναι μερικές φορές υπερβολικά (για παράδειγμα, μια ξαφνική αλλαγή 10°C και στη συνέχεια μια άμεση επιστροφή στο κανονικό). Γνωρίζουμε όμως ότι η αλλαγή της θερμοκρασίας είναι μια αναπόσπαστη διαδικασία και είναι σπάνιο να συμβεί ένα μεγάλο άλμα σε μια στιγμή). Επομένως, χρησιμοποιούμε τη μέση μέθοδο για να μειώσουμε τέτοια σφάλματα. (4) Πειραματικά αποτελέσματαΑρχικά, ανοίξτε το εργαλείο εντοπισμού σφαλμάτων σειριακής θύρας, στη συνέχεια κατεβάστε το πρόγραμμα και ξεκινήστε το και θα εμφανιστεί η ακόλουθη οθόνη:
Η θερμοκρασία στο εσωτερικό της μεμβράνης είναι περίπου 14,5°C. Ο συγγραφέας αισθάνεται τη θερμοκρασία δωματίου του κοιτώνα με το σώμα του, η οποία είναι περίπου λίγο περισσότερο από 10°C. Το εσωτερικό του τσιπ πρέπει να πάρει λίγη θερμότητα, επομένως οι 14°C είναι βασικά φυσιολογικοί~ Αυτό είναι το τέλος του πειράματος. 3. ΣυμπέρασμαΑυτό το άρθρο περιγράφει την υλοποίηση της ατομικής δειγματοληψίας ADC. Στην επόμενη ενότητα, θα εισαγάγουμε μια λειτουργία μεταφοράς δεδομένωνDMA(άμεση πρόσβαση στη μνήμη), δηλαδή «άμεση πρόσβαση στη μνήμη». Περιφερειακές μονάδες όπως πομποδέκτες ADC/UART/RF και συσκευές μνήμης μπορούν να ανταλλάσσονται απευθείας υπό τον έλεγχο του "ελεγκτή DMA"Απαιτείται μικρή παρέμβαση της CPU, γεγονός που βελτιώνει σημαντικά τη συνολική απόδοση του συστήματος. Μείνετε συντονισμένοι! </n; i++); </n; i++); </n; i++); </n; i++); </n; i++);
|