Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 10718|Risposta: 0

Zigbee Journey (6): Diversi importanti esperimenti di base CC2430 - ADC campionamento singolo

[Copiato link]
Pubblicato su 30/10/2014 23:20:31 | | | |
1. Collegamento tra i livelli superiori e inferiori

Nelle reti di sensori wireless, è importante convertire i valori analogici dei sensori in quantità digitali per facilitare la trasmissione e l'elaborazione. Viene utilizzato l'ADC (Analogico-Digitale Converter) per completare questa conversione.

Nella sezione precedente, abbiamo introdotto la comunicazione tramite porte seriali tra il CC2430 e un PC. CC2430 ha un sensore di temperatura incorporato all'interno, e questa sezione implementerà un semplice esperimento di monitoraggio della temperatura on-chip basato sulla sezione precedente: usare l'ADC per convertire il valore di tensione del sensore di temperatura integrato in una quantità digitale, usare la formula per calcolare il valore della temperatura, e poi trasmettere il valore di temperatura al PC tramite la porta seriale e visualizzarlo.

2. ADC singolo campionamento(1) Introduzione all'esperimento

L'ADC viene utilizzato per convertire il valore di temperatura del sensore di temperatura integrato sul chip CC2430, e il valore di temperatura viene inviato al PC tramite la porta seriale e visualizzato in modo significativo.

(2) Diagramma di flusso del programma

(3) Codice sorgente sperimentale e analisi/*
    Descrizione sperimentale: L'esperimento di acquisizione della temperatura integrato nel chip invia i dati al PC tramite la porta seriale 0
*/

#include

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

