Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 10718|Antwoord: 0

Zigbee Journey (6): Verschillende belangrijke CC2430 basisexperimenten - ADC single sampling

[Link kopiëren]
Geplaatst op 30-10-2014 23:20:31 | | | |
1. Het verbinden van de boven- en benedenverdiepingen

In draadloze sensornetwerken is het belangrijk om de analoge waarden van de sensoren om te zetten in digitale grootheden voor gemakkelijke transmissie en verwerking. ADC (Analog-to-Digital Converter) wordt gebruikt om deze conversie te voltooien.

In de vorige sectie introduceerden we seriële poortcommunicatie tussen de CC2430 en een pc. CC2430 heeft een temperatuursensor ingebouwd, en deze sectie zal een eenvoudig experiment uitvoeren voor on-chip temperatuurmonitoring gebaseerd op de vorige sectie: gebruik de ADC om de spanningswaarde van de on-chip temperatuursensor om te zetten in een digitale grootheid, gebruik de formule om de temperatuurwaarde te berekenen en stuur vervolgens de temperatuurwaarde via de seriële poort naar de pc om deze weer te geven.

2. ADC single sampling(1) Inleiding tot het experiment

De ADC wordt gebruikt om de temperatuurwaarde van de CC2430 on-chip temperatuursensor om te zetten, en de temperatuurwaarde wordt via de seriële poort naar de pc gestuurd en weergegeven.

(2) Programmastroomdiagram

(3) Experimentele broncode en analyse/*
    Experimentele beschrijving: Het in-chip temperatuuropname-experiment stuurt de gegevens via seriële poort 0 naar de pc
*/

#include

#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3

