Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 10718|Svar: 0

Zigbee Journey (6): Flere vigtige CC2430 grundeksperimenter - ADC enkeltprøvetagning

[Kopier link]
Opslået på 30/10/2014 23.20.31 | | | |
1. Forbindelse mellem øvre og nedre niveauer

I trådløse sensornetværk er det vigtigt at omdanne de analoge værdier af sensorerne til digitale størrelser for nem transmission og behandling. ADC (Analog-til-Digital Converter) bruges til at fuldføre denne konvertering.

I det forrige afsnit introducerede vi seriel portkommunikation mellem CC2430 og en PC. CC2430 har en temperatursensor indbygget, og dette afsnit vil implementere et simpelt eksperiment med on-chip temperaturovervågning baseret på det forrige afsnit: brug ADC'en til at konvertere spændingsværdien af den indbyggede temperatursensor til en digital størrelse, brug formlen til at beregne temperaturværdien, og send derefter temperaturværdien til PC'en gennem den serielle port og vise den.

2. ADC enkeltprøvetagning(1) Introduktion til eksperimentet

ADC'en bruges til at konvertere temperaturværdien på CC2430's on-chip temperatursensor, og temperaturværdien sendes til PC'en gennem den serielle port og vises.

(2) Programflowdiagram

(3) Eksperimentel kildekode og analyse/*
    Eksperimentel beskrivelse: In-chip temperaturopsamlingseksperimentet sender dataene til PC'en gennem seriel port 0
*/

#include

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

