|
1. Sammenkobling av øvre og nedre nivåer I trådløse sensornettverk er det viktig å konvertere de analoge verdiene til sensorene til digitale størrelser for enkel overføring og behandling. ADC (analog-til-digital-omformer) brukes for å fullføre denne konverteringen. I forrige avsnitt introduserte vi seriell portkommunikasjon mellom CC2430 og en PC. CC2430 har en innebygd temperatursensor, og denne delen vil implementere et enkelt eksperiment med innebygd temperaturovervåking basert på forrige del: bruk ADC-en til å konvertere spenningsverdien til den innebygde temperatursensoren til en digital størrelse, bruk formelen til å beregne temperaturverdien, og send deretter temperaturverdien til PC-en gjennom den serielle porten og viser den. 2. ADC enkeltsampling(1) Introduksjon til eksperimentetADC-en brukes til å konvertere temperaturverdien til CC2430 sin innebygde temperatursensor, og temperaturverdien sendes til PC-en gjennom serieporten og vises. (2) Programflytskjema
(3) Eksperimentell kildekode og analyse/*
Eksperimentell beskrivelse: Temperaturinnhentingseksperimentet i brikken sender dataene til PC-en gjennom serieport 0
*/
#include
#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*32M晶振初始化
-------------------------------------------------------*/
Tomromxtal_init(Tomrom)
{ SOV &= ~0x04; //都上电
mens(! (SØVN &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Velg en 32 MHz krystalloscillator SØVN |=0x04;
}
/*LED灯初始化
-------------------------------------------------------*/
Tomromled_init(Tomrom)
{ P1SEL =0x00; P1 er den vanlige I/O-porten P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3-utgang
led1 =1; led2 =1; led3 =1; led4 =1;
}
/*UART0初始化
-------------------------------------------------------*/
Tomrom Uart0Init(Usignert CharStopBits,Usignert CharParitet)
{ P0SEL |= 0x0C; //初始化UART0端口 PERCFG&= ~0x01; //选择UART0为可选位置一 U0CSR =0xC0; sett til UART-modus og aktiver akseptoren U0GCR =11; U0BAUD =216; //设置UART0波特率为115200bps U0UCR |= StopBits| Paritet; //设置停止位与奇偶校验
}
/*UART0发送字符
-------------------------------------------------------*/
Tomrom Uart0Send(Usignert Chardata)
{
mens(U0CSR&0x01); //等待UART空闲时发送数据 U0DBUF = data;
}
/*UART0发送字符串
-------------------------------------------------------*/
TomromUart0SendString(Usignert Char*s)
{
mens(*s !=0) Uart0Send(*s++);
}
/*UART0接收数据
-------------------------------------------------------*/
Usignert CharUart0Receive(Tomrom)
{
Usignert Chardata;
mens(! (U0CSR&0x04));//查询是否收到数据,否则继续等待 data=U0DBUF;
Tilbakedata;
}
/*延时函数
-------------------------------------------------------*/
TomromForsinkelse(Usignert Intn)
{
Usignert 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(Tomrom)
{
Usignert Int verdi;
ADCCON3 = (0x3E); //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
ADCCON1 |=0x30; //选择ADC的启动模式为手动 ADCCON1 |=0x40; Start AD-konverteringer
mens(! (ADCCON1 &0x80)); //等待ADC转化结束
verdi = ADCL >>2; verdi |= (ADCH <<6); //取得最终转化结果,存入value中
Tilbakeverdi*0.06229-311.43; //根据公式计算出温度值
}
/*主函数
-------------------------------------------------------*/
Tomromhoved(Tomrom)
{
Chari;
FloatavgTemp;
Usignert Charoutput[]="";
xtal_init(); led_init();
led1 =0;
Uart0Init(0x00, 0x00); //初始化串口:无奇偶校验,停止位为1位
Uart0SendString("Hallo CC2430 - TempSensor!");
mens(1) { led1 =0; avgTemp =0;
for(i =0; i <64; i++) { avgTemp += getTemperature(); avgTemp = avgTemp/2; //每采样1次,取1次平均值 }
Output[0] = (Usignert Char(avgTemp)/10 + 48; //十位 Output[1] = (Usignert Char)(avgTemp)%10 + 48; //个位 Output[2] ='.'; //小数点 Output[3] = (Usignert Char(avgTemp*10)%10+48; //十分位 Output[4] = (Usignert Char(avgTemp*100)%10+48; //百分位 output[5] =''; //字符串结束符
Uart0SendString (output); Uart0SendString("°C"); led1 =1; //LED熄灭,表示转换结束,
Forsinkelse(20000); Forsinkelse(20000); Forsinkelse(20000); Forsinkelse(20000); Forsinkelse(20000); Forsinkelse(20000); Forsinkelse(20000); Forsinkelse(20000); Forsinkelse(20000); Forsinkelse(20000); }
}
For kodeinnholdet i seriell portkommunikasjon, vennligst se forrige avsnitt, som ikke vil bli forklart her~ ADC-er involverer vanligvis 6 SFR-er: | ADCCON1 | For generell ADC-kontroll, inkludert konverteringsflagg, ADC-triggermetode, tilfeldig tallgenerator | | ADCCON2 | Konfigurasjon for kontinuerlig ADC-konvertering (dette eksperimentet involverer ikke kontinuerlig ADC-konvertering og bruker derfor ikke denne SFR-en) | | ADCCON3 | Konfigurasjon for en enkelt ADC-konvertering, inkludert valg av referansespenning, oppløsning, konverteringskilde | | ADCH[7:0] | Det høye nivået av ADC-konverteringsresultatet, altså ADC [13:6] | | ADCL[7:2] | Det lave nivået av ADC-konverteringsresultatet, altså ADC [5:0] | | ADCCFG | AIN0~AIN7 med P0.0~P0.7 som ADC-inngang (denne SFR brukes ikke fordi den innebygde temperatursensoren er valgt som konverteringskilde i denne testen og ikke involverer AIN0~AIN7) |
(Merk: Vennligst se CC2430 kinesiske manual for detaljer om SFR ovenfor) La oss fokusere på det nestegetTempuraturefunksjon, som er nøkkelen til å få temperaturverdien: (1) Først, konfigurer ADC-en for en enkelt prøvetakning: sett ADCCON3=0x3E, velg 1,25V som systemspenning, velg 14-bits oppløsning, og velg CC2430 innebygde temperatursensor som ADC-konverteringskilde (2) Sett deretter ADCCON1 |= 0x30 til å sette ADC-triggermetoden til manuell (dvs. når ADCCON.6=1, start ADC-overgangen) (3) La ADCCON1 |= 0x40 for å starte ADC-enkeltkonverteringen (4) Bruk uttalelsen mens (!( ADCCON1 &0x80)) Vent på slutten av ADC-overgangen (5) Konverteringsresultatet lagres i ADCH[7:0] (8 biter høyt), ADCH [7:2] (6 biter lavere), og sendes: verdi = ADCL >>2; verdi |= (ADCH <<6);
Lagre konverteringsresultatet i verdien (6) Til slutt, bruk formelentemperatur= verdi*0,06229-311,43, beregne temperaturverdien og returnere CC2430-tipsDu må være forvirret over den siste formelen, hvorfor en engangsfunksjon? Hvorfor har den en helning på 0,06229 og et intercept på 211,43? OK, her er svaret: Denne temperatursensoren er plassert inne i CC2430-brikken, så beskrivelsen kan absolutt finnes i manualen. Joda, jeg er herElektriske spesifikasjonerDet relevante innholdet finnes i denne seksjonen, og skjermbildet er som følger:
Denne tabellen beskriver temperaturen (°C) til temperatursensoren i forhold til utgangsspenningen (V). Første blikk på den andre røde boksen:Temperaturkoeffisienten。 "Koeffisient"? Føles det ikke litt? Se deretter på enheten: mV/°C, og du vil plutselig innse at forholdet mellom temperatur og spenning er lineært~ Det vil si: hvor V er utgangsspenningsverdien, T er temperaturverdien, og 2,45 er stigningen. Avskjæringen b må bestemmes nedenfor. Ved første øyekast vil vi finne på den første røde boksen at spenningen ved 0°C er 743mV, altså b er lik 743? Ellers, hvis du fortsetter å se ned, vil du oppdage at den absolutte feilen når så mye som 8°C! Når vi ser mot høyre, vil vi se at den allerede gir det mest egnede snittet, altså: b=763, så det finnes følgende formel: OK, nå har vi allerede temperatursensorenTrykk inn temperatur TogUtgangsspenning VNeste steg er å finne ADC-enInngangsspenning VogUtgangsverdi N(dvs. konverteringsresultatet på 14 biter), og til slutt finne konverteringsformelen for N og T. Konverteringsresultatet N er 14 biter, og når N=11 1111 1111 1111 (binær), bør utgangsspenningen være maksimalverdien (dvs. referansespenning 1,25V). Derfor har vi følgende proporsjonale forhold:
(Merk: Siden utgangen av 14 biter er et binærkomplement, er den 14. biten symbolbiten.) Så i absolutte termer er den effektive verdien bare 13 biter, altså 2 opphøyd i potensen av 13) Ved å kombinere de to formlene kan forholdet mellom T og N utledes: OVER~
Til slutt, noen ord om hvorfor 64 sykluser kreves per prøve. Fordi sensorer uunngåelig er utsatt for interferens eller tilfeldige feil ved temperaturmåling, blir dataene sensorene noen ganger overdrevet (for eksempel en plutselig endring på 10°C, og deretter en umiddelbar tilbakevending til normalen). Men vi vet at temperaturendring er en integrert prosess, og det er sjeldent at et stort hopp skjer på et øyeblikk). Derfor bruker vi gjennomsnittsmetoden for å redusere slike feil. (4) Eksperimentelle resultaterFørst åpner du verktøyet for feilsøking av serielle porter, laster deretter ned programmet og starter det, og følgende skjerm vil vises:
Temperaturen inne i filmen er omtrent 14,5°C. Forfatteren kjenner romtemperaturen i sovesalen med kroppen sin, som er litt over 10°C. Innsiden av brikken trenger litt varme, så 14°C er stort sett normalt~ Dette er slutten på eksperimentet. 3. KonklusjonDenne artikkelen beskriver implementeringen av ADC enkeltprøvetaking. I neste avsnitt vil vi introdusere en dataoverføringsmodusDMA(direkte minnetilgang), det vil si "direkte minnetilgang". Periferienheter som ADC/UART/RF-transceivere og minneenheter kan utveksles direkte under kontroll av "DMA-kontrolleren"Lite CPU-inngripen er nødvendig, noe som i stor grad forbedrer systemets totale effektivitet. Følg med! </n; i++); </n; i++); </n; i++); </n; i++); </n; i++);
|