Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 10718|Răspunde: 0

Zigbee Journey (6): Câteva experimente importante de bază CC2430 - ADC eșantionare unică

[Copiază linkul]
Postat pe 30.10.2014 23:20:31 | | | |
1. Conectarea nivelurilor superioare și inferioare

În rețelele de senzori wireless, este important să se convertească valorile analogice ale senzorilor în cantități digitale pentru o transmitere și procesare ușoară. ADC (Convertor Analog-Digital) este folosit pentru a finaliza această conversie.

În secțiunea anterioară, am introdus comunicarea prin port serial între CC2430 și un PC. CC2430 are un senzor de temperatură încorporat în interior, iar această secțiune va implementa un experiment simplu de monitorizare a temperaturii pe chip, bazat pe secțiunea anterioară: folosește ADC-ul pentru a converti valoarea de tensiune a senzorului de temperatură integrat într-o cantitate digitală, folosește formula pentru a calcula valoarea temperaturii, apoi transmite valoarea de temperatură către PC prin portul serial și afișează-l.

2. ADC eșantionare unică(1) Introducere în experiment

ADC-ul este folosit pentru a converti valoarea temperaturii senzorului de temperatură CC2430 din cip, iar valoarea temperaturii este trimisă către PC prin portul serial și afișată.

(2) Diagramă de flux a programului

(3) Cod sursă experimental și analiză/*
    Descriere experimentală: Experimentul de achiziție a temperaturii din cip trimite datele către PC prin portul serial 0
*/

#include

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