/*32M晶振初始化
-------------------------------------------------------*/
tomrumxtal_init(tomrum)
{
  SOV &= ~0x04;            //都上电
  mens(! (SØVN &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         Vælg en 32MHz krystaloscillator
  SØVN |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
tomrumled_init(tomrum)
{
  P1SEL =0x00;         P1 er den normale I/O-port
  P1DIR |=0x0F;         P1.0 P1.1 P1.2 P1.3 output
  
  led1 =1;
  led2 =1;
  led3 =1;
  led4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
tomrum  Uart0Init(Usigneret CharStopBits,Usigneret CharParitet)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    sæt til UART-tilstand og aktivér acceptoren
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| Paritet;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
tomrum  Uart0Send(Usigneret Chardata)
{
  mens(U0CSR&0x01);   //等待UART空闲时发送数据
  U0DBUF = data;
}

/*UART0发送字符串
-------------------------------------------------------*/
tomrumUart0SendString(Usigneret Char*s)
{
  mens(*s !=0)
    Uart0Send(*s++);
}

/*UART0接收数据
-------------------------------------------------------*/
Usigneret CharUart0Receive(tomrum)
{
  Usigneret Chardata;
  mens(! (U0CSR&0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF;
  Tilbagevendendata;
}

/*延时函数
-------------------------------------------------------*/
tomrumForsinkelse(Usigneret intn)
{
  Usigneret intJeg;
  for(i=0; i<n; i++);
  for(i=0; i<n; i++);
  for(i=0; i<n; i++);
  for(i=0; i<n; i++);
  for(i=0; i<n; i++);
}

/*得到实际温度值
-------------------------------------------------------*/
FloatgetTemperature(tomrum)
{
  Usigneret int  værdi;

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

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

/*主函数
-------------------------------------------------------*/
tomrumhoved(tomrum)
{
  CharJeg;
  FloatavgTemp;
  Usigneret Charoutput[]="";
        
  xtal_init();
  led_init();
  
  led1 =0;

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

  Uart0SendString("Hej CC2430 - TempSensor!");

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

For kodeindholdet for seriel portkommunikation, henvises til det foregående afsnit, som ikke vil blive forklaret her~

ADC'er involverer generelt 6 SFR'er:

ADCCON1For ADC generel kontrol, inklusive konverteringsflag, ADC trigger-metode, tilfældighedsgenerator
ADCCON2Konfiguration til kontinuerlig ADC-konvertering (dette eksperiment involverer ikke kontinuerlig ADC-konvertering og bruger derfor ikke denne SFR)
ADCCON3Konfiguration for en enkelt ADC-konvertering, inklusive valg af referencespænding, opløsning, konverteringskilde
ADCH[7:0]Det høje niveau af ADC-konverteringsresultatet, dvs. ADC [13:6]
ADCL[7:2]Det lave niveau af ADC-konverteringsresultatet, dvs. ADC [5:0]
ADCCFGAIN0~AIN7 med P0.0~P0.7 som ADC-input (denne SFR bruges ikke, fordi den indbyggede temperatursensor vælges som konverteringskilde i denne test og ikke involverer AIN0~AIN7)

(Bemærk: Se venligst CC2430 kinesiske manual for ovenstående SFR-detaljer)

Dernæst, lad os fokusere på detgetTempuraturefunktionen, som er nøglen til at få temperaturværdien:

(1) Først, konfigurer ADC'en til en enkelt prøvetagning: sæt ADCCON3=0x3E, vælg 1,25V som systemspænding, vælg 14-bit opløsning, og vælg CC2430 on-chip temperatursensoren som ADC-konverteringskilde

(2) Sæt derefter ADCCON1 |= 0x30 for at sætte ADC-triggermetoden til manuel (dvs. når ADCCON.6=1 starter ADC-overgangen)

(3) Lad så ADCCON1 |= 0x40 for at starte ADC-enkeltkonverteringen

(4) Brug udsagnet mens (!( ADCCON1 &0x80)) Vent på afslutningen på ADC-overgangen

(5) Konverteringsresultatet gemmes i ADCH[7:0] (8 bit højt), ADCH [7:2] (6 bit lavere) og passeres:

    værdi = ADCL >>2;
    værdi |= (ADCH <<6);   

Gem konverteringsresultatet i værdien

(6) Brug endelig formlentemperatur= værdi*0,06229-311,43, beregner temperaturværdien og returnerer

CC2430 Tips
Du må være forvirret over den sidste formel, hvorfor en engangsfunktion? Hvorfor har den en hældning på 0,06229 og en intercept på 211,43? OK, her er svaret:
Denne temperatursensor er placeret inde i CC2430-chippen, så beskrivelsen kan bestemt findes i manualen. Ganske rigtigt, jeg er herElektriske specifikationerDet relevante indhold findes i denne sektion, og skærmbilledet er som følger:
Denne tabel beskriver temperaturen (°C) på temperatursensoren i forhold til udgangsspændingen (V).
Første kig på den anden røde boks:Temperaturkoefficient。 "Koefficient"? Føles det ikke lidt? Se derefter på dens enhed: mV/°C, og du vil pludselig indse, at forholdet mellem temperatur og spænding er lineært~ Det vil sige:
hvor V er udgangsspændingen, T er temperaturværdien, og 2,45 er hældningen. Interceptet b skal bestemmes nedenfor.
Ved første øjekast vil vi ved den første røde boks se, at spændingen ved 0°C er 743mV, så b er lig med 743? Ellers, hvis du fortsætter med at kigge ned, vil du opdage, at dens absolutte fejl når op til 8°C! Når vi så ser til højre, vil vi se, at den allerede giver det mest egnede snit, dvs.: b=763, så der findes følgende formel:
OK, nu har vi allerede temperatursensorenIndtast temperatur TogUdgangsspænding VNæste skridt er at finde ADC'enIndgangsspænding VogOutputværdi N(dvs. konverteringsresultatet på 14 bit), og til sidst finde konverteringsformlen for N og T.
Konverteringsresultatet N er 14 bit, og når N=11 1111 1111 1111 (binært), bør udgangsspændingen være den maksimale værdi (dvs. referencespændingen 1,25V). Derfor har vi følgende proportionale forhold:
(Bemærk: Da outputtet af 14 bits er et binært komplement, er den 14. bit symbolbiten.) Så i absolutte termer er den effektive værdi kun 13 bits, altså 2 opdelt i potensen af 13)
Ved at kombinere de to formler kan forholdet mellem T og N udledes:
OVER~

Endelig et par ord om, hvorfor 64 cyklusser kræves pr. prøve. Da sensorer uundgåeligt er udsat for interferens eller tilfældige fejl ved temperaturmåling, er de data, sensorerne opnår, nogle gange overdrevne (for eksempel en pludselig ændring på 10°C og derefter en øjeblikkelig tilbagevenden til normalen). Men vi ved, at temperaturændringer er en integreret proces, og det er sjældent, at et stort spring sker på et øjeblik). Derfor bruger vi gennemsnitsmetoden til at reducere sådanne fejl.

(4) Eksperimentelle resultater

Først åbner du det serielt port-fejlfindingsværktøj, download derefter programmet og start det, og følgende skærm vil dukke op:

Temperaturen inde i filmen er omkring 14,5°C. Forfatteren mærker stuetemperaturen i sovesalen med sin krop, som er omkring lidt over 10°C. Indersiden af chippen skal have noget varme, så 14°C er stort set normalt~

Dette er slutningen på eksperimentet.

3. Konklusion

Denne artikel beskriver implementeringen af ADC single-sampling. I næste afsnit vil vi introducere en dataoverførselstilstandDMA(direkte hukommelsesadgang), det vil sige "direkte hukommelsesadgang". Perifere enheder som ADC/UART/RF-transceivere og hukommelsesenheder kan udveksles direkte under kontrol af "DMA-controlleren"Der kræves kun lidt CPU-indgriben, hvilket i høj grad forbedrer systemets samlede effektivitet.

Følg med!


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




Tidligere:Zigbee Journey (5): Flere vigtige CC2430 grundlæggende eksperimenter - seriel kommunikation
Næste:Zigbee Journey (7): Flere vigtige CC2430 grundeksperimenter - DMA-transmission
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com