|
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 eksperimendileADC-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: | ADCCON1 | ADC üldise juhtimise jaoks, sealhulgas teisenduse lõpulipp, ADC käivitamismeetod, juhuslike arvude generaator | | ADCCON2 | Konfiguratsioon 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] | | ADCCFG | AIN0~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äitedSa 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 tulemusedEsmalt 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õteSee 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++);
|