|
1. Ylä- ja alakerrosten yhdistäminen Langattomissa anturiverkoissa on tärkeää muuntaa antureiden analogiset arvot digitaalisiksi suureiksi helpon siirron ja käsittelyn mahdollistamiseksi. Tämän muunnoksen suorittamiseen käytetään ADC:tä (Analog-to-Digital Converter). Edellisessä osiossa esittelimme sarjaporttiviestinnän CC2430:n ja PC:n välillä. CC2430:ssa on sisäänrakennettu lämpötila-anturi, ja tässä osiossa toteutetaan yksinkertainen koe sirun sisäisestä lämpötilan seurannasta edellisen osion pohjalta: käytä ADC:tä muuntamaan sirun sisäisen lämpötila-anturin jännitearvo digitaaliseksi suureeksi, käytä kaavaa lämpötilan laskemiseen ja sitten lähetetään lämpötila-arvo PC:lle sarjaportin kautta ja näytä se. 2. ADC:n yksinäytteenotto(1) Johdanto kokeeseenADC:tä käytetään CC2430:n sirulla olevan lämpötila-anturin lämpötila-arvon muuntamiseen, ja lämpötila-arvo lähetetään PC:lle sarjaportin kautta ja näytetään. (2) Ohjelman vuokaavio
(3) Kokeellinen lähdekoodi ja analyysi/*
Kokeellinen kuvaus: Sirun sisäinen lämpötilan mittauskoe lähettää datan PC:lle sarjaportin 0 kautta
*/
#include
#define johti1 P1_0
#define led2 P1_1
#define johti 3 P1_2
#define johti 4 P1_3
/*32M晶振初始化
-------------------------------------------------------*/
voidxtal_init(void)
{ UNI &= ~0x04; //都上电
kun(! (UNI &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Valitse 32MHz:n kideoskillaattori UNI |=0x04;
}
/*LED灯初始化
-------------------------------------------------------*/
voidled_init(void)
{ P1SEL =0x00; P1 on tavallinen I/O-portti P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 ulostulo
led1 =1; led2 =1; led3 =1; led4 =1;
}
/*UART0初始化
-------------------------------------------------------*/
void Uart0Init(Allekirjoittamaton charStopBits,Allekirjoittamaton charParity)
{ P0SEL |= 0x0C; //初始化UART0端口 PERCFG&= ~0x01; //选择UART0为可选位置一 U0CSR =0xC0; aseta UART-tilaan ja ota vastaanotin käyttöön U0GCR =11; U0BAUD =216; //设置UART0波特率为115200bps U0UCR |= StopBits| Tasavertaisuus; //设置停止位与奇偶校验
}
/*UART0发送字符
-------------------------------------------------------*/
void Uart0Send(Allekirjoittamaton chardata)
{
kun(U0CSR&0x01); //等待UART空闲时发送数据 U0DBUF = data;
}
/*UART0发送字符串
-------------------------------------------------------*/
voidUart0SendString(Allekirjoittamaton char*s)
{
kun(*s !=0) Uart0Send(*s++);
}
/*UART0接收数据
-------------------------------------------------------*/
Allekirjoittamaton charUart0Receive(void)
{
Allekirjoittamaton chardataa;
kun(! (U0CSR&0x04));//查询是否收到数据,否则继续等待 data=U0DBUF;
Paluudataa;
}
/*延时函数
-------------------------------------------------------*/
voidViive(Allekirjoittamaton intn)
{
Allekirjoittamaton 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(void)
{
Allekirjoittamaton int arvo;
ADCCON3 = (0x3E); //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
ADCCON1 |=0x30; //选择ADC的启动模式为手动 ADCCON1 |=0x40; Aloita AD-muunnokset
kun(! (ADCCON1 &0x80)); //等待ADC转化结束
arvo = ADCL >>2; arvo |= (ADCH <<6); //取得最终转化结果,存入value中
Paluuarvo*0.06229-311.43; //根据公式计算出温度值
}
/*主函数
-------------------------------------------------------*/
voidpää(void)
{
chari;
FloatavgTemp;
Allekirjoittamaton charoutput[]="";
xtal_init(); led_init();
led1 =0;
Uart0Init(0x00, 0x00); //初始化串口:无奇偶校验,停止位为1位
Uart0SendString("Hei CC2430 - TempSensor!");
kun(1) { led1 =0; avgTemp =0;
for(i =0; i <64; i++) { avgTemp += getTemperature(); avgTemp = avgTemp/2; //每采样1次,取1次平均值 }
Output[0] = (Allekirjoittamaton char)(avgTemp)/10 + 48; //十位 Output[1] = (Allekirjoittamaton char)(avgTemp)%10 + 48; //个位 Output[2] ='.'; //小数点 Output[3] = (Allekirjoittamaton char)(avgTemp*10)%10+48; //十分位 Output[4] = (Allekirjoittamaton char)(avgTemp*100)%10+48; //百分位 output[5] =''; //字符串结束符
Uart0SendString(ulostulo); Uart0SendString("°C"); led1 =1; //LED熄灭,表示转换结束,
Viive(20000); Viive(20000); Viive(20000); Viive(20000); Viive(20000); Viive(20000); Viive(20000); Viive(20000); Viive(20000); Viive(20000); }
}
Sarjaporttiviestinnän koodisisällöstä löytyy edellisestä osiosta, jota ei tässä selitetä~ ADC:t sisältävät yleensä 6 SFR:ää: | ADCCON1 | ADC:n yleiseen ohjaukseen, mukaan lukien muunnoksen päätelippu, ADC-laukaisumenetelmä, satunnaislukugeneraattori | | ADCCON2 | Jatkuvan ADC-muunnoksen konfiguraatio (tässä kokeessa ei ole jatkuvaa ADC-muunnosta, joten tätä SFR:ää ei käytetä) | | ADCCON3 | Yhden ADC-muunnoksen konfiguraatio, mukaan lukien referenssijännitteen, resoluution ja muunnoslähteen valinta | | ADCH[7:0] | ADC-muunnoksen korkea taso, eli ADC [13:6] | | ADCL[7:2] | ADC-muunnoksen tuloksen matala taso, eli ADC [5:0] | | ADCCFG | AIN0~AIN7, jossa P0.0~P0.7 on ADC-tulo (tätä SFR:ää ei käytetä, koska sirun lämpötilasensori valitaan muunnoslähteeksi tässä testissä eikä AIN0~AIN7:ää) |
(Huomautus: Katso CC2430-kiinan käsikirjasta yllä olevat SFR-tiedot) Seuraavaksi keskitytään siihengetTempuraturefunktio, joka on avain lämpötilan arvon saamiseksi: (1) Ensiksi konfiguroi ADC yhdelle näytteenotokselle: aseta ADCCON3=0x3E, valitse 1,25V järjestelmän jännitteeksi, valitse 14-bittinen resoluutio ja valitse CC2430-sirun sisäinen lämpötila-anturi ADC-muunnoslähteeksi (2) Aseta sitten ADCCON1 |= 0x30 asettaaksesi ADC-laukaisumenetelmän manuaaliseksi (eli kun ADCCON.6=1, aloita ADC-siirtymä) (3) Olkoon ADCCON1 |= 0x40 aloittaakseen ADC:n yksittäisen muunnoksen (4) Käytä lausetta while(!( ADCCON1 &0x80)) Odota ADC-siirtymän loppua (5) Muunnostulos tallennetaan ADCH[7:0] (8 bittiä korkea), ADCH [7:2] (6 bittiä alempi) ja välitetään: arvo = ADCL >>2; arvo |= (ADCH <<6);
Tallenna muunnostulos arvoon (6) Lopuksi käytetään kaavaalämpötila= arvo*0,06229-311,43, laske lämpötilan arvo ja palautus CC2430-vinkitViimeisestä kaavasta täytyy olla hämmentynyt, miksi vain kertaluonteinen funktio? Miksi sen kulmakerros on 0,06229 ja leikkauspiste 211,43? OK, tässä on vastaus: Tämä lämpötila-anturi sijaitsee CC2430-piirin sisällä, joten sen kuvaus löytyy varmasti sen käyttöohjeesta. Totta kai, olen täälläSähkötekniset tiedotAsiaankuuluva sisältö löytyy tästä osiosta, ja kuvakaappaus on seuraava:
Tämä taulukko kuvaa lämpötila-anturin lämpötilan (°C) suhteessa lähtöjännitteeseen (V). Ensimmäinen vilkaisu toiseen punaiseen laatikkoon:Lämpötilakerroin。 "Kerroin"? Eikö tunnu vähän? Katso sitten sen yksikköä: mV/°C, ja huomaat yhtäkkiä, että lämpötilan ja jännitteen välinen suhde on lineaarinen~ Eli: missä V on lähtöjännitearvo, T on lämpötilaarvo ja 2,45 on kaltevuus. Leikkauspiste b on määritettävä alla. Ensisilmäyksellä näemme ensimmäisestä punaisesta laatikosta, että jännite 0°C:ssa on 743mV, eli b on 743? Muuten, jos jatkat alaspäin katsomista, huomaat, että sen absoluuttinen virhe saavuttaa jopa 8°C! Kun katsomme oikealle, näemme, että se tarjoaa jo sopivimman leikkauspisteen, eli: b=763, joten on seuraava kaava: OK, nyt meillä on jo lämpötila-anturiSisään lämpötila TjaLähtöjännite VSeuraava askel on löytää ADCTulojännite VjaLähtöarvo N(eli 14 bitin muunnostulos), ja lopuksi löydetään N ja T muunnoslauseke. Muunnostulos N on 14 bittiä, ja kun N = 1111 1111 1111 1111 (binäärinen), lähtöjännitteen tulisi olla maksimiarvo (eli viitejännite 1,25V). Näin ollen meillä on seuraava suhteellinen suhde:
(Huomautus: Koska 14 bitin ulostulo on binäärinen komplementti, 14. bitti on symbolin bitti.) Eli absoluuttisesti efektiivinen arvo on vain 13 bittiä, eli se on 2 potenssia 13:een) Yhdistämällä nämä kaksi kaavaa, T:n ja N:n välinen suhde voidaan johtaa: YLI~
Lopuksi muutama sana siitä, miksi näytettä kohden vaaditaan 64 sykliä. Koska anturit ovat väistämättä alttiita häiriöille tai satunnaisille virheille lämpötilaa mitatessa, antureiden saamia tietoja liioitellaan joskus (esimerkiksi äkillinen 10°C:n muutos ja sitten välitön palautus normaaliksi). Mutta tiedämme, että lämpötilan muutos on olennainen prosessi, ja on harvinaista, että suuri hyppy tapahtuu hetkessä). Siksi käytämme keskimääräistä menetelmää tällaisten virheiden vähentämiseksi. (4) Kokeelliset tuloksetAvaa ensin sarjaportin debuggaustyökalu, lataa ohjelma ja käynnistä se, jolloin seuraava näyttö ilmestyy:
Filmin sisälämpötila on noin 14,5°C. Kirjoittaja tuntee makuusalin huoneenlämpöä kehollaan, joka on hieman yli 10°C. Sirun sisäpuolelle täytyy saada lämpöä, joten 14°C on käytännössä normaali~ Tämä on kokeen loppu. 3. JohtopäätösTässä artikkelissa kuvataan ADC:n yksittäisotannan toteutus. Seuraavassa osiossa esittelemme tiedonsiirtotilanDMA(suora muistin käyttö), eli "suora muistikäyttö". Oheisyksiköt, kuten ADC/UART/RF-lähetinvastaanottimet ja muistilaitteet, voidaan vaihtaa suoraan "DMA-ohjaimen" ohjauksessaVain vähän prosessorin puuttumista tarvitaan, mikä parantaa järjestelmän kokonaistehokkuutta merkittävästi. Pysy kuulolla! </n; i++); </n; i++); </n; i++); </n; i++); </n; i++);
|