/*32M晶振初始化
-------------------------------------------------------*/
leegtextal_init(leegte)
{
  SLAAP &= ~0x04;            //都上电
  terwijl(! (SLAAP &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         Kies een 32MHz kristaloscillator.
  SLAAP |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
leegteled_init(leegte)
{
  P1SEL =0x00;         P1 is de normale I/O-poort
  P1DIR |=0x0F;         P1.0 P1.1 P1.2 P1.3 uitgang
  
  led1 =1;
  led2 =1;
  led3 =1;
  led4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
leegte  Uart0Init(Onondertekend charStopBits,Onondertekend charPariteit)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    Zet hem in op UART-modus en schakel de acceptor in
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| Pariteit;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
leegte  Uart0Send(Onondertekend chargegevens)
{
  terwijl(U0CSR&0x01);   //等待UART空闲时发送数据
  U0DBUF = data;
}

/*UART0发送字符串
-------------------------------------------------------*/
leegteUart0SendString(Onondertekend char*s)
{
  terwijl(*s !=0)
    Uart0Send(*s++);
}

/*UART0接收数据
-------------------------------------------------------*/
Onondertekend charUart0Receive(leegte)
{
  Onondertekend chardata;
  terwijl(! (U0CSR&0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF;
  Terugkeerdata;
}

/*延时函数
-------------------------------------------------------*/
leegteVertraging(Onondertekend intn)
{
  Onondertekend intIk;
  voor(i=0; i<n; i++);
  voor(i=0; i<n; i++);
  voor(i=0; i<n; i++);
  voor(i=0; i<n; i++);
  voor(i=0; i<n; i++);
}

/*得到实际温度值
-------------------------------------------------------*/
FloatgetTemperature(leegte)
{
  Onondertekend int  waarde;

  ADCCON3 = (0x3E);                  //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
   
  ADCCON1 |=0x30;                    //选择ADC的启动模式为手动
  ADCCON1 |=0x40;                    Start AD-conversies            
   
  terwijl(! (ADCCON1 &0x80));           //等待ADC转化结束

  waarde = ADCL >>2;
  waarde |= (ADCH <<6);               //取得最终转化结果,存入value中
  
  TerugkeerWaarde*0.06229-311.43;        //根据公式计算出温度值
}

/*主函数
-------------------------------------------------------*/
leegtehoofd(leegte)
{
  charIk;
  FloatavgTemp;
  Onondertekend charoutput[]="";
        
  xtal_init();
  led_init();
  
  led1 =0;

  Uart0Init(0x00, 0x00);   //初始化串口:无奇偶校验,停止位为1位

  Uart0SendString("Hallo CC2430 - TempSensor!");

  terwijl(1)
  {
    led1 =0;
    avgTemp =0;
    voor(i =0; Ik <64; i++)
    {
      avgTemp += getTemperature();
      avgTemp = avgTemp/2;            //每采样1次,取1次平均值
    }
   
    output[0] = (Onondertekend char(avgTemp)/10 + 48;         //十位
    output[1] = (Onondertekend char)(avgTemp)%10 + 48;         //个位
    output[2] ='.';                                       //小数点
    output[3] = (Onondertekend char(avgTemp*10)%10+48;         //十分位
    output[4] = (Onondertekend char(avgTemp*100)%10+48;        //百分位
    output[5] ='';                                      //字符串结束符
   
    Uart0SendString(output);
    Uart0SendString("°C");
    led1 =1;                          //LED熄灭,表示转换结束,
   
    Vertraging(20000);
    Vertraging(20000);
    Vertraging(20000);
    Vertraging(20000);
    Vertraging(20000);
    Vertraging(20000);
    Vertraging(20000);
    Vertraging(20000);
    Vertraging(20000);
    Vertraging(20000);
  }
}

Voor de code-inhoud van seriële poortcommunicatie, raadpleeg de vorige sectie, die hier niet wordt uitgelegd~

ADC's bestaan doorgaans uit 6 SFR's:

ADCCON1Voor algemene controle over ADC's, inclusief conversie-eindvlag, ADC-triggermethode, willekeurige getallengenerator
ADCCON2Configuratie voor continue ADC-conversie (dit experiment omvat geen continue ADC-conversie en gebruikt daarom deze SFR niet)
ADCCON3Configuratie voor een enkele ADC-conversie, inclusief selectie van referentiespanning, resolutie, conversiebron
ADCH[7:0]Het hoge niveau van de ADC-conversie, oftewel ADC [13:6]
ADCL[7:2]Het lage niveau van het ADC-conversieresultaat, d.w.z. ADC [5:0]
ADCCFGAIN0~AIN7 met P0.0~P0.7 als ADC-ingang (deze SFR wordt niet gebruikt omdat de on-chip temperatuursensor als conversiebron wordt geselecteerd in deze test en niet AIN0~AIN7 betreft)

(Opmerking: Raadpleeg de CC2430 Chinese handleiding voor bovenstaande SFR-details)

Laten we ons er vervolgens op richten.getTempuraturefunctie, die de sleutel is tot het verkrijgen van de temperatuurwaarde:

(1) Eerst configureer je de ADC voor een enkele sampling: stel ADCCON3=0x3E in, selecteer 1,25V als systeemspanning, selecteer 14-bits resolutie en selecteer de CC2430 on-chip temperatuursensor als ADC-conversiebron

(2) Stel dan ADCCON1 |= 0x30 om de ADC-triggermethode handmatig te zetten (d.w.z. wanneer ADCCON.6=1 de ADC-overgang start)

(3) Laat dan ADCCON1 |= 0x40 om de ADC enkelconversie te starten

(4) Gebruik de verklaring terwijl(!( ADCCON1 &0x80)) Wacht op het einde van de ADC-overgang

(5) Het conversieresultaat wordt opgeslagen in ADCH[7:0] (8 bits hoog), ADCH [7:2] (6 bits lager), en doorgegeven:

    waarde = ADCL >>2;
    waarde |= (ADCH <<6);   

Sla het conversieresultaat op in de waarde

(6) Gebruik tenslotte de formuletemperatuur= waarde*0,06229-311,43, bereken de temperatuurwaarde en geef terug

CC2430 Tips
Je moet verbaasd zijn over de laatste formule, waarom een eenmalige functie? Waarom heeft het een helling van 0,06229 en een interceptie van 211,43? Oké, hier is het antwoord:
Deze temperatuursensor bevindt zich in de CC2430-chip, dus de beschrijving is zeker te vinden in de handleiding. En inderdaad, ik ben erElektrische specificatiesDe relevante inhoud is te vinden in deze sectie, en de screenshot is als volgt:
Deze tabel beschrijft de temperatuur (°C) van de temperatuursensor in relatie tot de uitgangsspanning (V).
Eerste blik op het tweede rode vakje:Temperatuurcoëfficiënt。 "Coëfficiënt"? Voelt het niet een beetje aan? Kijk dan naar de eenheid: mV/°C, en je zult plotseling beseffen dat de relatie tussen temperatuur en spanning lineair is~ Dat wil zeggen:
waarbij V de uitgangsspanning is, T de temperatuurwaarde en 2,45 de helling. De interceptie b moet hieronder worden bepaald.
Op het eerste gezicht zien we bij het eerste rode doosje dat de spanning bij 0°C 743mV is, dus b is gelijk aan 743? Anders, als je blijft kijken, zul je zien dat de absolute fout wel 8°C kan bereiken! Dan kijken we naar rechts en zien dat deze al het meest geschikte intercept oplevert, namelijk: b=763, dus er is de volgende formule:
Oké, nu hebben we de temperatuursensor alVoer temperatuur T inenUitgangsspanning VDe volgende stap is het vinden van de ADCIngangsspanning VenOutputwaarde N(d.w.z. het conversieresultaat van 14 bits), en ten slotte de conversieformule van N en T vinden.
Het conversieresultaat N is 14 bits, en wanneer N=11 1111 1111 1111 (binair), moet de uitgangsspanning de maximale waarde zijn (d.w.z. referentiespanning 1,25V). Daarom hebben we de volgende evenredige relatie:
(Opmerking: Aangezien de uitvoer van 14 bits een binair complement is, is de 14e bit de symboolbit.) Dus in absolute termen is de effectieve waarde slechts 13 bits, dus 2 tot de macht 13)
Door de twee formules te combineren kan de relatie tussen T en N worden afgeleid:
OVER~

Tot slot een paar woorden over waarom 64 cycli per steekproef vereist zijn. Omdat sensoren onvermijdelijk gevoelig zijn voor interferentie of willekeurige fouten bij het meten van de temperatuur, worden de door sensoren verkregen gegevens soms overdreven (bijvoorbeeld een plotselinge verandering van 10°C en vervolgens een directe terugkeer naar normaal). Maar we weten dat temperatuurverandering een integraal proces is, en het is zeldzaam dat er in één oogwenk een grote sprong plaatsvindt). Daarom gebruiken we de gemiddelde methode om dergelijke fouten te verminderen.

(4) Experimentele resultaten

Open eerst de seriële poort-debugtool, download het programma en start het, en het volgende scherm verschijnt:

De temperatuur binnenin de film is ongeveer 14,5°C. De auteur voelt de kamertemperatuur van de slaapzaal met zijn lichaam, die iets meer dan 10°C is. De binnenkant van de chip moet wat warmte krijgen, dus 14°C is eigenlijk normaal~

Dit is het einde van het experiment.

3. Conclusie

Dit artikel beschrijft de implementatie van ADC single-sampling. In de volgende sectie introduceren we een datatransfermodusDMA(directe geheugentoegang), dat wil zeggen, "directe geheugentoegang". Randapparatuur zoals ADC/UART/RF-transceivers en geheugenapparaten kunnen direct worden uitgewisseld onder controle van de "DMA-controller"Er is weinig CPU-interventie nodig, wat de algehele efficiëntie van het systeem aanzienlijk verbetert.

Blijf op de hoogte!


</n; i++);
</n; i++);
</n; i++);
</n; i++);
</n; i++);




Vorig:Zigbee Journey (5): Verschillende belangrijke CC2430 basisexperimenten - seriële communicatie
Volgend:Zigbee Journey (7): Verschillende belangrijke CC2430 basisexperimenten - DMA-transmissie
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com