/*32M晶振初始化
-------------------------------------------------------*/
Voidxtal_init(Void)
{
  SOMN &= ~0x04;            //都上电
  în timp ce(! (SOMN &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         Alege un oscilator cu cristal de 32MHz
  SLEEP |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
Voidled_init(Void)
{
  P1SEL =0x00;         P1 este portul normal de I/O
  P1DIR |=0x0F;         Ieșire P1.0 P1.1 P1.2 P1.3
  
  a condus1 =1;
  led2 =1;
  led3 =1;
  led4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
Void  Uart0Init(nesemnat CharStopBits,nesemnat CharParitate)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    setează pe modul UART și activează acceptorul
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| Paritate;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
Void  Uart0Send(nesemnat Chardate)
{
  în timp ce(U0CSR&0x01);   //等待UART空闲时发送数据
  U0DBUF = date;
}

/*UART0发送字符串
-------------------------------------------------------*/
VoidUart0SendString(nesemnat Char*s)
{
  în timp ce(*s !=0)
    Uart0Send(*s++);
}

/*UART0接收数据
-------------------------------------------------------*/
nesemnat CharUart0Receive(Void)
{
  nesemnat Chardate;
  în timp ce(! (U0CSR&0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF;
  Întoarcereadate;
}

/*延时函数
-------------------------------------------------------*/
VoidÎntârziere(nesemnat intn)
{
  nesemnat inti;
  pentru(i=0; i<n; i++);
  pentru(i=0; i<n; i++);
  pentru(i=0; i<n; i++);
  pentru(i=0; i<n; i++);
  pentru(i=0; i<n; i++);
}

/*得到实际温度值
-------------------------------------------------------*/
FloatgetTemperature(Void)
{
  nesemnat int  valoare;

  ADCCON3 = (0x3E);                  //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
   
  ADCCON1 |=0x30;                    //选择ADC的启动模式为手动
  ADCCON1 |=0x40;                    Inițiați conversiile AD            
   
  în timp ce(! (ADCCON1 &0x80));           //等待ADC转化结束

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

/*主函数
-------------------------------------------------------*/
Voidmain(Void)
{
  Chari;
  FloatavgTemp;
  nesemnat Charoutput[]="";
        
  xtal_init();
  led_init();
  
  a condus1 =0;

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

  Uart0SendString("Salut CC2430 - TempSensor!");

  în timp ce(1)
  {
    a condus1 =0;
    avgTemp =0;
    pentru(i =0; i <64; i++)
    {
      avgTemp += getTemperature();
      avgTemp = avgTemp/2;            //每采样1次,取1次平均值
    }
   
    Ieșire[0] = (nesemnat Char(avgTemp)/10 + 48;         //十位
    Ieșire[1] = (nesemnat Char(mgTemp)%10 + 48;         //个位
    Ieșire[2] ='.';                                       //小数点
    Ieșire[3] = (nesemnat Char(mgTemp*10)%10+48;         //十分位
    Ieșire[4] = (nesemnat Char(mgTemp*100)%10+48;        //百分位
    output[5] ='';                                      //字符串结束符
   
    Uart0SendString (ieșire);
    Uart0SendString("°C");
    a condus1 =1;                          //LED熄灭,表示转换结束,
   
    Întârziere(20000);
    Întârziere(20000);
    Întârziere(20000);
    Întârziere(20000);
    Întârziere(20000);
    Întârziere(20000);
    Întârziere(20000);
    Întârziere(20000);
    Întârziere(20000);
    Întârziere(20000);
  }
}

Pentru conținutul codului comunicării prin porturi seriale, vă rugăm să consultați secțiunea anterioară, care nu va fi explicată aici~

ADC-urile implică, în general, 6 SFR-uri:

ADCCON1Pentru controlul general al ADC, inclusiv flag de conversie, metoda declanșării ADC, generatorul de numere aleatoare
ADCCON2Configurație pentru conversia continuă a ADC-urilor (acest experiment nu implică conversia continuă a ADC-ului și, prin urmare, nu folosește acest SFR)
ADCCON3Configurație pentru o singură conversie ADC, inclusiv selecția tensiunii de referință, rezoluției, sursei de conversie
ADCH[7:0]Nivelul ridicat al rezultatului conversiei ADC, adică ADC [13:6]
ADCL[7:2]Nivelul scăzut al rezultatului conversiei ADC, adică ADC [5:0]
ADCCFGAIN0~AIN7 cu P0.0~P0.7 ca intrare ADC (acest SFR nu este folosit deoarece senzorul de temperatură din cip este selectat ca sursă de conversie în acest test și nu implică AIN0~AIN7)

(Notă: Vă rugăm să consultați manualul chinezesc CC2430 pentru detaliile SFR de mai sus)

Apoi, să ne concentrăm pe astagetTempuraturefuncție, care este cheia pentru a obține valoarea temperaturii:

(1) Mai întâi, configurați ADC-ul pentru o singură eșantionare: setați ADCCON3=0x3E, selectați 1,25V ca tensiune de sistem, selectați rezoluția pe 14 biți și selectați senzorul de temperatură CC2430 integrat pe cip ca sursă de conversie ADC

(2) Apoi setați ADCCON1 |= 0x30 pentru a seta metoda de declanșare ADC pe manual (adică, când ADCCON.6=1, începeți tranziția ADC)

(3) Atunci să ADCCON1 |= 0x40 pentru a începe conversia unică ADC

(4) Folosește afirmația în timp ce(!( ADCCON1 & 0x80)) Așteaptă sfârșitul tranziției ADC

(5) Rezultatul conversiei este stocat în ADCH[7:0] (8 biți înălțime), ADCH [7:2] (cu 6 biți mai jos) și este trecut:

    valoare = ADCL >>2;
    valoarea |= (ADCH <<6);   

Salvează rezultatul conversiei în valoare

(6) În final, folosiți formulatemperatură= valoare*0,06229-311,43, calculează valoarea temperaturii și returul

Sfaturi CC2430
Trebuie să fii nedumerit de ultima formulă, de ce o funcție unică? De ce are o pantă de 0,06229 și o interceptare de 211,43? OK, iată răspunsul:
Acest senzor de temperatură este amplasat în interiorul cipului CC2430, așa că descrierea sa poate fi găsită cu siguranță în manualul său. Sigur, sunt aiciSpecificații electriceConținutul relevant se găsește în această secțiune, iar captura de ecran este următoarea:
Acest tabel descrie temperatura (°C) senzorului de temperatură în raport cu tensiunea de ieșire (V).
Prima privire la a doua cutie roșie:Coeficient de temperatură。 "Coeficient"? Nu se simte puțin? Apoi uită-te la unitatea sa: mV/°C, și vei realiza brusc că relația dintre temperatură și tensiune este liniară~ Adică:
unde V este valoarea tensiunii de ieșire, T este valoarea temperaturii, iar 2,45 este panta. Interceptarea b trebuie determinată mai jos.
La prima vedere, vom vedea la prima cutie roșie că tensiunea la 0°C este 743mV, deci b este egal cu 743? Altfel, dacă continui să privești în jos, vei observa că eroarea absolută ajunge până la 8°C! Apoi, privind spre dreapta, vom vedea că deja oferă cel mai potrivit intercept, adică: b=763, deci există următoarea formulă:
OK, acum avem deja senzorul de temperaturăIntroduceți temperatura TșiTensiunea de ieșire VUrmătorul pas este să găsești ADC-ulTensiunea de intrare VșiValoarea de ieșire N(adică, rezultatul conversiei de 14 biți), și în final găsesc formula de conversie a lui N și T.
Rezultatul conversiei N este de 14 biți, iar când N=11 1111 1111 1111 (binar), tensiunea de ieșire ar trebui să fie valoarea maximă (adică tensiunea de referință 1,25V). Prin urmare, avem următoarea relație proporțională:
(Notă: Deoarece ieșirea a 14 biți este un complement binar, al 14-lea bit este bitul simbolului.) Deci, în termeni absoluți, valoarea efectivă este doar 13 biți, deci este 2 la puterea 13)
Combinând cele două formule, relația dintre T și N poate fi derivată:
TERMINAT~

În final, câteva cuvinte despre motivul pentru care sunt necesare 64 de cicluri pe eșantion. Deoarece senzorii sunt inevitabil supuși interferențelor sau erorii aleatorii la măsurarea temperaturii, datele obținute de senzori sunt uneori exagerate (de exemplu, o schimbare bruscă de 10°C și apoi o revenire instantanee la normal). Dar știm că schimbarea temperaturii este un proces integral și este rar ca un salt mare să aibă loc într-o clipă). Prin urmare, folosim metoda medie pentru a reduce astfel de erori.

(4) Rezultate experimentale

Mai întâi, deschide instrumentul de depanare a porturilor seriale, apoi descarcă programul și pornește-l, iar următorul ecran va apărea:

Temperatura din interiorul filmului este de aproximativ 14,5°C. Autorul simte temperatura camerei în cămin împreună cu corpul său, care este puțin peste 10°C. Interiorul cipului are nevoie de căldură, deci 14°C este practic normal~

Acesta este sfârșitul experimentului.

3. Concluzie

Acest articol descrie implementarea ADC single-sampling. În secțiunea următoare, vom introduce un mod de transfer de dateDMA(acces direct la memorie), adică "acces direct la memorie". Unitățile periferice precum transceiverele ADC/UART/RF și dispozitivele de memorie pot fi schimbate direct sub controlul "controlerului DMA"Este necesară puțină intervenție a CPU-ului, ceea ce îmbunătățește considerabil eficiența generală a sistemului.

Rămâneți pe aproape!


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




Precedent:Zigbee Journey (5): Câteva experimente importante de bază CC2430 - comunicare serială
Următor:Zigbee Journey (7): Mai multe experimente importante de bază CC2430 - transmisia DMA
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com