Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 10718|Odgovoriti: 0

Zigbee Journey (6): Več pomembnih osnovnih eksperimentov CC2430 - ADC enojno vzorčenje

[Kopiraj povezavo]
Objavljeno na 30. 10. 2014 23:20:31 | | | |
1. Povezava zgornje in spodnje ravni

V brezžičnih senzorskih omrežjih je pomembno pretvoriti analogne vrednosti senzorjev v digitalne količine za lažji prenos in obdelavo. Za dokončanje te pretvorbe se uporablja ADC (analogno-digitalni pretvornik).

V prejšnjem razdelku smo uvedli komunikacijo s serijskim priključkom med CC2430 in računalnikom. CC2430 ima vgrajen temperaturni senzor, ta del pa bo izvedel preprost eksperiment za spremljanje temperature na čipu, ki temelji na prejšnjem razdelku: uporabite ADC za pretvorbo napetostne vrednosti temperaturnega senzorja na čipu v digitalno količino, uporabite formulo za izračun temperature, nato pa prenesite temperaturno vrednost računalniku preko serijskega priključka in jo prikažejo.

2. Enkratno vzorčenje ADC(1) Uvod v eksperiment

ADC se uporablja za pretvorbo temperature temperaturnega senzorja CC2430 na čipu, temperaturna vrednost pa se prek serijskega priključka pošlje računalniku in prikaže.

(2) Shema poteka programa

(3) Eksperimentalna izvorna koda in analiza/*
    Eksperimentalni opis: Eksperiment zajemanja temperature v čipu pošlje podatke računalniku preko serijskega priključka 0
*/

#include

#define vodil1 P1_0
#define vod2 P1_1
#define Led3 P1_2
#define vodil 4 P1_3

