Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 10718|Antwort: 0

Zigbee Journey (6): Mehrere wichtige CC2430-Basisexperimente – ADC-Einzelsampling

[Link kopieren]
Veröffentlicht am 30.10.2014 23:20:31 | | | |
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 Experiment

Der 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:

ADCCON1Für allgemeine ADC-Steuerung, einschließlich Conversion-Endflag, ADC-Trigger-Methode, Zufallszahlengenerator
ADCCON2Konfiguration für kontinuierliche ADC-Umwandlung (dieses Experiment beinhaltet keine kontinuierliche ADC-Umwandlung und verwendet daher diese SFR nicht)
ADCCON3Konfiguration 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]
ADCCFGAIN0~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 Tipps
Sie 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. Fazit

Dieser 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++);




Vorhergehend:Zigbee Journey (5): Mehrere wichtige CC2430-Grundexperimente – serielle Kommunikation
Nächster:Zigbee Journey (7): Mehrere wichtige CC2430-Grundexperimente – DMA-Übertragung
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com