Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 10718|Atbildi: 0

Zigbee ceļojums (6): Vairāki svarīgi CC2430 pamata eksperimenti - ADC viena paraugu ņemšana

[Kopēt saiti]
Publicēts 30.10.2014 23:20:31 | | | |
1. Augšējā un apakšējā līmeņa savienošana

Bezvadu sensoru tīklos ir svarīgi pārvērst sensoru analogās vērtības ciparu lielumos, lai tos varētu viegli pārraidīt un apstrādāt. Lai pabeigtu šo konvertēšanu, tiek izmantots ADC (Analog-to-Digital Converter).

Iepriekšējā sadaļā mēs ieviesām seriālā porta sakarus starp CC2430 un datoru. CC2430 iekšpusē ir iebūvēts temperatūras sensors, un šajā sadaļā tiks īstenots vienkāršs eksperiments par mikroshēmas temperatūras uzraudzību, pamatojoties uz iepriekšējo sadaļu: izmantojiet ADC, lai pārvērstu mikroshēmas temperatūras sensora sprieguma vērtību digitālā daudzumā, izmantojiet formulu, lai aprēķinātu temperatūras vērtību, un pēc tam pārsūtiet temperatūras vērtību uz datoru caur seriālo portu un parādiet to.

2. ADC vienreizēja paraugu ņemšana(1) Ievads eksperimentā

ADC tiek izmantots, lai pārveidotu CC2430 mikroshēmas temperatūras sensora temperatūras vērtību, un temperatūras vērtība tiek nosūtīta uz datoru caur seriālo portu un parādīta.

(2) Programmas plūsmas diagramma

(3) Eksperimentālais pirmkods un analīze/*
    Eksperimenta apraksts: mikroshēmas temperatūras iegūšanas eksperiments nosūta datus uz datoru, izmantojot seriālo portu 0
*/

#include

#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3