/*32M晶振初始化
-------------------------------------------------------*/
prazninaxtal_init(praznina)
{
  SPANJE &= ~0x04;            //都上电
  medtem ko(! (SPANJE &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         Izberite 32MHz kristalni oscilator
  SPANJE |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
prazninaled_init(praznina)
{
  P1SEL =0x00;         P1 je običajen vhodno-izhodni priključek
  P1DIR |=0x0F;         izhod P1.0 P1.1 P1.2 P1.3
  
  led1 =1;
  led2 =1;
  led3 =1;
  led4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
praznina  Uart0Init(nepodpisano charStopBits,nepodpisano charPariteta)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    nastavi na način UART in omogoči akceptor
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| Enakost;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
praznina  Uart0Send(nepodpisano charpodatki)
{
  medtem ko(U0CSR&0x01);   //等待UART空闲时发送数据
  U0DBUF = podatki;
}

/*UART0发送字符串
-------------------------------------------------------*/
prazninaUart0SendString(nepodpisano char*s)
{
  medtem ko(*s !=0)
    Uart0Send(*s++);
}

/*UART0接收数据
-------------------------------------------------------*/
nepodpisano charUart0Receive(praznina)
{
  nepodpisano charpodatke;
  medtem ko(! (U0CSR&0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF;
  Vrnitevpodatke;
}

/*延时函数
-------------------------------------------------------*/
prazninaZakasnitev(nepodpisano intn)
{
  nepodpisano inti;
  za(i=0; i<n; i++);
  za(i=0; i<n; i++);
  za(i=0; i<n; i++);
  za(i=0; i<n; i++);
  za(i=0; i<n; i++);
}

/*得到实际温度值
-------------------------------------------------------*/
PlovecgetTemperature(praznina)
{
  nepodpisano int  vrednost;

  ADCCON3 = (0x3E);                  //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
   
  ADCCON1 |=0x30;                    //选择ADC的启动模式为手动
  ADCCON1 |=0x40;                    Začni konverzije AD            
   
  medtem ko(! (ADCCON1 &0x80));           //等待ADC转化结束

  vrednost = ADCL >>2;
  vrednost |= (ADCH <<6);               //取得最终转化结果,存入value中
  
  VrnitevVrednost*0.06229-311.43;        //根据公式计算出温度值
}

/*主函数
-------------------------------------------------------*/
prazninamain(praznina)
{
  chari;
  PlovecavgTemp;
  nepodpisano charoutput[]="";
        
  xtal_init();
  led_init();
  
  led1 =0;

  Uart0Init(0x00, 0x00);   //初始化串口:无奇偶校验,停止位为1位

  Uart0SendString("Pozdravljen CC2430 - Temperaturni senzor!");

  medtem ko(1)
  {
    led1 =0;
    avgTemp =0;
    za(i =0; i <64; i++)
    {
      avgTemp += getTemperature();
      avgTemp = avgTemp/2;            //每采样1次,取1次平均值
    }
   
    Izhod[0] = (nepodpisano char)(avgTemp)/10 + 48;         //十位
    Izhod[1] = (nepodpisano char)(avgTemp)%10 + 48;         //个位
    Izhod[2] ='.';                                       //小数点
    Izhod[3] = (nepodpisano char)(avgTemp*10)%10+48;         //十分位
    Izhod[4] = (nepodpisano char)(avgTemp*100)%10+48;        //百分位
    izhod[5] ='';                                      //字符串结束符
   
    Uart0SendString(izhod);
    Uart0SendString("°C");
    led1 =1;                          //LED熄灭,表示转换结束,
   
    Zakasnitev(20000);
    Zakasnitev(20000);
    Zakasnitev(20000);
    Zakasnitev(20000);
    Zakasnitev(20000);
    Zakasnitev(20000);
    Zakasnitev(20000);
    Zakasnitev(20000);
    Zakasnitev(20000);
    Zakasnitev(20000);
  }
}

Za vsebino kode serijske komunikacije glejte prejšnji razdelek, ki tukaj ne bo pojasnjen~

ADC-ji običajno vključujejo 6 SFR-jev:

ADCCON1Za splošno upravljanje ADC, vključno z zastavico konca konverzije, metodo sprožilca ADC, generatorjem naključnih števil
ADCCON2Konfiguracija za neprekinjeno pretvorbo ADC (ta eksperiment ne vključuje neprekinjene pretvorbe ADC in zato ne uporablja tega SFR)
ADCCON3Konfiguracija za eno pretvorbo ADC, vključno z izbiro referenčne napetosti, ločljivosti, izvora pretvorbe
ADCH[7:0]Visoka stopnja pretvorbe ADC, tj. ADC [13:6]
ADCL[7:2]Nizka raven pretvorbe ADC, torej ADC [5:0]
ADCCFGAIN0~AIN7 s P0.0~P0.7 kot ADC vhodom (ta SFR se ne uporablja, ker je v tem testu kot vir pretvorbe izbran temperaturni senzor na čipu in ne vključuje AIN0~AIN7)

(Opomba: Za zgornje podrobnosti o SFR prosim glejte kitajski priročnik CC2430)

Nato se osredotočimo na togetTempuraturefunkcije, ki je ključna za pridobitev temperature vrednosti:

(1) Najprej konfigurirajte ADC za eno samsko vzorčenje: nastavite ADCCON3=0x3E, izberite 1,25V kot sistemsko napetost, izberite 14-bitno ločljivost in izberite temperaturni senzor CC2430 na čipu kot vir pretvorbe ADC

(2) Nato nastavite ADCCON1 |= 0x30 za ročno nastavitev ADC sprožilne metode (tj. ko ADCCON.6=1 začnete prehod ADC)

(3) Nato naj ADCCON1 |= 0x40 za začetek enojne pretvorbe ADC

(4) Uporabi izjavo while(!( ADCCON1 &0x80)) Počakajte na konec prehoda na ADC

(5) Rezultat pretvorbe se shrani v ADCH[7:0] (8 bitov višje), ADCH [7:2] (6 bitov nižje) in preide:

    vrednost = ADCL >>2;
    vrednost |= (ADCH <<6);   

Shrani rezultat pretvorbe v vrednost

(6) Na koncu uporabimo formulotemperatura= vrednost*0,06229-311,43, izračunaj temperaturo in vrni

Nasveti za CC2430
Verjetno te zadnja formula zmede, zakaj enkratna funkcija? Zakaj ima naklon 0,06229 in presečišče 211,43? V redu, tukaj je odgovor:
Ta temperaturni senzor se nahaja znotraj CC2430 čipa, zato je njegov opis zagotovo mogoče najti v priročniku. In res, tukaj semElektrične specifikacijeRelevantna vsebina je na voljo v tem razdelku, posnetek zaslona pa je naslednji:
Ta tabela opisuje temperaturo (°C) temperaturnega senzorja glede na izhodno napetost (V).
Najprej poglejte drugo rdečo škatlo:Temperaturni koeficient。 "Koeficient"? Se ti ne zdi malo? Nato poglejte njegovo enoto: mV/°C, in nenadoma boste ugotovili, da je razmerje med temperaturo in napetostjo linearno~ Torej:
kjer je V vrednost izhodne napetosti, T vrednost temperature, 2,45 pa naklon. Prestreznik b je treba določiti spodaj.
Na prvi pogled bomo na prvi rdeči škatli ugotovili, da je napetost pri 0°C 743 mV, torej je b enako 743? Če boste še naprej gledali navzdol, boste ugotovili, da absolutna napaka doseže tudi do 8°C! Če pogledamo desno, vidimo, da že zagotavlja najbolj primeren presečišče, tj.: b=763, zato obstaja naslednja formula:
V redu, zdaj že imamo temperaturni senzorVnesite temperaturo TinIzhodna napetost VNaslednji korak je najti ADC-jaVhodna napetost VinIzhodna vrednost N(tj. rezultat pretvorbe 14 bitov) in končno najdemo formulo za pretvorbo N in T.
Rezultat pretvorbe N je 14 bitov, in ko je N=11 1111 1111 1111 1111 (binarno), naj bo izhodna napetost največja vrednost (tj. referenčna napetost 1,25V). Zato imamo naslednji proporcionalni odnos:
(Opomba: Ker je izhod 14 bitov binarni komplement, je 14. bit simbolni bit.) Torej je v absolutnih vrednostih efektivna vrednost le 13 bitov, torej 2 na potenco 13)
S kombinacijo obeh formul lahko izpeljemo razmerje med T in N:
KONEC~

Nazadnje nekaj besed o tem, zakaj je na vzorec potrebnih 64 ciklov. Ker so senzorji neizogibno izpostavljeni motnjam ali naključnim napakam pri merjenju temperature, so podatki, ki jih pridobijo senzorji, včasih pretirani (na primer nenadna sprememba za 10°C in nato takojšen povratek v normalno stanje). Vemo pa, da je sprememba temperature sestavni proces in redko se zgodi velik skok v trenutku). Zato uporabljamo metodo povprečja za zmanjšanje takšnih napak.

(4) Eksperimentalni rezultati

Najprej odprite orodje za razhroščevanje serijskih portov, nato prenesite program in ga zaženete, in prikazal se bo naslednji zaslon:

Temperatura znotraj filma je približno 14,5 °C. Avtor s svojim telesom začuti sobno temperaturo spalnice, ki je malo več kot 10 °C. Notranjost čipa potrebuje nekaj toplote, zato je 14°C praktično normalno~

To je konec eksperimenta.

3. Zaključek

Ta članek opisuje implementacijo enotnega vzorčenja ADC. V naslednjem razdelku bomo predstavili način prenosa podatkovDMA(neposreden dostop do pomnilnika), torej "neposreden dostop do pomnilnika". Periferne enote, kot so ADC/UART/RF oddajniki in pomnilniške naprave, je mogoče izmenjovati neposredno pod nadzorom "DMA krmilnika"Potrebna je majhna intervencija procesorja, kar močno izboljša splošno učinkovitost sistema.

Ostanite z nami!


</n; i++);
</n; i++);
</n; i++);
</n; i++);
</n; i++);




Prejšnji:Zigbee Journey (5): Več pomembnih osnovnih eksperimentov CC2430 – serijska komunikacija
Naslednji:Zigbee Journey (7): Več pomembnih osnovnih eksperimentov CC2430 - prenos DMA
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com