Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 10718|Odpověď: 0

Zigbee Journey (6): Několik důležitých základních experimentů CC2430 – jednorázové vzorkování ADC

[Kopírovat odkaz]
Zveřejněno 30.10.2014 23:20:31 | | | |
1. Propojení horní a dolní úrovně

V bezdrátových senzorových sítích je důležité převádět analogové hodnoty senzorů na digitální veličiny pro snadný přenos a zpracování. Pro dokončení této konverze se používá ADC (analogovo-digitální převodník).

V předchozí části jsme zavedli komunikaci přes sériový port mezi CC2430 a PC. CC2430 má uvnitř zabudovaný teplotní senzor a tato část provede jednoduchý experiment s monitorováním teploty na čipu založený na předchozí části: použijte ADC k převodu hodnoty napětí z teplotního senzoru na čipu na digitální veličinu, použijte vzorec k výpočtu teploty a poté přeneste teplotní hodnotu PC přes sériový port a zobrazíte ji.

2. Jednorazový výběr ADC(1) Úvod do experimentu

ADC se používá k převodu teplotní hodnoty na CC2430 na čipu a teplotní hodnota je odeslána do PC přes sériový port a zobrazena.

(2) Programový diagram

(3) Experimentální zdrojový kód a analýza/*
    Popis experimentu: Experiment měření teploty v čipu odesílá data do PC přes sériový port 0
*/

#include

#define vedl1 P1_0
#define vedl2 P1_1
#define vedení3 P1_2
#define Led4 P1_3

