|
1. A felső és alsó szintek összekapcsolása Vezeték nélküli szenzorhálózatokban fontos, hogy az analóg értékeket digitális mennyiségekké alakítsuk át a könnyű átvitel és feldolgozás érdekében. Az ADC (Analog-to-Digital Converter) segítségével végezzük ezt az átalakítást. Az előző részben bevezettük a soros port kommunikációt a CC2430 és egy PC között. A CC2430-ban egy hőmérséklet-érzékelő van beágyazva, és ez a rész egy egyszerű kísérletet hajt végre a chipen belüli hőmérséklet-monitorozásra az előző szakasz alapján: az ADC-t használva a chipen belüli hőmérséklet-érzékelő feszültségértékét digitális mennyiségre alakítsuk, a képlettel a hőmérséklet értékének kiszámítására használjuk, majd a hőmérséklet értékét a sorozatos porton keresztül továbbítjuk a PC-nek, és megjelenítjük. 2. ADC egy-egy mintavételezés(1) Bevezetés a kísérlethezAz ADC-t a CC2430 chipen belüli hőmérsékletérzékelő hőmérsékleti értékének átalakítására használják, és a hőmérséklet értékét a sorozatos porton keresztül továbbítják a PC-nek, ahol megjelenítik. (2) Programáram
(3) Kísérleti forráskód és elemzés/*
Kísérleti leírás: A chipen belüli hőmérséklet-mérési kísérlet az adatokat a 0. soros porton keresztül továbbítja a PC-hez
*/
#include
#define lead1 P1_0
#define led2 P1_1
#define lead3 P1_2
#define lead4 P1_3
/*32M晶振初始化
-------------------------------------------------------*/
Semmixtal_init(Semmi)
{ ALVÁS &= ~0x04; //都上电
miközben(! (ALVÁS &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Válassz egy 32 MHz-es kristályoscillátort ALVÁS |=0x04;
}
/*LED灯初始化
-------------------------------------------------------*/
Semmiled_init(Semmi)
{ P1SEL =0x00; A P1 a normál I/O port P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 kimenet
led1 =1; led2 =1; led3 =1; led4 =1;
}
/*UART0初始化
-------------------------------------------------------*/
Semmi Uart0Init(Aláírás nélkül charStopBits,Aláírás nélkül charParity)
{ P0SEL |= 0x0C; //初始化UART0端口 PERCFG&= ~0x01; //选择UART0为可选位置一 U0CSR =0xC0; állítsd be UART módra, és engedélyezze az akcebulátort U0GCR =11; U0BAUD =216; //设置UART0波特率为115200bps U0UCR |= StopBits| Parititás; //设置停止位与奇偶校验
}
/*UART0发送字符
-------------------------------------------------------*/
Semmi Uart0Send(Aláírás nélkül charadatok)
{
miközben(U0CSR&0x01); //等待UART空闲时发送数据 U0DBUF = adat;
}
/*UART0发送字符串
-------------------------------------------------------*/
SemmiUart0SendString(Aláírás nélkül char*s)
{
miközben(*s !=0) Uart0Send(*s++);
}
/*UART0接收数据
-------------------------------------------------------*/
Aláírás nélkül charUart0Receive(Semmi)
{
Aláírás nélkül charadatok;
miközben(! (U0CSR&0x04));//查询是否收到数据,否则继续等待 data=U0DBUF;
Visszatérésadatok;
}
/*延时函数
-------------------------------------------------------*/
SemmiKésés(Aláírás nélkül intn)
{
Aláírás nélkül 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(Semmi)
{
Aláírás nélkül int érték;
ADCCON3 = (0x3E); //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
ADCCON1 |=0x30; //选择ADC的启动模式为手动 ADCCON1 |=0x40; AD átalakítások indítása
miközben(! (ADCCON1 &0x80)); //等待ADC转化结束
érték = ADCL >>2; érték |= (ADCH <<6); //取得最终转化结果,存入value中
Visszatérésérték*0.06229-311.43; //根据公式计算出温度值
}
/*主函数
-------------------------------------------------------*/
Semmimain(Semmi)
{
chari;
FloatavgTemp;
Aláírás nélkül charkimenet[]="";
xtal_init(); led_init();
led1 =0;
Uart0Init(0x00, 0x00); //初始化串口:无奇偶校验,停止位为1位
Uart0SendString("Szia CC2430 - TempSensor!");
miközben(1) { led1 =0; avgTemp =0;
for(i =0; i <64; i++) { avgTemp += getTemperature(); avgTemp = avgTemp/2; //每采样1次,取1次平均值 }
Kimenet[0] = (Aláírás nélkül char(avgTemp)/10 + 48; //十位 Kimenet[1] = (Aláírás nélkül char)(avgTemp)%10 + 48; //个位 Kimenet[2] ='.'; //小数点 Kimenet[3] = (Aláírás nélkül char)(avgTemp*10)%10+48; //十分位 Kimenet[4] = (Aláírás nélkül char)(avgTemp*100)%10+48; //百分位 output[5] =''; //字符串结束符
Uart0SendString(kimenet); Uart0SendString("°C"); led1 =1; //LED熄灭,表示转换结束,
Késés(20000); Késés(20000); Késés(20000); Késés(20000); Késés(20000); Késés(20000); Késés(20000); Késés(20000); Késés(20000); Késés(20000); }
}
A soros port kommunikáció kódtartalmáról kérjük, lásd az előző szakaszt, amelyet itt nem magyarázunk el~ Az ADC-k általában 6 SFR-t foglalnak magukban: | ADCCON1 | ADC általános vezérléshez, beleértve az átalakítás végjelzőjét, ADC trigger módszert, véletlenszámgenerátort | | ADCCON2 | Konfiguráció a folyamatos ADC átalakításhoz (ez a kísérlet nem tartalmaz folyamatos ADC átalakítást, ezért nem használja ezt az SFR-t) | | ADCCON3 | Egyetlen ADC átalakítás konfigurációja, beleértve a referencia feszültség, felbontás, átalakítási forrás kiválasztását | | ADCH[7:0] | Az ADC átalakítás eredményének magas szintje, azaz ADC [13:6] | | ADCL[7:2] | Az ADC átalakítási eredmény alacsony szintje, azaz ADC [5:0] | | ADCCFG | AIN0~AIN7, ahol P0.0~P0.7 ADC bemenetként (ezt az SFR-t nem használják, mert a chipen belüli hőmérséklet-érzékelőt választják az átalakító forrásként ebben a tesztben, és nem érinti az AIN0~AIN7-et) |
(Megjegyzés: A fenti SFR részleteiért kérjük, tekintse meg a CC2430 kínai kézikönyvet) Most pedig koncentráljunk rágetTempuraturefüggvény, amely a hőmérsékleti érték megszerzésének kulcsa: (1) Először állítsuk be az ADC-t egyetlen mintavételre: állítsuk be ADCCON3=0x3E-t, válasszuk ki a rendszer feszültségét 1,25V-nak, válasszuk ki a 14 bites felbontást, és a CC2430 chipen belüli hőmérséklet-érzékelőt ADC átalakító forrásként (2) Ezután állítsd be ADCCON1 |= 0x30-t, hogy az ADC trigger metódusát manuálisra állítsa (azaz amikor ADCCON.6=1, indítsd el az ADC átmenetet). (3) Ezután legyen ADCCON1 |= 0x40 az ADC egyetlen átalakításának elindításához (4) Használd az állítást, mikor(!( ADCCON1 &0x80)) Várjuk meg az ADC átmenet végét (5) Az átváltási eredmény az ADCH[7:0] (8 bit magas), ADCH [7:2] (6 bit alacsonyabb) formátumban tárolódik, és áthaladja: érték = ADCL >>2; érték |= (ADCH <<6);
Mentsük el az átváltási eredményt az értékben (6) Végül használjuk a képletethőmérséklet= érték*0,06229-311,43, számolja ki a hőmérsékleti értéket és a visszatérést CC2430 tippekBiztosan zavarban vagy az utolsó képleten, miért egy egyszeri függvény? Miért van 0,06229 meredeksége és 211,43 kereszteződése? Rendben, itt a válasz: Ez a hőmérséklet-érzékelő a CC2430 chipben található, így a leírása biztosan megtalálható a kézikönyvben. Bizony, itt vagyokElektromos műszaki előírásokA releváns tartalom ebben a szakaszban található, és a képernyőkép a következő:
Ez a táblázat a hőmérséklet-érzékelő hőmérsékletét (°C) írja le a kimeneti feszültséghez (V) viszonyítva. Először nézd meg a második piros dobozt:Hőmérsékleti együttható。 "Együttható"? Nem érződik egy kicsit? Aztán nézd meg az egységét: mV/°C, és hirtelen rájössz, hogy a hőmérséklet és a feszültség közötti kapcsolat lineáris~ Azaz: ahol V a kimeneti feszültségérték, T a hőmérsékleti érték, és 2,45 a lejtő. Az elfogás b szakaszát alább kell meghatározni. Első pillantásra az első piros doboznál azt találjuk, hogy a 0°C-os feszültség 743mV, tehát b egyenlő 743-mal? Ellenkező esetben, ha tovább nézel, azt fogod tapasztalni, hogy az abszolút hiba eléri a 8°C-ot! Jobbra nézve látjuk, hogy már a legmegfelelőbb metszést adja meg, azaz: b=763, tehát a következő képlet áll rendelkezésre: Rendben, most már megvan a hőmérséklet-érzékelőnkLépj be hőmérséklet TésKimeneti feszültség VA következő lépés az ADC megtalálásaBemeneti feszültség VésKimeneti érték N(azaz 14 bites átalakítási eredmény), és végül megtaláljuk N és T átalakítási formuláját. Az átalakító eredmény N 14 bit, és amikor N = 1111 1111 1111 1111 (bináris), a kimeneti feszültségnek a maximális értéknek kell lennie (azaz referenciafeszültség 1,25V). Ezért a következő arányos összefüggés van:
(Megjegyzés: Mivel a 14 bit kimenete bináris komplement, a 14. bit a szimbólumbit.) Tehát abszolút értékben az effektív érték csak 13 bit, tehát 2 az 13-as hatványhoz képest) A két képlet kombinálásával T és N közötti kapcsolat levezethethető: VÉG~
Végül néhány szó arról, miért szükséges mintaként 64 ciklus. Mivel az érzékelők elkerülhetetlenül interferenciának vagy véletlenszerű hibáknak vannak kitéve a hőmérséklet mérésekor, az érzékelők által szerzett adatok néha túlzóak (például hirtelen 10°C-os változás, majd azonnali visszatérés a normálishoz). De tudjuk, hogy a hőmérsékletváltozás egy szerves folyamat, és ritka, hogy egy nagy ugrás azonnal bekövetkezik. Ezért az átlagos módszert használjuk az ilyen hibák csökkentésére. (4) Kísérleti eredményekElőször nyisd meg a soros port hibakereső eszközt, majd töltsd le a programot és indítsd el, és a következő képernyő jelenik meg:
A filmen belüli hőmérséklet körülbelül 14,5°C. A szerző testével érzi a hálóterem szobahőmérsékletét, amely valamivel több mint 10°C. A chip belsejének hőt kell kapnia, így a 14°C gyakorlatilag normális~ Ez a kísérlet vége. 3. KövetkeztetésEz a cikk az ADC egy-mintavételezés megvalósítását írja le. A következő részben bevezetünk egy adatátviteli módotDMA(közvetlen memóriahozzáférés), azaz "közvetlen memória-hozzáférés". Perifériás egységek, mint az ADC/UART/RF adóvevők és memóriaeszközök közvetlenül a "DMA vezérlő" irányítása alatt cserélhetőkKevés CPU beavatkozásra van szükség, ami jelentősen javítja a rendszer általános hatékonyságát. Maradjatok velünk! </n; i++); </n; i++); </n; i++); </n; i++); </n; i++);
|