Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 10718|Válasz: 0

Zigbee Journey (6): Több fontos CC2430 alapkísérlet – ADC egy-egy mintavétel

[Linket másol]
Közzétéve 2014. 10. 30. 23:20:31 | | | |
1. A felső és alsó szintek összekapcsolása

Vezeték nélküli szenzorhálózatokban fontos, hogy az analóg értékeket digitális mennyiségekké alakítsuk át a könnyű átvitel és feldolgozás érdekében. Az ADC (Analog-to-Digital Converter) segítségével végezzük ezt az átalakítást.

Az előző részben bevezettük a soros port kommunikációt a CC2430 és egy PC között. A CC2430-ban egy hőmérséklet-érzékelő van beágyazva, és ez a rész egy egyszerű kísérletet hajt végre a chipen belüli hőmérséklet-monitorozásra az előző szakasz alapján: az ADC-t használva a chipen belüli hőmérséklet-érzékelő feszültségértékét digitális mennyiségre alakítsuk, a képlettel a hőmérséklet értékének kiszámítására használjuk, majd a hőmérséklet értékét a sorozatos porton keresztül továbbítjuk a PC-nek, és megjelenítjük.

2. ADC egy-egy mintavételezés(1) Bevezetés a kísérlethez

Az ADC-t a CC2430 chipen belüli hőmérsékletérzékelő hőmérsékleti értékének átalakítására használják, és a hőmérséklet értékét a sorozatos porton keresztül továbbítják a PC-nek, ahol megjelenítik.

(2) Programáram

(3) Kísérleti forráskód és elemzés/*
    Kísérleti leírás: A chipen belüli hőmérséklet-mérési kísérlet az adatokat a 0. soros porton keresztül továbbítja a PC-hez
*/

#include

#define lead1 P1_0
#define led2 P1_1
#define lead3 P1_2
#define lead4 P1_3

