Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 10718|Vastaus: 0

Zigbee Journey (6): Useita tärkeitä CC2430-peruskokeita – ADC:n yksinäytteenotto

[Kopioi linkki]
Julkaistu 30.10.2014 23.20.31 | | | |
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 kokeeseen

ADC: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:ää:

ADCCON1ADC:n yleiseen ohjaukseen, mukaan lukien muunnoksen päätelippu, ADC-laukaisumenetelmä, satunnaislukugeneraattori
ADCCON2Jatkuvan ADC-muunnoksen konfiguraatio (tässä kokeessa ei ole jatkuvaa ADC-muunnosta, joten tätä SFR:ää ei käytetä)
ADCCON3Yhden 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]
ADCCFGAIN0~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-vinkit
Viimeisestä 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 tulokset

Avaa 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ös

Tä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++);




Edellinen:Zigbee Journey (5): Useita tärkeitä CC2430-peruskokeita – sarjaviestintä
Seuraava:Zigbee Journey (7): Useita tärkeitä CC2430-peruskokeita – DMA:n siirto
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com