/*32M晶振初始化
-------------------------------------------------------*/
Voidxtal_init(Void)
{
  SONNO &= ~0x04;            //都上电
  mentre(! (SONNO &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         Scegli un oscillatore a cristallo a 32MHz
  SONNO |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
Voidled_init(Void)
{
  P1SEL =0x00;         P1 è la normale porta I/O
  P1DIR |=0x0F;         Uscita P1.0 P1.1 P1.2 P1.3
  
  Led1 =1;
  Led2 =1;
  led3 =1;
  Led4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
Void  Uart0Init(senza firmatura CharStopBits,senza firmatura CharParità)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    imposta la modalità UART e abilita l'accettatore
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| Parità;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
Void  Uart0Send(senza firmatura Chardati)
{
  mentre(U0CSR&0x01);   //等待UART空闲时发送数据
  U0DBUF = dati;
}

/*UART0发送字符串
-------------------------------------------------------*/
VoidUart0SendString(senza firmatura Char*s)
{
  mentre(*s !=0)
    Uart0Send(*s++);
}

/*UART0接收数据
-------------------------------------------------------*/
senza firmatura CharUart0Receive(Void)
{
  senza firmatura Chardati;
  mentre(! (U0CSR&0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF;
  Ritornodati;
}

/*延时函数
-------------------------------------------------------*/
VoidRitardo (senza firmatura intn)
{
  senza firmatura intio;
  per(i=0; i<n; i++);
  per(i=0; i<n; i++);
  per(i=0; i<n; i++);
  per(i=0; i<n; i++);
  per(i=0; i<n; i++);
}

/*得到实际温度值
-------------------------------------------------------*/
CarrogetTemperature(Void)
{
  senza firmatura int  valore;

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

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

/*主函数
-------------------------------------------------------*/
Voidmain(Void)
{
  Chario;
  CarroTemperatura media;
  senza firmatura Charoutput[]="";
        
  xtal_init();
  led_init();
  
  Led1 =0;

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

  Uart0SendString("Ciao CC2430 - Sensore di Temperatura!");

  mentre(1)
  {
    Led1 =0;
    avgTemp =0;
    per(i =0; io <64; i++)
    {
      avgTemp += getTemperature();
      avgTemp = avgTemp/2;            //每采样1次,取1次平均值
    }
   
    Output[0] = (senza firmatura Char)(avgTemp)/10 + 48;         //十位
    Output[1] = (senza firmatura Char(vgTemp)%10 + 48;         //个位
    Output[2] ='.';                                       //小数点
    Output[3] = (senza firmatura Char(mgTemp*10)%10+48;         //十分位
    Output[4] = (senza firmatura Char(mgTemp*100)%10+48;        //百分位
    output[5] ='';                                      //字符串结束符
   
    Uart0SendString(output);
    Uart0SendString("°C");
    Led1 =1;                          //LED熄灭,表示转换结束,
   
    Ritardo (20000);
    Ritardo (20000);
    Ritardo (20000);
    Ritardo (20000);
    Ritardo (20000);
    Ritardo (20000);
    Ritardo (20000);
    Ritardo (20000);
    Ritardo (20000);
    Ritardo (20000);
  }
}

Per il contenuto del codice della comunicazione con porte seriali, si prega di fare riferimento alla sezione precedente, che non sarà spiegata qui~

Gli ADC generalmente coinvolgono 6 SFR:

ADCCON1Per il controllo generale dell'ADC, inclusi il flag di conversione, il metodo di trigger dell'ADC, il generatore di numeri casuali
ADCCON2Configurazione per la conversione continua dell'ADC (questo esperimento non prevede la conversione continua dell'ADC e quindi non utilizza questa SFR)
ADCCON3Configurazione per una singola conversione ADC, inclusa la selezione della tensione di riferimento, risoluzione, sorgente di conversione
ADCH[7:0]L'alto livello del risultato di conversione ADC, cioè ADC [13:6]
ADCL[7:2]Il basso livello del risultato della conversione ADC, cioè ADC [5:0]
ADCCFGAIN0~AIN7 con P0.0~P0.7 come ingresso ADC (questo SFR non viene utilizzato perché il sensore di temperatura integrato nel chip è selezionato come sorgente di conversione in questo test e non coinvolge AIN0~AIN7)

(Nota: si riferisce al manuale cinese CC2430 per i dettagli SFR sopra indicati)

Ora concentriamoci su questogetTempuraturefunzione, che è la chiave per ottenere il valore di temperatura:

(1) Per prima cosa, configurare l'ADC per un singolo campionamento: impostare ADCCON3=0x3E, selezionare 1,25V come tensione di sistema, selezionare la risoluzione a 14 bit e selezionare il sensore di temperatura integrato CC2430 come sorgente di conversione ADC

(2) Poi impostare ADCCON1 |= 0x30 per impostare il metodo di trigger ADC su manuale (cioè, quando ADCCON.6=1, avviare la transizione ADC)

(3) Poi lascia ADCCON1 |= 0x40 per iniziare la conversione singolo ADC

(4) Usa l'affermazione mentre (!( ADCCON1 & 0x80)) Aspettare la fine della transizione ADC

(5) Il risultato della conversione viene memorizzato in ADCH[7:0] (alto 8 bit), ADCH [7:2] (6 bit in meno) e passato:

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

Salva il risultato della conversione nel valore

(6) Infine, usare la formulatemperatura= valore*0,06229-311,43, calcola il valore della temperatura e il ritorno

Consigli CC2430
Devi essere perplesso dall'ultima formula, perché una funzione una tantum? Perché ha una pendenza di 0,06229 e un'intercettazione di 211,43? OK, ecco la risposta:
Questo sensore di temperatura si trova all'interno del chip CC2430, quindi la sua descrizione si trova sicuramente nel manuale. E infatti, sono quiSpecifiche elettricheIl contenuto rilevante si trova in questa sezione e lo screenshot è il seguente:
Questa tabella descrive la temperatura (°C) del sensore di temperatura in relazione alla tensione di uscita (V).
Prima occhiata alla seconda scatola rossa:Coefficiente di temperatura。 "Coefficiente"? Non ti sembra un po'? Poi guarda la sua unità: mV/°C, e improvvisamente ti renderai conto che la relazione tra temperatura e tensione è lineare~ Cioè:
dove V è il valore della tensione di uscita, T è il valore della temperatura e 2,45 è la pendenza. L'intercettazione b deve essere determinata qui sotto.
A prima vista, troveremo nella prima scatola rossa che la tensione a 0°C è 743mV, quindi b è uguale a 743? Altrimenti, se continui a guardare in basso, scoprirai che il suo errore assoluto arriva fino a 8°C! Guardando poi a destra, vedremo che fornisce già l'intercetta più adatta, cioè: b=763, quindi esiste la seguente formula:
OK, ora abbiamo già il sensore di temperaturaInserire la temperatura TeTensione di uscita VIl passo successivo è trovare l'ADCTensione di ingresso VeValore di output N(cioè, il risultato di conversione di 14 bit), e infine si trova la formula di conversione di N e T.
Il risultato di conversione N è 14 bit, e quando N=11 1111 1111 1111 (binario), la tensione di uscita dovrebbe essere il valore massimo (cioè tensione di riferimento 1,25V). Pertanto, abbiamo la seguente relazione proporzionale:
(Nota: Poiché l'uscita dei 14 bit è un complemento binario, il 14° bit è il bit simbolico.) Quindi, in termini assoluti, il valore effettivo è solo 13 bit, quindi è 2 elevato alla potenza di 13)
Combinando le due formule, si può derivare la relazione tra T e N:
CAMBIO~

Infine, qualche parola sul perché sono necessari 64 cicli per campione. Poiché i sensori sono inevitabilmente soggetti a interferenze o errori casuali durante la misurazione della temperatura, i dati ottenuti dai sensori sono talvolta esagerati (ad esempio, un improvviso cambiamento di 10°C e poi un ritorno immediato alla normalità). Ma sappiamo che il cambiamento di temperatura è un processo integrale, ed è raro che avvenga un salto significativo in un istante). Pertanto, utilizziamo il metodo medio per ridurre tali errori.

(4) Risultati sperimentali

Prima apri lo strumento di debug della porta seriale, poi scarica il programma e avvialo, e apparirà la seguente schermata:

La temperatura all'interno della pellicola è di circa 14,5°C. L'autore percepisce la temperatura della stanza del dormitorio con il proprio corpo, che è poco più di 10°C. L'interno del chip ha bisogno di un po' di calore, quindi 14°C è praticamente normale~

Questa è la fine dell'esperimento.

3. Conclusione

Questo articolo descrive l'implementazione del campionamento singolo ADC. Nella sezione successiva, introdurremo una modalità di trasferimento datiDMA(accesso diretto alla memoria), cioè "accesso diretto alla memoria". Unità periferiche come i ricetrasmettitori ADC/UART/RF e i dispositivi di memoria possono essere scambiati direttamente sotto il controllo del "controller DMA"È necessario un piccolo intervento della CPU, il che migliora notevolmente l'efficienza complessiva del sistema.

Restate sintonizzati!


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




Precedente:Viaggio Zigbee (5): Diversi importanti esperimenti di base CC2430 - comunicazione seriale
Prossimo:Zigbee Journey (7): Diversi importanti esperimenti di base CC2430 - Trasmissione DMA
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com