|
1. Verbindung der oberen und unteren Ebenen In drahtlosen Sensornetzwerken ist es wichtig, die analogen Werte der Sensoren in digitale Größen umzuwandeln, um die Übertragung und Verarbeitung zu erleichtern. ADC (Analog-zu-Digital-Wandler) wird zur Durchführung dieser Umwandlung verwendet. Im vorherigen Abschnitt führten wir die serielle Portkommunikation zwischen dem CC2430 und einem PC ein. CC2430 hat einen Temperatursensor integriert, und dieser Abschnitt implementiert ein einfaches Experiment zur On-Chip-Temperaturüberwachung basierend auf dem vorherigen Abschnitt: Verwenden Sie den ADC, um den Spannungswert des On-Chip-Temperatursensors in eine digitale Größe umzuwandeln, verwenden Sie die Formel zur Berechnung des Temperaturwerts und senden Sie den Temperaturwert dann über den seriellen Anschluss an den PC und zeigen ihn an. 2. ADC-Einzelsampling(1) Einführung in das ExperimentDer ADC wird verwendet, um den Temperaturwert des CC2430-On-Chip-Temperatursensors umzuwandeln, und der Temperaturwert wird über den seriellen Anschluss an den PC gesendet und angezeigt. (2) Programmflussdiagramm
(3) Experimenteller Quellcode und Analyse/*
Experimentelle Beschreibung: Das In-Chip-Temperaturerfassungsexperiment sendet die Daten über den seriellen Anschluss 0 an den PC
*/
#include
#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*32M晶振初始化
-------------------------------------------------------*/
Leerextal_init(Leere)
{ SCHLAF &= ~0x04; //都上电
während(! (SCHLAF &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Wählen Sie einen 32-MHz-Kristalloszillator SCHLAF |=0x04;
}
/*LED灯初始化
-------------------------------------------------------*/
Leereled_init(Leere)
{ P1SEL =0x00; P1 ist der normale I/O-Port P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 Ausgang
led1 =1; led2 =1; led3 =1; led4 =1;
}
/*UART0初始化
-------------------------------------------------------*/
Leere Uart0Init(Unsigniert charStopBits,Unsigniert charParität)
{ P0SEL |= 0x0C; //初始化UART0端口 PERCFG&= ~0x01; //选择UART0为可选位置一 U0CSR =0xC0; auf den UART-Modus einstellen und den Akzeptanzor aktivieren U0GCR =11; U0BAUD =216; //设置UART0波特率为115200bps U0UCR |= StopBits| Parität; //设置停止位与奇偶校验
}
/*UART0发送字符
-------------------------------------------------------*/
Leere Uart0Send(Unsigniert charDaten)
{
während(U0CSR&0x01); //等待UART空闲时发送数据 U0DBUF = Daten;
}
/*UART0发送字符串
-------------------------------------------------------*/
LeereUart0SendString(Unsigniert char*s)
{
während(*s !=0) Uart0Send(*s++);
}
/*UART0接收数据
-------------------------------------------------------*/
Unsigniert charUart0Receive(Leere)
{
Unsigniert charDaten;
während(! (U0CSR&0x04));//查询是否收到数据,否则继续等待 data=U0DBUF;
RückgabeDaten;
}
/*延时函数
-------------------------------------------------------*/
LeereVerzögerung(Unsigniert Intn)
{
Unsigniert IntIch;
für(i=0; i<n; i++);
für(i=0; i<n; i++);
für(i=0; i<n; i++);
für(i=0; i<n; i++);
für(i=0; i<n; i++);
}
/*得到实际温度值
-------------------------------------------------------*/
schwebengetTemperature(Leere)
{
Unsigniert Int Wert;
ADCCON3 = (0x3E); //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
ADCCON1 |=0x30; //选择ADC的启动模式为手动 ADCCON1 |=0x40; AD-Umwandlungen einleiten
während(! (ADCCON1 &0x80)); //等待ADC转化结束
Wert = ADCL >>2; Wert |= (ADCH <<6); //取得最终转化结果,存入value中
RückgabeWert*0.06229-311.43; //根据公式计算出温度值
}
/*主函数
-------------------------------------------------------*/
Leeremain(Leere)
{
charIch;
schwebenavgTemp;
Unsigniert charoutput[]="";
xtal_init(); led_init();
led1 =0;
Uart0Init(0x00, 0x00); //初始化串口:无奇偶校验,停止位为1位
Uart0SendString("Hallo CC2430 - TempSensor!");
während(1) { led1 =0; avgTemp =0;
für(i =0; Ich <64; i++) { avgTemp += getTemperature(); avgTemp = avgTemp/2; //每采样1次,取1次平均值 }
Ausgabe[0] = (Unsigniert char)(avgTemp)/10 + 48; //十位 Ausgabe[1] = (Unsigniert char)(avgTemp)%10 + 48; //个位 Ausgabe[2] ='.'; //小数点 Ausgabe[3] = (Unsigniert char)(avgTemp*10)%10+48; //十分位 Ausgabe[4] = (Unsigniert char)(avgTemp*100)%10+48; //百分位 output[5] =''; //字符串结束符
Uart0SendString(output); Uart0SendString("°C"); led1 =1; //LED熄灭,表示转换结束,
Verzögerung(20000); Verzögerung(20000); Verzögerung(20000); Verzögerung(20000); Verzögerung(20000); Verzögerung(20000); Verzögerung(20000); Verzögerung(20000); Verzögerung(20000); Verzögerung(20000); }
}
Für den Codeinhalt der seriellen Port-Kommunikation siehe bitte den vorherigen Abschnitt, der hier nicht erklärt wird~ ADCs umfassen in der Regel 6 SFRs: | ADCCON1 | Für allgemeine ADC-Steuerung, einschließlich Conversion-Endflag, ADC-Trigger-Methode, Zufallszahlengenerator | | ADCCON2 | Konfiguration für kontinuierliche ADC-Umwandlung (dieses Experiment beinhaltet keine kontinuierliche ADC-Umwandlung und verwendet daher diese SFR nicht) | | ADCCON3 | Konfiguration für eine einzelne ADC-Umwandlung, einschließlich Auswahl der Referenzspannung, Auflösung und Umwandlungsquelle | | ADCH[7:0] | Das hohe Niveau des ADC-Umwandlungsergebnisses, also ADC [13:6] | | ADCL[7:2] | Das niedrige Niveau der ADC-Umwandlung, also ADC [5:0] | | ADCCFG | AIN0~AIN7 mit P0.0~P0.7 als ADC-Eingang (dieses SFR wird nicht verwendet, da der On-Chip-Temperatursensor als Umwandlungsquelle in diesem Test ausgewählt wird und AIN0~AIN7 nicht einbezieht) |
(Hinweis: Bitte beachten Sie das chinesische Handbuch CC2430 für die oben genannten SFR-Details.) Als Nächstes konzentrieren wir uns daraufgetTempuratureFunktion, die der Schlüssel zur Bestimmung des Temperaturwerts ist: (1) Zuerst konfigurieren Sie den ADC für eine einzelne Abtastung: Setzen Sie ADCCON3=0x3E, wählen Sie 1,25V als Systemspannung, wählen Sie 14-Bit-Auflösung und wählen Sie den CC2430-On-Chip-Temperatursensor als ADC-Konvertierungsquelle (2) Dann ADCCON1 |= 0x30 setzen, um die ADC-Triggermethode auf manuell zu stellen (d. h. wenn ADCCON.6=1 den ADC-Übergang startet) (3) Dann ADCCON1 |= 0x40, um die ADC-Einzelumwandlung zu starten (4) Verwenden Sie die Aussage während(!( ADCCON1 &0x80)) Warte auf das Ende des ADC-Übergangs (5) Das Konvertierungsergebnis wird in ADCH[7:0] (8 Bit hoch), ADCH [7:2] (6 Bit niedriger) gespeichert und übergeben: Wert = ADCL >>2; Wert |= (ADCH <<6);
Speichere das Umrechnungsergebnis im Wert (6) Schließlich verwenden Sie die FormelTemperatur= Wert*0,06229-311,43, berechnen Sie den Temperaturwert und geben Sie die Rückgabe zurück CC2430 TippsSie müssen von der letzten Formel verwundert sein, warum eine einmalige Funktion? Warum hat er eine Steigung von 0,06229 und einen Intercept von 211,43? Okay, hier ist die Antwort: Dieser Temperatursensor befindet sich im CC2430-Chip, daher ist seine Beschreibung sicherlich im Handbuch zu finden. Und tatsächlich, ich bin hierElektrische SpezifikationenDer relevante Inhalt findet sich in diesem Abschnitt, und der Screenshot ist wie folgt:
Diese Tabelle beschreibt die Temperatur (°C) des Temperatursensors in Bezug auf die Ausgangsspannung (V). Erster Blick auf das zweite rote Feld:Temperaturkoeffizient。 "Koeffizient"? Fühlt es sich nicht ein bisschen an? Betrachten Sie dann seine Einheit: mV/°C, und Sie werden plötzlich erkennen, dass das Verhältnis zwischen Temperatur und Spannung linear ist~ Das heißt: wobei V der Ausgangsspannungswert, T der Temperaturwert und 2,45 die Steigung ist. Der Abfangpunkt b muss unten bestimmt werden. Auf den ersten Blick stellen wir bei der ersten roten Box fest, dass die Spannung bei 0°C 743 mV beträgt, also b entspricht 743? Andernfalls werden Sie, wenn Sie weiter nach unten schauen, feststellen, dass der absolute Fehler bis zu 8°C erreicht! Wenn wir dann nach rechts schauen, sehen wir, dass es bereits den geeignetsten Schnittpunkt liefert, d.h.: b=763, also folgt folgende Formel: Okay, jetzt haben wir schon den TemperatursensorEintritt in Temperatur TundAusgangsspannung VDer nächste Schritt ist, den ADC zu findenEingangsspannung VundAusgabewert N(d. h. das Umrechnungsergebnis von 14 Bit) und schließlich die Umrechnungsformel von N und T zu finden. Das Umwandlungsergebnis N beträgt 14 Bits, und wenn N=11 1111 1111 1111 (binär), sollte die Ausgangsspannung der maximale Wert sein (d. h. Referenzspannung 1,25 V). Daher haben wir folgende proportionale Beziehung:
(Hinweis: Da die Ausgabe von 14 Bits ein binäres Komplement ist, ist das 14. Bit das Symbolbit.) Absolut betrachtet beträgt der effektive Wert also nur 13 Bits, also 2 in der Potenz von 13) Durch die Kombination der beiden Formeln lässt sich die Beziehung zwischen T und N ableiten: ENDE~
Abschließend ein paar Worte darüber, warum 64 Zyklen pro Stichprobe erforderlich sind. Da Sensoren bei der Temperaturmessung zwangsläufig Interferenzen oder zufälligen Fehlern unterliegen, werden die von den Sensoren gewonnenen Daten manchmal übertrieben (zum Beispiel eine plötzliche Änderung von 10°C und dann eine sofortige Rückkehr zum Normalwert). Aber wir wissen, dass Temperaturveränderung ein integraler Prozess ist und es selten ist, dass ein großer Sprung in einem Augenblick auftritt. Daher verwenden wir die Mittelwertmethode, um solche Fehler zu reduzieren. (4) VersuchsergebnisseÖffnen Sie zuerst das Debugging-Tool für serielle Ports, laden Sie das Programm herunter und starten es, und der folgende Bildschirm erscheint:
Die Temperatur im Inneren des Films beträgt etwa 14,5 °C. Der Autor spürt mit seinem Körper die Raumtemperatur des Schlafsaals, die etwa etwas mehr als 10°C beträgt. Das Innere des Chips muss etwas Wärme bekommen, also sind 14°C im Grunde normal~ Das ist das Ende des Experiments. 3. FazitDieser Artikel beschreibt die Implementierung von ADC Single-Sampling. Im nächsten Abschnitt stellen wir einen Datenübertragungsmodus vorDMA(direkter Speicherzugriff), also "direkter Speicherzugriff". Peripheriegeräte wie ADC/UART/RF-Transceiver und Speichergeräte können direkt unter der Steuerung des "DMA-Controllers" ausgetauscht werdenEs ist nur wenig CPU-Eingriff erforderlich., was die Gesamteffizienz des Systems erheblich verbessert. Bleiben Sie dran! </n; i++); </n; i++); </n; i++); </n; i++); </n; i++);
|