|
1. Prepojenie hornej a dolnej úrovne V bezdrôtových senzorových sieťach je dôležité prevádzať analógové hodnoty senzorov na digitálne veličiny pre jednoduchý prenos a spracovanie. Na dokončenie tejto konverzie sa používa ADC (analógovo-digitálny prevodník). V predchádzajúcej časti sme zaviedli komunikáciu cez sériový port medzi CC2430 a PC. CC2430 má vo vnútri zabudovaný teplotný senzor a táto časť implementuje jednoduchý experiment s monitorovaním teploty na čipe založený na predchádzajúcej časti: použite ADC na prevod hodnoty napätia z teplotného senzora na čipe na digitálnu veličinu, použite vzorec na výpočet teploty a potom preneste teplotnú hodnotu PC cez sériový port a zobrazí ju. 2. Jednorazové vzorkovanie ADC(1) Úvod do experimentuADC sa používa na konverziu teplotnej hodnoty snímača teploty CC2430 na čipe a hodnota teploty sa posiela do PC cez sériový port a zobrazuje sa. (2) Schéma toku programu
(3) Experimentálny zdrojový kód a analýza/*
Experimentálny popis: Experiment na meranie teploty v čipe posiela dáta do PC cez sériový port 0
*/
#include
#define viedol1 P1_0
#define LED2 P1_1
#define LED3 P1_2
#define Lead4 P1_3
/*32M晶振初始化
-------------------------------------------------------*/
prázdnotaxtal_init(prázdnota)
{ SPAJ &= ~0x04; //都上电
zatiaľ čo(! (SLEEP &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Vyberte 32MHz kryštálový oscilátor SPAK |=0x04;
}
/*LED灯初始化
-------------------------------------------------------*/
prázdnotaled_init(prázdnota)
{ P1SEL =0x00; P1 je bežný I/O port P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 výstup
led1 =1; led2 =1; LED3 =1; LED4 =1;
}
/*UART0初始化
-------------------------------------------------------*/
prázdnota Uart0Init(nepodpísané charStopBits,nepodpísané charParita)
{ P0SEL |= 0x0C; //初始化UART0端口 PERCFG&= ~0x01; //选择UART0为可选位置一 U0CSR =0xC0; nastaviť režim UART a povoliť akceptor U0GCR =11; U0BAUD =216; //设置UART0波特率为115200bps U0UCR |= StopBits| Parita; //设置停止位与奇偶校验
}
/*UART0发送字符
-------------------------------------------------------*/
prázdnota Uart0Send(nepodpísané chardáta)
{
zatiaľ čo(U0CSR&0x01); //等待UART空闲时发送数据 U0DBUF = dáta;
}
/*UART0发送字符串
-------------------------------------------------------*/
prázdnotaUart0SendString(nepodpísané char*s)
{
zatiaľ čo(*s !=0) Uart0Send(*s++);
}
/*UART0接收数据
-------------------------------------------------------*/
nepodpísané charUart0Receive(prázdnota)
{
nepodpísané chardáta;
zatiaľ čo(! (U0CSR&0x04));//查询是否收到数据,否则继续等待 data=U0DBUF;
návratdáta;
}
/*延时函数
-------------------------------------------------------*/
prázdnotaOneskorenie(nepodpísané intn)
{
nepodpísané inti;
pre(i=0; i<n; i++);
pre(i=0; i<n; i++);
pre(i=0; i<n; i++);
pre(i=0; i<n; i++);
pre(i=0; i<n; i++);
}
/*得到实际温度值
-------------------------------------------------------*/
PlavákgetTemperature(prázdnota)
{
nepodpísané int hodnota;
ADCCON3 = (0x3E); //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
ADCCON1 |=0x30; //选择ADC的启动模式为手动 ADCCON1 |=0x40; Spustenie konverzií AD
zatiaľ čo(! (ADCCON1 &0x80)); //等待ADC转化结束
hodnota = ADCL >>2; hodnota |= (ADCH <<6); //取得最终转化结果,存入value中
návratHodnota*0.06229-311.43; //根据公式计算出温度值
}
/*主函数
-------------------------------------------------------*/
prázdnotamain(prázdnota)
{
chari;
PlavákavgTemp;
nepodpísané charoutput[]="";
xtal_init(); led_init();
led1 =0;
Uart0Init(0x00, 0x00); //初始化串口:无奇偶校验,停止位为1位
Uart0SendString("Ahoj CC2430 - TempSensor!");
zatiaľ čo(1) { led1 =0; avgTemp =0;
pre(i =0; i <64; i++) { avgTemp += getTemperature(); avgTemp = avgTemp/2; //每采样1次,取1次平均值 }
Výstup[0] = (nepodpísané char)(avgTemp)/10 + 48; //十位 Výstup[1] = (nepodpísané char)(avgTemp)%10 + 48; //个位 Výstup[2] ='.'; //小数点 Výstup[3] = (nepodpísané char)(avgTemp*10)%10+48; //十分位 Výstup[4] = (nepodpísané char)(avgTemp*100)%10+48; //百分位 výstup[5] =''; //字符串结束符
Uart0SendString(output); Uart0SendString("°C"); led1 =1; //LED熄灭,表示转换结束,
Oneskorenie(20000); Oneskorenie(20000); Oneskorenie(20000); Oneskorenie(20000); Oneskorenie(20000); Oneskorenie(20000); Oneskorenie(20000); Oneskorenie(20000); Oneskorenie(20000); Oneskorenie(20000); }
}
Pre kódový obsah sériovej portovej komunikácie sa prosím pozrite na predchádzajúcu sekciu, ktorá tu nebude vysvetlená~ ADC zvyčajne zahŕňajú 6 SFR: | ADCCON1 | Pre všeobecnú kontrolu ADC, vrátane koncovej vlajky konverzie, metódy spúšťania ADC, generátora náhodných čísel | | ADCCON2 | Konfigurácia pre kontinuálnu konverziu ADC (tento experiment nezahŕňa kontinuálnu konverziu ADC a preto nepoužíva tento SFR) | | ADCCON3 | Konfigurácia pre jednu konverziu ADC, vrátane výberu referenčného napätia, rozlíšenia, zdroja konverzie | | ADCH[7:0] | Vysoká úroveň konverzie ADC, teda ADC [13:6] | | ADCL[7:2] | Nízka úroveň konverzie ADC, teda ADC [5:0] | | ADCCFG | AIN0~AIN7 s P0.0~P0.7 ako vstupom ADC (tento SFR sa nepoužíva, pretože v tomto teste je ako zdroj konverzie zvolený teplotný senzor na čipe a nezahŕňa AIN0~AIN7) |
(Poznámka: Pre vyššie uvedené podrobnosti o SFR si pozrite čínsky manuál CC2430) Ďalej sa na to zamerajmegetTempuraturefunkcie, ktorá je kľúčom k získaniu hodnoty teploty: (1) Najprv nakonfigurujte ADC pre jedno vzorkovanie: nastavte ADCCON3=0x3E, vyberte 1,25V ako systémové napätie, vyberte 14-bitové rozlíšenie a ako zdroj konverzie ADC vyberte teplotný senzor CC2430 na čipe (2) Potom nastavte ADCCON1 |= 0x30 na manuálne nastavenie metódy ADC (t. j. keď ADCCON.6=1 spustite prechod ADC) (3) Potom nechajme ADCCON1 |= 0x40 na začiatok jednorazovej konverzie ADC (4) Použi vetu while(!( ADCCON1 &0x80)) Počkajte na koniec prechodu na ADC (5) Výsledok konverzie sa uloží do ADCH[7:0] (8 bitov vysoký), ADCH [7:2] (o 6 bitov nižší) a odovzdaný: hodnota = ADCL >>2; hodnota |= (ADCH <<6);
Uložiť výsledok konverzie do hodnoty (6) Nakoniec použite tento vzorecteplota= hodnota*0,06229-311,43, vypočítajte teplotu a vráťte Tipy na CC2430Musíte byť zmätení posledným vzorcom, prečo jednorazová funkcia? Prečo má sklon 0,06229 a priesečník 211,43? Dobre, tu je odpoveď: Tento teplotný senzor sa nachádza vo vnútri čipu CC2430, takže jeho popis určite nájdete v manuáli. A naozaj, som tuElektrické špecifikácieRelevantný obsah nájdete v tejto sekcii a snímka obrazovky je nasledovná:
Táto tabuľka popisuje teplotu (°C) teplotného senzora vo vzťahu k výstupnému napätiu (V). Najprv sa pozrite na druhý červený rámček:Teplotný koeficient。 "Koeficient"? Necíti sa to trochu? Potom sa pozrite na jeho jednotku: mV/°C, a zrazu si uvedomíte, že vzťah medzi teplotou a napätím je lineárny~ Teda: kde V je hodnota výstupného napätia, T je hodnota teploty a 2,45 je sklon. Intercept b musí byť určený nižšie. Na prvý pohľad zistíme, že pri prvom červenom boxe je napätie pri 0°C 743 mV, takže b je rovné 743? Inak, ak budete pozerať dole, zistíte, že jeho absolútna chyba dosahuje až 8°C! Potom sa pozrieme doprava a uvidíme, že už poskytuje najvhodnejší priesečník, t.j.: b=763, takže existuje nasledujúci vzorec: Dobre, teraz už máme teplotný senzorZadajte teplotu TaVýstupné napätie VĎalším krokom je nájsť ADCVstupné napätie VaVýstupná hodnota N(t. j. výsledok konverzie 14 bitov) a nakoniec nájsť konverzný vzorec N a T. Výsledok konverzie N je 14 bitov, a keď N=11 1111 1111 1111 1111 (binárne), výstupné napätie by malo byť maximálna hodnota (t. j. referenčné napätie 1,25V). Preto máme nasledujúci proporcionálny vzťah:
(Poznámka: Keďže výstup 14 bitov je binárny doplnok, 14. bit je symbol bit.) Takže v absolútnych hodnotách je efektívna hodnota len 13 bitov, teda 2 na mocninu 13) Kombináciou týchto dvoch vzorcov možno odvodiť vzťah medzi T a N: KONIEC~
Nakoniec pár slov o tom, prečo je na vzorku potrebných 64 cyklov. Keďže senzory sú nevyhnutne vystavené rušeniu alebo náhodným chybám pri meraní teploty, údaje získané senzormi sú niekedy prehnané (napríklad náhla zmena o 10°C a následný okamžitý návrat do normálu). Ale vieme, že zmena teploty je neoddeliteľný proces a je zriedkavé, aby veľký skok nastal v okamihu). Preto používame metódu priemeru na zníženie takýchto chýb. (4) Experimentálne výsledkyNajprv otvorte nástroj na ladenie sériových portov, potom si stiahnite program a spustite ho, a zobrazí sa nasledujúca obrazovka:
Teplota vo vnútri filmu je približne 14,5 °C. Autor cíti teplotu izby internátu svojím telom, ktorá je asi niečo vyše 10 °C. Vnútro čipu potrebuje trochu tepla, takže 14°C je v podstate normálne~ Toto je koniec experimentu. 3. ZáverTento článok popisuje implementáciu jednorazového vzorkovania ADC. V ďalšej časti predstavíme režim prenosu dátDMA(priamy prístup do pamäte), teda "priamy prístup do pamäte". Periférne jednotky ako ADC/UART/RF transceivery a pamäťové zariadenia môžu byť vymieňané priamo pod kontrolou "DMA radiča"Je potrebná minimálna zásah CPU, čo výrazne zlepšuje celkovú efektivitu systému. Zostaňte naladení! </n; i++); </n; i++); </n; i++); </n; i++); </n; i++);
|