/*32M晶振初始化
-------------------------------------------------------*/
Tukšumsxtal_init (Tukšums)
{
  MIEGS &= ~0x04;            //都上电
  kamēr(! (MIEGS &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         Izvēlieties 32MHz kristāla oscilatoru
  MIEGS |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
Tukšumsled_init (Tukšums)
{
  P1SEL =0x00;         P1 ir parastais I/O ports
  P1DIR |=0x0F;         P1.0 P1.1 P1.2 P1.3 izeja
  
  led1 =1;
  led2 =1;
  led3 =1;
  led4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
Tukšums  Uart0Init(bez paraksta oglesStopBits,bez paraksta oglesParitāte)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    iestatiet UART režīmu un iespējojiet akceptoru
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| Paritāte;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
Tukšums  Uart0Sūtīt(bez paraksta oglesdati)
{
  kamēr(U0CSR &0x01);   //等待UART空闲时发送数据
  U0DBUF = dati;
}

/*UART0发送字符串
-------------------------------------------------------*/
TukšumsUart0SendString(bez paraksta ogles*s)
{
  kamēr(*s !=0)
    Uart0Sūtīt(*s++);
}

/*UART0接收数据
-------------------------------------------------------*/
bez paraksta oglesUart0Saņemt(Tukšums)
{
  bez paraksta oglesdati;
  kamēr(! (U0CSR &0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF;
  Atgriešanāsdati;
}

/*延时函数
-------------------------------------------------------*/
TukšumsKavēšanās(bez paraksta intn)
{
  bez paraksta inti;
  par(i =0; i<n; i++);
  par(i =0; i<n; i++);
  par(i =0; i<n; i++);
  par(i =0; i<n; i++);
  par(i =0; i<n; i++);
}

/*得到实际温度值
-------------------------------------------------------*/
pludiņšgetTemperature(Tukšums)
{
  bez paraksta int  vērtība;

  ADCCON3 = (0x3E);                  //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
   
  ADCCON1 |=0x30;                    //选择ADC的启动模式为手动
  ADCCON1 |=0x40;                    Reklāmu reklāmguvumu iniciēšana            
   
  kamēr(! (ADCCON1 &0x80));           //等待ADC转化结束

  vērtība = ADCL >>2;
  vērtība |= (ADCH <<6);               //取得最终转化结果,存入value中
  
  AtgriešanāsVērtība*0.06229-311.43;        //根据公式计算出温度值
}

/*主函数
-------------------------------------------------------*/
Tukšumsgalvenais(Tukšums)
{
  oglesi;
  pludiņšvidējais temps;
  bez paraksta oglesizeja[]="";
        
  xtal_init ();
  led_init ();
  
  led1 =0;

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

  Uart0SendString("Sveiki CC2430 - TempSensor!");

  kamēr(1)
  {
    led1 =0;
    avgTemp =0;
    par(i =0; i <64; i++)
    {
      avgTemp += getTemperature();
      avgTemp = avgTemp/2;            //每采样1次,取1次平均值
    }
   
    Rezultāts[0] = (bez paraksta ogles)(avgTemp)/10 + 48;         //十位
    Rezultāts[1] = (bez paraksta ogles)(vidgTemp)%10 + 48;         //个位
    Rezultāts[2] ='.';                                       //小数点
    Rezultāts[3] = (bez paraksta ogles)(avgTemp*10)%10+48;         //十分位
    Rezultāts[4] = (bez paraksta ogles)(avgTemp*100)%10+48;        //百分位
    Iznākums[5] ='';                                      //字符串结束符
   
    Uart0SendString(izvade);
    Uart0SendString("°C");
    led1 =1;                          //LED熄灭,表示转换结束,
   
    Kavēšanās(20000);
    Kavēšanās(20000);
    Kavēšanās(20000);
    Kavēšanās(20000);
    Kavēšanās(20000);
    Kavēšanās(20000);
    Kavēšanās(20000);
    Kavēšanās(20000);
    Kavēšanās(20000);
    Kavēšanās(20000);
  }
}

Par seriālā porta sakaru koda saturu, lūdzu, skatiet iepriekšējo sadaļu, kas šeit netiks izskaidrota~

ADC parasti ietver 6 SFR:

ADCCON1ADC vispārējai kontrolei, ieskaitot pārveidošanas beigu karodziņu, ADC trigera metodi, nejaušo skaitļu ģeneratoru
ADCCON2Konfigurācija nepārtrauktai ADC pārveidošanai (šis eksperiments neietver nepārtrauktu ADC konvertēšanu un tāpēc neizmanto šo SFR)
ADCCON3Konfigurācija vienai ADC pārveidošanai, ieskaitot atskaites sprieguma, izšķirtspējas, pārveidošanas avota izvēli
ADCH[7:0]ADC konversijas rezultāta augstais līmenis, t.i., ADC [13:6]
ADCL[7:2]ADC konversijas rezultāta zemais līmenis, t.i., ADC [5:0]
ADCCFGAIN0 ~ AIN7 ar P0.0 ~ P0.7 kā ADC ieeju (šis SFR netiek izmantots, jo mikroshēmas temperatūras sensors šajā testā ir izvēlēts kā pārveidošanas avots un neietver AIN0 ~ AIN7)

(Piezīme: Lūdzu, skatiet CC2430 ķīniešu rokasgrāmatu, lai iegūtu iepriekš minēto SFR informāciju)

Tālāk koncentrēsimies uz togetTempuraturefunkcija, kas ir atslēga temperatūras vērtības iegūšanai:

(1) Vispirms konfigurējiet ADC vienai paraugu ņemšanai: iestatiet ADCCON3=0x3E, atlasiet 1.25 V kā sistēmas spriegumu, atlasiet 14 bitu izšķirtspēju un atlasiet CC2430 mikroshēmas temperatūras sensoru kā ADC pārveidošanas avotu

(2) Pēc tam iestatiet ADCCON1 |= 0x30, lai iestatītu ADC trigera metodi uz manuālu (t.i., kad ADCCON.6=1, sāciet ADC pāreju)

(3) Pēc tam ļaujiet ADCCON1 |= 0x40, lai sāktu ADC vienu konvertēšanu

(4) Izmantojiet apgalvojumu, kamēr (!( ADCCON1 &0x80)) Pagaidiet ADC pārejas beigas

(5) Konvertēšanas rezultāts tiek saglabāts ADCH[7:0] (8 bitu augsts), ADCH [7:2] (6 biti zemāks) un nodots:

    vērtība = ADCL >>2;
    vērtība |= (ADCH <<6);   

Saglabājiet reklāmguvuma rezultātu vērtībā

(6) Visbeidzot, izmantojiet formulutemperatūra = vērtība * 0,06229-311,43, aprēķināt temperatūras vērtību un atgriezties

CC2430 padomi
Jums ir jābūt neizpratnē par pēdējo formulu, kāpēc vienreizēja funkcija? Kāpēc tā slīpums ir 0,06229 un pārtveršana 211,43? Labi, šeit ir atbilde:
Šis temperatūras sensors atrodas CC2430 mikroshēmas iekšpusē, tāpēc tā aprakstu noteikti var atrast tās rokasgrāmatā. Protams, es esmu šeitElektriskās specifikācijasAttiecīgais saturs ir atrodams šajā sadaļā, un ekrānuzņēmums ir šāds:
Šajā tabulā aprakstīta temperatūras sensora temperatūra (°C) attiecībā pret izejas spriegumu (V).
Vispirms apskatiet otro sarkano lodziņu:temperatūras koeficients。 "Koeficients"? Vai tas nejūtas mazliet? Tad paskatieties uz tā vienību: mV / °C, un jūs pēkšņi sapratīsiet, ka attiecības starp temperatūru un spriegumu ir lineāras ~ Tas ir:
kur V ir izejas sprieguma vērtība, T ir temperatūras vērtība un 2,45 ir slīpums. Pārtveršana b jānosaka turpmāk.
No pirmā acu uzmetiena pirmajā sarkanajā lodziņā mēs atradīsim, ka spriegums pie 0 ° C ir 743 mV, tātad b ir vienāds ar 743? Pretējā gadījumā, ja jūs turpināsiet skatīties uz leju, jūs atradīsiet, ka tā absolūtā kļūda sasniedz pat 8°C! Tad skatoties pa labi, mēs redzēsim, ka tas jau nodrošina vispiemērotāko pārtveršanu, t.i.: b=763, tāpēc ir šāda formula:
Labi, tagad mums jau ir temperatūras sensorsIevadiet temperatūru TunIzejas spriegums VNākamais solis ir atrast ADCIeejas spriegums VunIzejas vērtība N(t.i., 14 bitu konversijas rezultāts) un visbeidzot atrodiet N un T konversijas formulu.
Pārveidošanas rezultāts N ir 14 biti, un, ja N=11 1111 1111 1111 (binārs), izejas spriegumam jābūt maksimālajai vērtībai (t.i., atsauces spriegumam 1.25V). Tāpēc mums ir šādas proporcionālas attiecības:
(Piezīme: Tā kā 14 bitu izvade ir binārs papildinājums, 14. bits ir simbola bits.) Tātad absolūtā izteiksmē efektīvā vērtība ir tikai 13 biti, tātad tā ir 2 līdz 13 bitiem)
Apvienojot abas formulas, var iegūt attiecības starp T un N:
VIRS ~

Visbeidzot, daži vārdi par to, kāpēc vienam paraugam ir nepieciešami 64 cikli. Tā kā sensori neizbēgami tiek pakļauti traucējumiem vai nejaušām kļūdām, mērot temperatūru, sensoru iegūtie dati dažkārt ir pārspīlēti (piemēram, pēkšņas 10 ° C izmaiņas un pēc tam tūlītēja atgriešanās normālā stāvoklī). Bet mēs zinām, ka temperatūras izmaiņas ir neatņemams process, un tas ir reti, ka liels lēciens notiek vienā mirklī). Tāpēc mēs izmantojam vidējo metodi, lai samazinātu šādas kļūdas.

(4) Eksperimenta rezultāti

Vispirms atveriet seriālā porta atkļūdošanas rīku, pēc tam lejupielādējiet programmu un startējiet to, un parādīsies šāds ekrāns:

Temperatūra plēves iekšpusē ir aptuveni 14,5°C. Autors ar savu ķermeni izjūt kopmītnes istabas temperatūru, kas ir aptuveni nedaudz virs 10°C. Mikroshēmas iekšpusei ir jāsaņem siltums, tāpēc 14 ° C būtībā ir normāli ~

Tas ir eksperimenta beigas.

3. Secinājums

Šajā rakstā ir aprakstīta ADC vienas izlases ieviešana. Nākamajā sadaļā mēs ieviesīsim datu pārsūtīšanas režīmuDMA(tieša piekļuve atmiņai), tas ir, "tieša piekļuve atmiņai". Perifērijas ierīces, piemēram, ADC/UART/RF raiduztvērēji un atmiņas ierīces, var tikt apmainītas tieši "DMA kontroliera" vadībāNepieciešama neliela CPU iejaukšanās, kas ievērojami uzlabo sistēmas vispārējo efektivitāti.

Sekojiet līdzi!


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




Iepriekšējo:Zigbee ceļojums (5): Vairāki svarīgi CC2430 pamata eksperimenti - sērijveida komunikācija
Nākamo:Zigbee ceļojums (7): Vairāki svarīgi CC2430 pamata eksperimenti - DMA pārraide
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com