See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 10718|Vastuse: 0

Zigbee teekond (6): Mitmed olulised CC2430 põhieksperimendid – ADC ühe proovivõtu

[Kopeeri link]
Postitatud 30.10.2014 23:20:31 | | | |
1. Ülemiste ja alumiste korruste ühendamine

Juhtmevabades sensorivõrkudes on oluline muuta andurite analoogväärtused digitaalseks suuruseks, et neid oleks lihtne edastada ja töödelda. Selle teisenduse lõpuleviimiseks kasutatakse ADC-d (analoog-digitaalmuundur).

Eelmises osas tutvustasime seeriaporti kommunikatsiooni CC2430 ja PC vahel. CC2430-l on sisse ehitatud temperatuuriandur ning selles osas rakendatakse lihtsat eksperimenti kiibisisese temperatuuri jälgimise kohta, mis põhineb eelmisel jaotisel: kasuta ADC-d, et teisendada kiibisisese temperatuurianduri pingeväärtus digitaalseks suuruseks, kasuta valemit temperatuuri väärtuse arvutamiseks ning seejärel edasta see arvutile seriaalpordi kaudu ja kuva see.

2. ADC üksik proovivõtt(1) Sissejuhatus eksperimendile

ADC-d kasutatakse CC2430 kiibisisese temperatuurianduri temperatuuri väärtuse teisendamiseks ning temperatuuri väärtus saadetakse arvutisse seriaalpordi kaudu ja kuvatakse see ekraanil.

(2) Programmi vooskeem

(3) Eksperimentaalne lähtekood ja analüüs/*
    Eksperimentaalne kirjeldus: Kiibi sees olev temperatuuri mõõtmise katse saadab andmed arvutisse seriaalpordi 0 kaudu
*/

#include

#define juhtis1 P1_0
#define juhtis2 P1_1
#define juhtis3 P1_2
#define juhtis4 P1_3