/*32M晶振初始化
-------------------------------------------------------*/
prázdnotaxtal_init(prázdnota)
{
  SPÁT &= ~0x04;            //都上电
  zatímco(! (SPÁT &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         Vyberte krystalový oscilátor s frekvencí 32 MHz
  SPÁT |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
prázdnotaled_init(prázdnota)
{
  P1SEL =0x00;         P1 je běžný I/O port
  P1DIR |=0x0F;         P1.0 P1.1 P1.1 P1.2 P1.3 výstup
  
  led1 =1;
  led2 =1;
  led3 =1;
  led4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
prázdnota  Uart0Init(nepodepsáno charStopBits,nepodepsáno charParita)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    nastavte režim UART a povolte akceptor
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| Parita;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
prázdnota  Uart0Send(nepodepsáno chardata)
{
  zatímco(U0CSR&0x01);   //等待UART空闲时发送数据
  U0DBUF = data;
}

/*UART0发送字符串
-------------------------------------------------------*/
prázdnotaUart0SendString(nepodepsáno char*s)
{
  zatímco(*s !=0)
    Uart0Send(*s++);
}

/*UART0接收数据
-------------------------------------------------------*/
nepodepsáno charUart0Receive(prázdnota)
{
  nepodepsáno chardata;
  zatímco(! (U0CSR&0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF;
  návratdata;
}

/*延时函数
-------------------------------------------------------*/
prázdnotaDelay(nepodepsáno intn)
{
  nepodepsáno inti;
  pro(i=0; i<n; i++);
  pro(i=0; i<n; i++);
  pro(i=0; i<n; i++);
  pro(i=0; i<n; i++);
  pro(i=0; i<n; i++);
}

/*得到实际温度值
-------------------------------------------------------*/
PlovákgetTemperature(prázdnota)
{
  nepodepsáno int  hodnotu;

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

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

/*主函数
-------------------------------------------------------*/
prázdnotamain(prázdnota)
{
  chari;
  Plovákprůměrná teplota;
  nepodepsáno charoutput[]="";
        
  xtal_init();
  led_init();
  
  led1 =0;

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

  Uart0SendString("Ahoj CC2430 - TempSensor!");

  zatímco(1)
  {
    led1 =0;
    avgTemp =0;
    pro(i =0; i <64; i++)
    {
      avgTemp += getTemperature();
      avgTemp = avgTemp/2;            //每采样1次,取1次平均值
    }
   
    Výstup[0] = (nepodepsáno char)(avgTemp)/10 + 48;         //十位
    Výstup[1] = (nepodepsáno char)(avgTemp)%10 + 48;         //个位
    Výstup[2] ='.';                                       //小数点
    Výstup[3] = (nepodepsáno char)(avgTemp*10)%10+48;         //十分位
    Výstup[4] = (nepodepsáno char)(avgTemp*100)%10+48;        //百分位
    výstup[5] ='';                                      //字符串结束符
   
    Uart0SendString(output);
    Uart0SendString("°C");
    led1 =1;                          //LED熄灭,表示转换结束,
   
    Delay(20000);
    Delay(20000);
    Delay(20000);
    Delay(20000);
    Delay(20000);
    Delay(20000);
    Delay(20000);
    Delay(20000);
    Delay(20000);
    Delay(20000);
  }
}

Pro kódový obsah komunikace na sériovém portu prosím viz předchozí sekce, která zde nebude vysvětlena~

ADC obvykle zahrnují 6 SFR:

ADCCON1Pro obecné řízení ADC, včetně konverzního koncového příznaku, metody ADC spouštění, generátoru náhodných čísel
ADCCON2Konfigurace pro kontinuální převod ADC (tento experiment nezahrnuje kontinuální převod ADC a proto tento SFR nepoužívá)
ADCCON3Konfigurace pro jeden převod ADC, včetně výběru referenčního napětí, rozlišení a zdroje převodu
ADCH[7:0]Vysoká úroveň konverze ADC, tj. ADC [13:6]
ADCL[7:2]Nízká úroveň konverzního výsledku ADC, tj. ADC [5:0]
ADCCFGAIN0~AIN7 s P0.0~P0.7 jako vstupem ADC (tento SFR se nepoužívá, protože v tomto testu je jako převodní zdroj zvolen teplotní senzor na čipu a nezahrnuje AIN0~AIN7)

(Poznámka: Pro výše uvedené podrobnosti o SFR se prosím podívejte na čínský manuál CC2430)

Teď se na to zaměřmegetTempuraturefunkce, která je klíčem k získání hodnoty teploty:

(1) Nejprve nakonfigurujte ADC pro jedno vzorkování: nastavte ADCCON3=0x3E, vyberte 1,25V jako systémové napětí, zvolte 14bitové rozlišení a jako zdroj převodu ADC zvolte teplotní senzor CC2430 na čipu

(2) Poté nastavte ADCCON1 |= 0x30 tak, aby se metoda spouštění ADC nastavila na manuální (tj. když ADCCON.6=1 zahajte přechod ADC)

(3) Pak nechť ADCCON1 |= 0x40 pro zahájení jednosměrné konverze ADC

(4) Použijte větu while(!( ADCCON1 &0x80)) Počkejte na konec přechodu na ADC

(5) Výsledek převodu je uložen v ADCH[7:0] (8 bitů vyšší), ADCH [7:2] (o 6 bitů nižší) a předán:

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

Uložit výsledek konverze do hodnoty

(6) Nakonec použijeme formuliteplota= hodnota*0,06229-311,43, vypočítat teplotu a vrátit

Tipy na CC2430
Musíte být zmatení posledním vzorcem, proč jednorázová funkce? Proč má sklon 0,06229 a průsečík 211,43? Dobře, tady je odpověď:
Tento teplotní senzor je umístěn uvnitř čipu CC2430, takže jeho popis lze určitě najít v manuálu. A opravdu, jsem tadyElektrické specifikaceRelevantní obsah najdete v této sekci a screenshot je následující:
Tato tabulka popisuje teplotu (°C) teplotního senzoru ve vztahu k výstupnímu napětí (V).
Nejprve se podívej na druhý červený rámeček:Teplotní koeficient。 "Koeficient"? Nepřipadá ti to trochu? Pak se podívej na jeho jednotku: mV/°C, a najednou si uvědomíš, že vztah mezi teplotou a napětím je lineární~ To znamená:
kde V je hodnota výstupního napětí, T je teplota a 2,45 je sklon. Intercept b musí být určen níže.
Na první pohled zjistíme, že na prvním červeném boxu je napětí při 0°C 743 mV, takže b je roven 743? Jinak, pokud budete dál hledět dolů, zjistíte, že jeho absolutní chyba dosahuje až 8 °C! Pak se podíváme doprava, kde už poskytuje nejvhodnější průsečík, tj.: b=763, takže existuje následující vzorec:
Dobře, teď už máme teplotní senzorZadejte teplotu TaVýstupní napětí VDalším krokem je najít ADCVstupní napětí VaVýstupní hodnota N(tj. výsledek převodu 14 bitů) a nakonec najděte konverzní vzorec N a T.
Výsledek převodu N je 14 bitů a když N=11 1111 1111 1111 1111 (binární), výstupní napětí by mělo být maximální hodnota (tj. referenční napětí 1,25V). Proto máme následující poměrný vztah:
(Poznámka: Protože výstup 14 bitů je binární doplněk, 14. bit je bitem symbolu.) Takže v absolutních hodnotách je efektivní hodnota pouze 13 bitů, tedy 2 na mocninu 13)
Kombinací obou vzorců lze odvodit vztah mezi T a N:
KONEC~

Nakonec pár slov o tom, proč je potřeba 64 cyklů na vzorek. Protože senzory jsou při měření teploty nevyhnutelně vystaveny rušení nebo náhodným chybám, data získaná senzory jsou někdy přehnaná (například náhlá změna o 10 °C a následný okamžitý návrat do normálu). Ale víme, že změna teploty je nedílný proces a je vzácné, aby došlo k velkému skoku během okamžiku). Proto používáme metodu průměru ke snížení těchto chyb.

(4) Experimentální výsledky

Nejprve otevřete nástroj pro ladění sériových portů, pak si stáhněte program a spusťte ho, a objeví se následující obrazovka:

Teplota uvnitř filmu je asi 14,5 °C. Autor cítí teplotu pokojové ložnice svým tělem, která je asi něco málo přes 10 °C. Uvnitř čipu je potřeba trochu zahřívat, takže 14°C je v podstatě normální~

Tím experiment končí.

3. Závěr

Tento článek popisuje implementaci jednorazového vzorkování ADC. V následující části představíme režim přenosu datDMA(přímý přístup do paměti), tedy "přímý přístup do paměti". Periferní jednotky jako ADC/UART/RF transceivery a paměťová zařízení lze přímo vyměňovat pod kontrolou "DMA řadiče"Je potřeba jen minimální zásah CPU, což výrazně zlepšuje celkovou efektivitu systému.

Zůstaňte naladěni!


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




Předchozí:Zigbee Journey (5): Několik důležitých základních experimentů CC2430 – sériová komunikace
Další:Zigbee Journey (7): Několik důležitých základních experimentů CC2430 – přenos DMA
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com