/*32M晶振初始化
-------------------------------------------------------*/
Semmixtal_init(Semmi)
{
  ALVÁS &= ~0x04;            //都上电
  miközben(! (ALVÁS &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         Válassz egy 32 MHz-es kristályoscillátort
  ALVÁS |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
Semmiled_init(Semmi)
{
  P1SEL =0x00;         A P1 a normál I/O port
  P1DIR |=0x0F;         P1.0 P1.1 P1.2 P1.3 kimenet
  
  led1 =1;
  led2 =1;
  led3 =1;
  led4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
Semmi  Uart0Init(Aláírás nélkül charStopBits,Aláírás nélkül charParity)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    állítsd be UART módra, és engedélyezze az akcebulátort
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| Parititás;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
Semmi  Uart0Send(Aláírás nélkül charadatok)
{
  miközben(U0CSR&0x01);   //等待UART空闲时发送数据
  U0DBUF = adat;
}

/*UART0发送字符串
-------------------------------------------------------*/
SemmiUart0SendString(Aláírás nélkül char*s)
{
  miközben(*s !=0)
    Uart0Send(*s++);
}

/*UART0接收数据
-------------------------------------------------------*/
Aláírás nélkül charUart0Receive(Semmi)
{
  Aláírás nélkül charadatok;
  miközben(! (U0CSR&0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF;
  Visszatérésadatok;
}

/*延时函数
-------------------------------------------------------*/
SemmiKésés(Aláírás nélkül intn)
{
  Aláírás nélkül inti;
  for(i=0; i<n; i++);
  for(i=0; i<n; i++);
  for(i=0; i<n; i++);
  for(i=0; i<n; i++);
  for(i=0; i<n; i++);
}

/*得到实际温度值
-------------------------------------------------------*/
FloatgetTemperature(Semmi)
{
  Aláírás nélkül int  érték;

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

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

/*主函数
-------------------------------------------------------*/
Semmimain(Semmi)
{
  chari;
  FloatavgTemp;
  Aláírás nélkül charkimenet[]="";
        
  xtal_init();
  led_init();
  
  led1 =0;

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

  Uart0SendString("Szia CC2430 - TempSensor!");

  miközben(1)
  {
    led1 =0;
    avgTemp =0;
    for(i =0; i <64; i++)
    {
      avgTemp += getTemperature();
      avgTemp = avgTemp/2;            //每采样1次,取1次平均值
    }
   
    Kimenet[0] = (Aláírás nélkül char(avgTemp)/10 + 48;         //十位
    Kimenet[1] = (Aláírás nélkül char)(avgTemp)%10 + 48;         //个位
    Kimenet[2] ='.';                                       //小数点
    Kimenet[3] = (Aláírás nélkül char)(avgTemp*10)%10+48;         //十分位
    Kimenet[4] = (Aláírás nélkül char)(avgTemp*100)%10+48;        //百分位
    output[5] ='';                                      //字符串结束符
   
    Uart0SendString(kimenet);
    Uart0SendString("°C");
    led1 =1;                          //LED熄灭,表示转换结束,
   
    Késés(20000);
    Késés(20000);
    Késés(20000);
    Késés(20000);
    Késés(20000);
    Késés(20000);
    Késés(20000);
    Késés(20000);
    Késés(20000);
    Késés(20000);
  }
}

A soros port kommunikáció kódtartalmáról kérjük, lásd az előző szakaszt, amelyet itt nem magyarázunk el~

Az ADC-k általában 6 SFR-t foglalnak magukban:

ADCCON1ADC általános vezérléshez, beleértve az átalakítás végjelzőjét, ADC trigger módszert, véletlenszámgenerátort
ADCCON2Konfiguráció a folyamatos ADC átalakításhoz (ez a kísérlet nem tartalmaz folyamatos ADC átalakítást, ezért nem használja ezt az SFR-t)
ADCCON3Egyetlen ADC átalakítás konfigurációja, beleértve a referencia feszültség, felbontás, átalakítási forrás kiválasztását
ADCH[7:0]Az ADC átalakítás eredményének magas szintje, azaz ADC [13:6]
ADCL[7:2]Az ADC átalakítási eredmény alacsony szintje, azaz ADC [5:0]
ADCCFGAIN0~AIN7, ahol P0.0~P0.7 ADC bemenetként (ezt az SFR-t nem használják, mert a chipen belüli hőmérséklet-érzékelőt választják az átalakító forrásként ebben a tesztben, és nem érinti az AIN0~AIN7-et)

(Megjegyzés: A fenti SFR részleteiért kérjük, tekintse meg a CC2430 kínai kézikönyvet)

Most pedig koncentráljunk rágetTempuraturefüggvény, amely a hőmérsékleti érték megszerzésének kulcsa:

(1) Először állítsuk be az ADC-t egyetlen mintavételre: állítsuk be ADCCON3=0x3E-t, válasszuk ki a rendszer feszültségét 1,25V-nak, válasszuk ki a 14 bites felbontást, és a CC2430 chipen belüli hőmérséklet-érzékelőt ADC átalakító forrásként

(2) Ezután állítsd be ADCCON1 |= 0x30-t, hogy az ADC trigger metódusát manuálisra állítsa (azaz amikor ADCCON.6=1, indítsd el az ADC átmenetet).

(3) Ezután legyen ADCCON1 |= 0x40 az ADC egyetlen átalakításának elindításához

(4) Használd az állítást, mikor(!( ADCCON1 &0x80)) Várjuk meg az ADC átmenet végét

(5) Az átváltási eredmény az ADCH[7:0] (8 bit magas), ADCH [7:2] (6 bit alacsonyabb) formátumban tárolódik, és áthaladja:

    érték = ADCL >>2;
    érték |= (ADCH <<6);   

Mentsük el az átváltási eredményt az értékben

(6) Végül használjuk a képletethőmérséklet= érték*0,06229-311,43, számolja ki a hőmérsékleti értéket és a visszatérést

CC2430 tippek
Biztosan zavarban vagy az utolsó képleten, miért egy egyszeri függvény? Miért van 0,06229 meredeksége és 211,43 kereszteződése? Rendben, itt a válasz:
Ez a hőmérséklet-érzékelő a CC2430 chipben található, így a leírása biztosan megtalálható a kézikönyvben. Bizony, itt vagyokElektromos műszaki előírásokA releváns tartalom ebben a szakaszban található, és a képernyőkép a következő:
Ez a táblázat a hőmérséklet-érzékelő hőmérsékletét (°C) írja le a kimeneti feszültséghez (V) viszonyítva.
Először nézd meg a második piros dobozt:Hőmérsékleti együttható。 "Együttható"? Nem érződik egy kicsit? Aztán nézd meg az egységét: mV/°C, és hirtelen rájössz, hogy a hőmérséklet és a feszültség közötti kapcsolat lineáris~ Azaz:
ahol V a kimeneti feszültségérték, T a hőmérsékleti érték, és 2,45 a lejtő. Az elfogás b szakaszát alább kell meghatározni.
Első pillantásra az első piros doboznál azt találjuk, hogy a 0°C-os feszültség 743mV, tehát b egyenlő 743-mal? Ellenkező esetben, ha tovább nézel, azt fogod tapasztalni, hogy az abszolút hiba eléri a 8°C-ot! Jobbra nézve látjuk, hogy már a legmegfelelőbb metszést adja meg, azaz: b=763, tehát a következő képlet áll rendelkezésre:
Rendben, most már megvan a hőmérséklet-érzékelőnkLépj be hőmérséklet TésKimeneti feszültség VA következő lépés az ADC megtalálásaBemeneti feszültség VésKimeneti érték N(azaz 14 bites átalakítási eredmény), és végül megtaláljuk N és T átalakítási formuláját.
Az átalakító eredmény N 14 bit, és amikor N = 1111 1111 1111 1111 (bináris), a kimeneti feszültségnek a maximális értéknek kell lennie (azaz referenciafeszültség 1,25V). Ezért a következő arányos összefüggés van:
(Megjegyzés: Mivel a 14 bit kimenete bináris komplement, a 14. bit a szimbólumbit.) Tehát abszolút értékben az effektív érték csak 13 bit, tehát 2 az 13-as hatványhoz képest)
A két képlet kombinálásával T és N közötti kapcsolat levezethethető:
VÉG~

Végül néhány szó arról, miért szükséges mintaként 64 ciklus. Mivel az érzékelők elkerülhetetlenül interferenciának vagy véletlenszerű hibáknak vannak kitéve a hőmérséklet mérésekor, az érzékelők által szerzett adatok néha túlzóak (például hirtelen 10°C-os változás, majd azonnali visszatérés a normálishoz). De tudjuk, hogy a hőmérsékletváltozás egy szerves folyamat, és ritka, hogy egy nagy ugrás azonnal bekövetkezik. Ezért az átlagos módszert használjuk az ilyen hibák csökkentésére.

(4) Kísérleti eredmények

Először nyisd meg a soros port hibakereső eszközt, majd töltsd le a programot és indítsd el, és a következő képernyő jelenik meg:

A filmen belüli hőmérséklet körülbelül 14,5°C. A szerző testével érzi a hálóterem szobahőmérsékletét, amely valamivel több mint 10°C. A chip belsejének hőt kell kapnia, így a 14°C gyakorlatilag normális~

Ez a kísérlet vége.

3. Következtetés

Ez a cikk az ADC egy-mintavételezés megvalósítását írja le. A következő részben bevezetünk egy adatátviteli módotDMA(közvetlen memóriahozzáférés), azaz "közvetlen memória-hozzáférés". Perifériás egységek, mint az ADC/UART/RF adóvevők és memóriaeszközök közvetlenül a "DMA vezérlő" irányítása alatt cserélhetőkKevés CPU beavatkozásra van szükség, ami jelentősen javítja a rendszer általános hatékonyságát.

Maradjatok velünk!


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




Előző:Zigbee Journey (5): Több fontos CC2430 alapkísérlet – sorozatos kommunikáció
Következő:Zigbee Journey (7): Több fontos CC2430 alap kísérlet – DMA átvitel
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com