/*32M晶振初始化
-------------------------------------------------------*/
tühixtal_init(tühi)
{
  UNI &= ~0x04;            //都上电
  samal ajal(! (UNI &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         Vali 32MHz kristall-ostsillaator
  UNI |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
tühiled_init(tühi)
{
  P1SEL =0x00;         P1 on tavaline I/O port
  P1DIR |=0x0F;         P1.0 P1.1 P1.2 P1.3 väljund
  
  led1 =1;
  led2 =1;
  led3 =1;
  led4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
tühi  Uart0Init(Allkirjastamata charStopBits,Allkirjastamata charPariteet)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    seadista UART-režiimile ja luba vastuvõtja
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| võrdsus;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
tühi  Uart0Send(Allkirjastamata charandmed)
{
  samal ajal(U0CSR&0x01);   //等待UART空闲时发送数据
  U0DBUF = andmed;
}

/*UART0发送字符串
-------------------------------------------------------*/
tühiUart0SendString(Allkirjastamata char*s)
{
  samal ajal(*s !=0)
    Uart0Send(*s++);
}

/*UART0接收数据
-------------------------------------------------------*/
Allkirjastamata charUart0Receive(tühi)
{
  Allkirjastamata charandmed;
  samal ajal(! (U0CSR&0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF;
  Tagasitulekandmed;
}

/*延时函数
-------------------------------------------------------*/
tühiViivitus(Allkirjastamata intn)
{
  Allkirjastamata inti;
  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(tühi)
{
  Allkirjastamata int  väärtus;

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

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

/*主函数
-------------------------------------------------------*/
tühipea(tühi)
{
  chari;
  floatavgTemp;
  Allkirjastamata charväljund[]="";
        
  xtal_init();
  led_init();
  
  led1 =0;

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

  Uart0SendString("Tere, CC2430 - TempSensor!");

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

Seriaalpordi suhtluse koodisisu kohta vaadake palun eelmist osa, mida siin ei selgitata~

ADC-d hõlmavad tavaliselt 6 SFR-i:

ADCCON1ADC üldise juhtimise jaoks, sealhulgas teisenduse lõpulipp, ADC käivitamismeetod, juhuslike arvude generaator
ADCCON2Konfiguratsioon pidevaks ADC teisendamiseks (see eksperiment ei hõlma pidevat ADC teisendamist ja seetõttu ei kasuta seda SFR-i)
ADCCON3Ühe ADC teisenduse konfiguratsioon, sealhulgas viitepinge, resolutsiooni ja teisendusallika valik
ADCH[7:0]ADC konverteerimise tulemuse kõrge tase, st ADC [13:6]
ADCL[7:2]ADC konverteerimise tulemuse madal tase, st ADC [5:0]
ADCCFGAIN0~AIN7, kus ADC sisendiks on P0.0~P0.7 (seda SFR-i ei kasutata, kuna kiibil olev temperatuuriandur on valitud teisendusallikaks ja ei hõlma AIN0~AIN7)

(Märkus: palun vaadake CC2430 hiina käsiraamatut ülaltoodud SFR detailide jaoks)

Järgmisena keskendume sellelegetTempuraturefunktsioon, mis on võtmetähtsusega temperatuuri väärtuse saamiseks:

(1) Esmalt seadista ADC ühe proovivõtu jaoks: määra ADCCON3=0x3E, vali süsteemi pingeks 1,25V, vali 14-bitine lahutusvõime ja vali kiibil olev CC2430 temperatuuriandur ADC teisendusallikaks

(2) Seejärel seadista ADCCON1 |= 0x30 ADC päästikumeetodi käsitsi seadistamiseks (st kui ADCCON.6=1, alusta ADC üleminekut)

(3) Siis olgu ADCCON1 |= 0x40 ADC ühekordse teisenduse alustamiseks

(4) Kasuta lauset, kui(!( ADCCON1 &0x80)) Oota ADC ülemineku lõppu

(5) Teisendustulemus salvestatakse ADCH[7:0] (8 bitti kõrge), ADCH [7:2] (6 bitti madalam) ja edastatakse:

    väärtus = ADCL >>2;
    väärtus |= (ADCH <<6);   

Salvesta teisendustulemus väärtuses

(6) Lõpuks kasuta valemittemperatuur= väärtus*0,06229-311,43, arvuta temperatuuri väärtus ja tagasta

CC2430 näpunäited
Sa pead olema viimase valemi pärast segaduses, miks ühekordne funktsioon? Miks on selle kalle 0,06229 ja ristlõige 211,43? Olgu, siin on vastus:
See temperatuuriandur asub CC2430 kiibi sees, seega on selle kirjeldus kindlasti kasutusjuhendis leitav. Ja tõepoolest, ma olen siinElektrilised spetsifikatsioonidAsjakohane sisu on leitav selles jaotises ning ekraanipilt on järgmine:
See tabel kirjeldab temperatuurianduri temperatuuri (°C) väljundpinge (V) suhtes.
Esimene pilk teisele punasele kastile:Temperatuuri koefitsient。 "Koefitsient"? Kas see ei tundu natuke? Siis vaata selle ühikut: mV/°C ja saad äkki aru, et temperatuuri ja pinge suhe on lineaarne~ See tähendab:
kus V on väljundpinge väärtus, T on temperatuuri väärtus ja 2,45 on kalle. Intercept b tuleb määrata allpool.
Esmapilgul leiame esimesest punasest kastist, et pinge 0°C juures on 743mV, seega b on võrdne 743-ga? Vastasel juhul, kui jätkad allavaatamist, näed, et absoluutne viga ulatub kuni 8°C-ni! Vaadates paremale, näeme, et see annab juba kõige sobivama lõikepunkti, st: b=763, seega on järgmine valem:
Olgu, nüüd on meil juba temperatuuriandur olemasSisesta temperatuur TjaVäljundpinge VJärgmine samm on leida ADCSisendpinge VjaVäljundväärtus N(st 14 biti teisendustulemus) ja lõpuks leida N ja T teisendusvalem.
Teisendustulemus N on 14 bitti ja kui N=11 1111 1111 1111 1111 (binaarne), peaks väljundpinge olema maksimaalne väärtus (st viitepinge 1,25V). Seega on meil järgmine proportsionaalne seos:
(Märkus: Kuna 14-bitise väljund on binaarne täiend, siis 14. bitt on sümbolibitt.) Seega absoluutväärtuses on efektiivne väärtus ainult 13 bitti, seega on see 2 astme võrra 13)
Kombineerides need kaks valemit, saab tuletada seose T ja N vahel:
ÜLE~

Lõpuks paar sõna selle kohta, miks iga valimi kohta on vaja 64 tsüklit. Kuna andurid puutuvad temperatuuri mõõtmisel paratamatult häirete või juhuslike vigade ohvriks, on sensorite poolt saadud andmeid mõnikord liialdatud (näiteks järsk 10°C muutus ja seejärel kohene normaalsuse taastumine). Aga me teame, et temperatuurimuutus on lahutamatu protsess ja harva juhtub suur hüpe hetkega). Seetõttu kasutame keskmist meetodit selliste vigade vähendamiseks.

(4) Eksperimentaalsed tulemused

Esmalt ava seriaalpordi silumistööriist, seejärel laadi programm alla ja käivita see, ning ilmub järgmine ekraan:

Filmi sees on temperatuur umbes 14,5°C. Autor tunneb oma kehaga ühiselamu toatemperatuuri, mis on veidi üle 10°C. Kiibi sisemus vajab natuke soojust, nii et 14°C on põhimõtteliselt normaalne~

See on eksperimendi lõpp.

3. Kokkuvõte

See artikkel kirjeldab ADC ühe valimi rakendamist. Järgmises osas tutvustame andmeedastuse režiimiDMA(otsene mälu ligipääs), see tähendab "otsene mälu ligipääs". Perifeerseid seadmeid, nagu ADC/UART/RF saatjaid ja mäluseadmeid, saab vahetada otse "DMA kontrolleri" juhtimise allVähe protsessori sekkumist on vaja, mis parandab oluliselt süsteemi üldist efektiivsust.

Jääge lainel!


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




Eelmine:Zigbee teekond (5): Mitmed olulised CC2430 põhieksperimendid – järjestikune side
Järgmine:Zigbee teekond (7): Mitmed olulised CC2430 põhieksperimendid – DMA ülekanne
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com