|
1. Propojení horní a dolní úrovně V bezdrátových senzorových sítích je důležité převádět analogové hodnoty senzorů na digitální veličiny pro snadný přenos a zpracování. Pro dokončení této konverze se používá ADC (analogovo-digitální převodník). V předchozí části jsme zavedli komunikaci přes sériový port mezi CC2430 a PC. CC2430 má uvnitř zabudovaný teplotní senzor a tato část provede jednoduchý experiment s monitorováním teploty na čipu založený na předchozí části: použijte ADC k převodu hodnoty napětí z teplotního senzoru na čipu na digitální veličinu, použijte vzorec k výpočtu teploty a poté přeneste teplotní hodnotu PC přes sériový port a zobrazíte ji. 2. Jednorazový výběr ADC(1) Úvod do experimentuADC se používá k převodu teplotní hodnoty na CC2430 na čipu a teplotní hodnota je odeslána do PC přes sériový port a zobrazena. (2) Programový diagram
(3) Experimentální zdrojový kód a analýza/*
Popis experimentu: Experiment měření teploty v čipu odesílá data do PC přes sériový port 0
*/
#include
#define vedl1 P1_0
#define vedl2 P1_1
#define vedení3 P1_2
#define Led4 P1_3
/*32M晶振初始化
-------------------------------------------------------*/
prázdnotaxtal_init(prázdnota)
{ SPÁT &= ~0x04; //都上电
zatímco(! (SPÁT &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Vyberte krystalový oscilátor s frekvencí 32 MHz SPÁT |=0x04;
}
/*LED灯初始化
-------------------------------------------------------*/
prázdnotaled_init(prázdnota)
{ P1SEL =0x00; P1 je běžný I/O port P1DIR |=0x0F; P1.0 P1.1 P1.1 P1.2 P1.3 výstup
led1 =1; led2 =1; led3 =1; led4 =1;
}
/*UART0初始化
-------------------------------------------------------*/
prázdnota Uart0Init(nepodepsáno charStopBits,nepodepsáno charParita)
{ P0SEL |= 0x0C; //初始化UART0端口 PERCFG&= ~0x01; //选择UART0为可选位置一 U0CSR =0xC0; nastavte režim UART a povolte akceptor U0GCR =11; U0BAUD =216; //设置UART0波特率为115200bps U0UCR |= StopBits| Parita; //设置停止位与奇偶校验
}
/*UART0发送字符
-------------------------------------------------------*/
prázdnota Uart0Send(nepodepsáno chardata)
{
zatímco(U0CSR&0x01); //等待UART空闲时发送数据 U0DBUF = data;
}
/*UART0发送字符串
-------------------------------------------------------*/
prázdnotaUart0SendString(nepodepsáno char*s)
{
zatímco(*s !=0) Uart0Send(*s++);
}
/*UART0接收数据
-------------------------------------------------------*/
nepodepsáno charUart0Receive(prázdnota)
{
nepodepsáno chardata;
zatímco(! (U0CSR&0x04));//查询是否收到数据,否则继续等待 data=U0DBUF;
návratdata;
}
/*延时函数
-------------------------------------------------------*/
prázdnotaDelay(nepodepsáno intn)
{
nepodepsáno inti;
pro(i=0; i<n; i++);
pro(i=0; i<n; i++);
pro(i=0; i<n; i++);
pro(i=0; i<n; i++);
pro(i=0; i<n; i++);
}
/*得到实际温度值
-------------------------------------------------------*/
PlovákgetTemperature(prázdnota)
{
nepodepsáno int hodnotu;
ADCCON3 = (0x3E); //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
ADCCON1 |=0x30; //选择ADC的启动模式为手动 ADCCON1 |=0x40; Zahájení konverzí AD
zatímco(! (ADCCON1 &0x80)); //等待ADC转化结束
hodnota = ADCL >>2; hodnota |= (ADCH <<6); //取得最终转化结果,存入value中
návratHodnota*0.06229-311.43; //根据公式计算出温度值
}
/*主函数
-------------------------------------------------------*/
prázdnotamain(prázdnota)
{
chari;
Plovákprůměrná teplota;
nepodepsáno charoutput[]="";
xtal_init(); led_init();
led1 =0;
Uart0Init(0x00, 0x00); //初始化串口:无奇偶校验,停止位为1位
Uart0SendString("Ahoj CC2430 - TempSensor!");
zatímco(1) { led1 =0; avgTemp =0;
pro(i =0; i <64; i++) { avgTemp += getTemperature(); avgTemp = avgTemp/2; //每采样1次,取1次平均值 }
Výstup[0] = (nepodepsáno char)(avgTemp)/10 + 48; //十位 Výstup[1] = (nepodepsáno char)(avgTemp)%10 + 48; //个位 Výstup[2] ='.'; //小数点 Výstup[3] = (nepodepsáno char)(avgTemp*10)%10+48; //十分位 Výstup[4] = (nepodepsáno char)(avgTemp*100)%10+48; //百分位 výstup[5] =''; //字符串结束符
Uart0SendString(output); Uart0SendString("°C"); led1 =1; //LED熄灭,表示转换结束,
Delay(20000); Delay(20000); Delay(20000); Delay(20000); Delay(20000); Delay(20000); Delay(20000); Delay(20000); Delay(20000); Delay(20000); }
}
Pro kódový obsah komunikace na sériovém portu prosím viz předchozí sekce, která zde nebude vysvětlena~ ADC obvykle zahrnují 6 SFR: | ADCCON1 | Pro obecné řízení ADC, včetně konverzního koncového příznaku, metody ADC spouštění, generátoru náhodných čísel | | ADCCON2 | Konfigurace pro kontinuální převod ADC (tento experiment nezahrnuje kontinuální převod ADC a proto tento SFR nepoužívá) | | ADCCON3 | Konfigurace pro jeden převod ADC, včetně výběru referenčního napětí, rozlišení a zdroje převodu | | ADCH[7:0] | Vysoká úroveň konverze ADC, tj. ADC [13:6] | | ADCL[7:2] | Nízká úroveň konverzního výsledku ADC, tj. ADC [5:0] | | ADCCFG | AIN0~AIN7 s P0.0~P0.7 jako vstupem ADC (tento SFR se nepoužívá, protože v tomto testu je jako převodní zdroj zvolen teplotní senzor na čipu a nezahrnuje AIN0~AIN7) |
(Poznámka: Pro výše uvedené podrobnosti o SFR se prosím podívejte na čínský manuál CC2430) Teď se na to zaměřmegetTempuraturefunkce, která je klíčem k získání hodnoty teploty: (1) Nejprve nakonfigurujte ADC pro jedno vzorkování: nastavte ADCCON3=0x3E, vyberte 1,25V jako systémové napětí, zvolte 14bitové rozlišení a jako zdroj převodu ADC zvolte teplotní senzor CC2430 na čipu (2) Poté nastavte ADCCON1 |= 0x30 tak, aby se metoda spouštění ADC nastavila na manuální (tj. když ADCCON.6=1 zahajte přechod ADC) (3) Pak nechť ADCCON1 |= 0x40 pro zahájení jednosměrné konverze ADC (4) Použijte větu while(!( ADCCON1 &0x80)) Počkejte na konec přechodu na ADC (5) Výsledek převodu je uložen v ADCH[7:0] (8 bitů vyšší), ADCH [7:2] (o 6 bitů nižší) a předán: hodnota = ADCL >>2; hodnota |= (ADCH <<6);
Uložit výsledek konverze do hodnoty (6) Nakonec použijeme formuliteplota= hodnota*0,06229-311,43, vypočítat teplotu a vrátit Tipy na CC2430Musíte být zmatení posledním vzorcem, proč jednorázová funkce? Proč má sklon 0,06229 a průsečík 211,43? Dobře, tady je odpověď: Tento teplotní senzor je umístěn uvnitř čipu CC2430, takže jeho popis lze určitě najít v manuálu. A opravdu, jsem tadyElektrické specifikaceRelevantní obsah najdete v této sekci a screenshot je následující:
Tato tabulka popisuje teplotu (°C) teplotního senzoru ve vztahu k výstupnímu napětí (V). Nejprve se podívej na druhý červený rámeček:Teplotní koeficient。 "Koeficient"? Nepřipadá ti to trochu? Pak se podívej na jeho jednotku: mV/°C, a najednou si uvědomíš, že vztah mezi teplotou a napětím je lineární~ To znamená: kde V je hodnota výstupního napětí, T je teplota a 2,45 je sklon. Intercept b musí být určen níže. Na první pohled zjistíme, že na prvním červeném boxu je napětí při 0°C 743 mV, takže b je roven 743? Jinak, pokud budete dál hledět dolů, zjistíte, že jeho absolutní chyba dosahuje až 8 °C! Pak se podíváme doprava, kde už poskytuje nejvhodnější průsečík, tj.: b=763, takže existuje následující vzorec: Dobře, teď už máme teplotní senzorZadejte teplotu TaVýstupní napětí VDalším krokem je najít ADCVstupní napětí VaVýstupní hodnota N(tj. výsledek převodu 14 bitů) a nakonec najděte konverzní vzorec N a T. Výsledek převodu N je 14 bitů a když N=11 1111 1111 1111 1111 (binární), výstupní napětí by mělo být maximální hodnota (tj. referenční napětí 1,25V). Proto máme následující poměrný vztah:
(Poznámka: Protože výstup 14 bitů je binární doplněk, 14. bit je bitem symbolu.) Takže v absolutních hodnotách je efektivní hodnota pouze 13 bitů, tedy 2 na mocninu 13) Kombinací obou vzorců lze odvodit vztah mezi T a N: KONEC~
Nakonec pár slov o tom, proč je potřeba 64 cyklů na vzorek. Protože senzory jsou při měření teploty nevyhnutelně vystaveny rušení nebo náhodným chybám, data získaná senzory jsou někdy přehnaná (například náhlá změna o 10 °C a následný okamžitý návrat do normálu). Ale víme, že změna teploty je nedílný proces a je vzácné, aby došlo k velkému skoku během okamžiku). Proto používáme metodu průměru ke snížení těchto chyb. (4) Experimentální výsledkyNejprve otevřete nástroj pro ladění sériových portů, pak si stáhněte program a spusťte ho, a objeví se následující obrazovka:
Teplota uvnitř filmu je asi 14,5 °C. Autor cítí teplotu pokojové ložnice svým tělem, která je asi něco málo přes 10 °C. Uvnitř čipu je potřeba trochu zahřívat, takže 14°C je v podstatě normální~ Tím experiment končí. 3. ZávěrTento článek popisuje implementaci jednorazového vzorkování ADC. V následující části představíme režim přenosu datDMA(přímý přístup do paměti), tedy "přímý přístup do paměti". Periferní jednotky jako ADC/UART/RF transceivery a paměťová zařízení lze přímo vyměňovat pod kontrolou "DMA řadiče"Je potřeba jen minimální zásah CPU, což výrazně zlepšuje celkovou efektivitu systému. Zůstaňte naladěni! </n; i++); </n; i++); </n; i++); </n; i++); </n; i++);
|