|
1. Att koppla ihop de övre och undre nivåerna I trådlösa sensornätverk är det viktigt att omvandla sensorernas analoga värden till digitala kvantiteter för enkel överföring och bearbetning. ADC (Analog-till-digital-omvandlare) används för att slutföra denna omvandling. I föregående avsnitt introducerade vi seriell portkommunikation mellan CC2430 och en PC. CC2430 har en temperatursensor inbyggd, och detta avsnitt kommer att implementera ett enkelt experiment med inbyggd temperaturövervakning baserat på föregående avsnitt: använd ADC:n för att omvandla spänningsvärdet för den inbyggda temperatursensorn till en digital storhet, använd formeln för att beräkna temperaturvärdet och överför sedan temperaturvärdet till datorn via seriporten och visa det. 2. ADC-enkelprovtagning(1) Introduktion till experimentetADC:n används för att konvertera temperaturvärdet för CC2430:s inbyggda temperatursensor, och temperaturvärdet skickas till datorn via serieporten och visas. (2) Programflödesschema
(3) Experimentell källkod och analys/*
Experimentbeskrivning: Temperaturinsamlingsexperimentet i chipet skickar data till PC:n via serieport 0
*/
#include
#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*32M晶振初始化
-------------------------------------------------------*/
tomrumxtal_init(tomrum)
{ SOV &= ~0x04; //都上电
medan(! (SÖMN &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Välj en 32MHz kristalloscillator SÖMN |=0x04;
}
/*LED灯初始化
-------------------------------------------------------*/
tomrumled_init(tomrum)
{ P1SEL =0x00; P1 är den normala I/O-porten P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3-utgång
led1 =1; led2 =1; led3 =1; led4 =1;
}
/*UART0初始化
-------------------------------------------------------*/
tomrum Uart0Init(osignerad charStopBits,osignerad charParitet)
{ P0SEL |= 0x0C; //初始化UART0端口 PERCFG&= ~0x01; //选择UART0为可选位置一 U0CSR =0xC0; ställ in på UART-läge och aktivera acceptorn U0GCR =11; U0BAUD =216; //设置UART0波特率为115200bps U0UCR |= StopBits| Paritet; //设置停止位与奇偶校验
}
/*UART0发送字符
-------------------------------------------------------*/
tomrum Uart0Send(osignerad chardata)
{
medan(U0CSR&0x01); //等待UART空闲时发送数据 U0DBUF = data;
}
/*UART0发送字符串
-------------------------------------------------------*/
tomrumUart0SendString(osignerad char*s)
{
medan(*s !=0) Uart0Send(*s++);
}
/*UART0接收数据
-------------------------------------------------------*/
osignerad charUart0Receive(tomrum)
{
osignerad chardata;
medan(! (U0CSR&0x04));//查询是否收到数据,否则继续等待 data=U0DBUF;
Återkomstendata;
}
/*延时函数
-------------------------------------------------------*/
tomrumFördröjning(osignerad intn)
{
osignerad inti;
för(i=0; i<n; i++);
för(i=0; i<n; i++);
för(i=0; i<n; i++);
för(i=0; i<n; i++);
för(i=0; i<n; i++);
}
/*得到实际温度值
-------------------------------------------------------*/
FlottgetTemperature(tomrum)
{
osignerad int värde;
ADCCON3 = (0x3E); //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
ADCCON1 |=0x30; //选择ADC的启动模式为手动 ADCCON1 |=0x40; Initiera AD-konverteringar
medan(! (ADCCON1 &0x80)); //等待ADC转化结束
värde = ADCL >>2; värde |= (ADCH <<6); //取得最终转化结果,存入value中
Återkomstenvärde*0.06229-311.43; //根据公式计算出温度值
}
/*主函数
-------------------------------------------------------*/
tomrumhuvud(tomrum)
{
chari;
FlottavgTemp;
osignerad charoutput[]="";
xtal_init(); led_init();
led1 =0;
Uart0Init(0x00, 0x00); //初始化串口:无奇偶校验,停止位为1位
Uart0SendString("Hej CC2430 - TempSensor!");
medan(1) { led1 =0; avgTemp =0;
för(i =0; i <64; i++) { avgTemp += getTemperature(); avgTemp = avgTemp/2; //每采样1次,取1次平均值 }
Utgång[0] = (osignerad char(avgTemp)/10 + 48; //十位 Utgång[1] = (osignerad char)(avgTemp)%10 + 48; //个位 Utgång[2] ='.'; //小数点 Utgång[3] = (osignerad char)(avgTemp*10)%10+48; //十分位 Utgång[4] = (osignerad char)(avgTemp*100)%10+48; //百分位 output[5] =''; //字符串结束符
Uart0SendString(output); Uart0SendString("°C"); led1 =1; //LED熄灭,表示转换结束,
Fördröjning(20000); Fördröjning(20000); Fördröjning(20000); Fördröjning(20000); Fördröjning(20000); Fördröjning(20000); Fördröjning(20000); Fördröjning(20000); Fördröjning(20000); Fördröjning(20000); }
}
För kodinnehållet i seriell portkommunikation, vänligen se föregående avsnitt, som inte kommer att förklaras här~ ADC:er involverar vanligtvis 6 SFR:er: | ADCCON1 | För ADC:s allmänna kontroll, inklusive konverteringsslutflagga, ADC-triggermetod, slumptalsgenerator | | ADCCON2 | Konfiguration för kontinuerlig ADC-konvertering (detta experiment involverar inte kontinuerlig ADC-konvertering och använder därför inte denna SFR) | | ADCCON3 | Konfiguration för en enda ADC-konvertering, inklusive val av referensspänning, upplösning, konverteringskälla | | ADCH[7:0] | Den höga nivån av ADC-konverteringsresultatet, dvs. ADC [13:6] | | ADCL[7:2] | Den låga nivån av ADC-konverteringsresultatet, dvs. ADC [5:0] | | ADCCFG | AIN0~AIN7 med P0.0~P0.7 som ADC-ingång (denna SFR används inte eftersom den inbyggda temperatursensorn väljs som konverteringskälla i detta test och inte involverar AIN0~AIN7) |
(Obs: Vänligen se CC2430 Chinese Manual för ovanstående SFR-detaljer) Nästa steg är att fokusera på detgetTempuraturefunktionen, som är nyckeln till att få fram temperaturvärdet: (1) Först, konfigurera ADC:n för en enda provtagning: ställ in ADCCON3=0x3E, välj 1,25V som systemspänning, välj 14-bitars upplösning och välj CC2430 on-chip temperatursensor som ADC-konverteringskälla (2) Sätt sedan ADCCON1 |= 0x30 att sätta ADC-triggermetoden till manuell (dvs. när ADCCON.6=1 startar ADC-övergången) (3) Låt då ADCCON1 |= 0x40 för att starta ADC:s enkelkonvertering (4) Använd uttalandet medan(!( ADCCON1 &0x80)) Vänta på slutet av ADC-övergången (5) Konverteringsresultatet lagras i ADCH[7:0] (8 bitar högt), ADCH [7:2] (6 bitar lägre) och skickas: värde = ADCL >>2; värde |= (ADCH <<6);
Spara konverteringsresultatet i värdet (6) Använd slutligen formelntemperatur= värde*0,06229-311,43, beräkna temperaturvärdet och returnera CC2430-tipsDu måste vara förbryllad över den sista formeln, varför en engångsfunktion? Varför har den en lutning på 0,06229 och en intercept på 211,43? Okej, här är svaret: Denna temperatursensor sitter inuti CC2430-chipet, så dess beskrivning finns definitivt i manualen. Visst nog, jag är härElektriska specifikationerDet relevanta innehållet finns i denna sektion, och skärmdumpen är följande:
Denna tabell beskriver temperaturen (°C) hos temperatursensorn i förhållande till utspänningen (V). Första titten på den andra röda rutan:Temperaturkoefficient。 "Koefficient"? Känns det inte lite? Titta sedan på dess enhet: mV/°C, och du kommer plötsligt att inse att sambandet mellan temperatur och spänning är linjärt~ Det vill säga: där V är utgångsspänningsvärdet, T är temperaturvärdet och 2,45 är lutningen. Intercept b måste fastställas nedan. Vid första anblicken ser vi vid den första röda lådan att spänningen vid 0°C är 743mV, så b är lika med 743? Annars, om du fortsätter att titta neråt, kommer du att upptäcka att dess absoluta fel når upp till 8°C! Sedan, om vi tittar åt höger, ser vi att den redan ger det mest lämpliga interceptet, dvs: b=763, så det finns följande formel: Okej, nu har vi redan temperatursensornAnge temperatur TochUtgångsspänning VNästa steg är att hitta ADC:nIngångsspänning VochUtgångsvärde N(dvs. konverteringsresultatet på 14 bitar), och slutligen hitta omvandlingsformeln för N och T. Konverteringsresultatet N är 14 bitar, och när N=11 1111 1111 1111 (binärt) bör utgångsspänningen vara det maximala värdet (dvs. referensspänning 1,25V). Därför har vi följande proportionella samband:
(Observera: Eftersom utdatan från 14 bitar är ett binärt komplement, är den 14:e biten symbolbiten.) Så i absoluta termer är det effektiva värdet bara 13 bitar, alltså 2 upphöjt till 13 potens) Genom att kombinera de två formlerna kan sambandet mellan T och N härledas: ÖVER~
Slutligen, några ord om varför 64 cykler krävs per prov. Eftersom sensorer oundvikligen är känsliga för störningar eller slumpmässiga fel vid temperaturmätning, överdrivs ibland de data som sensorerna får (till exempel en plötslig förändring på 10°C och sedan en omedelbar återgång till normalt). Men vi vet att temperaturförändring är en integrerad process, och det är ovanligt att ett stort hopp sker på ett ögonblick). Därför använder vi medelvärdesmetoden för att minska sådana fel. (4) Experimentella resultatÖppna först verktyget för seriell port-felsökning, ladda sedan ner programmet och starta det, och följande skärm visas:
Temperaturen inuti filmen är cirka 14,5°C. Författaren känner rumstemperaturen i sovsalen med sin kropp, som är ungefär lite över 10°C. Insidan av chipet behöver få lite värme, så 14°C är i princip normalt~ Detta är slutet på experimentet. 3. SlutsatsDenna artikel beskriver implementeringen av ADC single-sampling. I nästa avsnitt kommer vi att introducera ett dataöverföringslägeDMA(direkt minnesåtkomst), det vill säga "direkt minnesåtkomst". Kringutrustningsenheter som ADC/UART/RF-transceivrar och minnesenheter kan utbytas direkt under kontroll av "DMA-kontrollern"Lite CPU-inblandning krävs, vilket avsevärt förbättrar systemets totala effektivitet. Fortsätt följa! </n; i++); </n; i++); </n; i++); </n; i++); </n; i++);
|