Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 10718|Atsakyti: 0

Zigbee kelionė (6): Keli svarbūs CC2430 pagrindiniai eksperimentai - ADC vienkartinė atranka

[Kopijuoti nuorodą]
Paskelbta 2014-10-30 23:20:31 | | | |
1. Viršutinio ir apatinio lygių sujungimas

Belaidžiuose jutiklių tinkluose svarbu konvertuoti analogines jutiklių vertes į skaitmeninius dydžius, kad būtų lengviau perduoti ir apdoroti. Šiam konvertavimui užbaigti naudojamas ADC (analoginis-skaitmeninis keitiklis).

Ankstesniame skyriuje pristatėme nuosekliojo prievado ryšį tarp CC2430 ir kompiuterio. CC2430 viduje yra įmontuotas temperatūros jutiklis, o šiame skyriuje bus įgyvendintas paprastas lusto temperatūros stebėjimo eksperimentas, pagrįstas ankstesniu skyriumi: naudokite ADC, kad konvertuotumėte lusto temperatūros jutiklio įtampos vertę į skaitmeninį dydį, naudokite formulę temperatūros vertei apskaičiuoti, tada persiųskite temperatūros vertę į kompiuterį per nuoseklųjį prievadą ir parodykite.

2. ADC vienkartinė atranka(1) Įvadas į eksperimentą

ADC naudojamas CC2430 lusto temperatūros jutiklio temperatūros vertei konvertuoti, o temperatūros vertė siunčiama į kompiuterį per nuoseklųjį prievadą ir rodoma.

(2) Programos eigos schema

(3) Eksperimentinis šaltinio kodas ir analizė/*
    Eksperimentinis aprašymas: lusto temperatūros nustatymo eksperimentas siunčia duomenis į kompiuterį per nuoseklųjį prievadą 0
*/

#include

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

/*32M晶振初始化
-------------------------------------------------------*/
tuščiaxtal_init (tuščia)
{
  MIEGAS &= ~0x04;            //都上电
  Nors(! (MIEGO IR0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         Pasirinkite 32 MHz kristalinį osciliatorių
  MIEGO REŽIMAS |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
tuščialed_init (tuščia)
{
  P1SEL =0x00;         P1 yra įprastas įvesties / išvesties prievadas
  P1DIR |=0x0F;         P1.0 P1.1 P1.2 P1.3 išėjimas
  
  Šviesos diodas1 =1;
  LED2 =1;
  led3 =1;
  LED4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
tuščia  Uart0Init(nepasirašytas anglisStopBits,nepasirašytas anglisParitetas)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    nustatykite į UART režimą ir įjunkite
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| Paritetas;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
tuščia  Uart0Siųsti(nepasirašytas anglisduomenys)
{
  Nors(U0CSR &0x01);   //等待UART空闲时发送数据
  U0DBUF = duomenys;
}

/*UART0发送字符串
-------------------------------------------------------*/
tuščiaUart0SendString(nepasirašytas anglis*s)
{
  Nors(*s !=0)
    Uart0Send(*s++);
}

/*UART0接收数据
-------------------------------------------------------*/
nepasirašytas anglisUart0Gauti(tuščia)
{
  nepasirašytas anglisduomenys;
  Nors(! (U0CSR &0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF;
  grįžtiduomenys;
}

/*延时函数
-------------------------------------------------------*/
tuščiaVėlavimas(nepasirašytas intn)
{
  nepasirašytas inti;
  dėl(i =0; i<n; i++);
  dėl(i =0; i<n; i++);
  dėl(i =0; i<n; i++);
  dėl(i =0; i<n; i++);
  dėl(i =0; i<n; i++);
}

/*得到实际温度值
-------------------------------------------------------*/
plūdėgetTemperature(tuščia)
{
  nepasirašytas int  vertė;

  ADCCON3 = (0x3E);                  //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
   
  ADCCON1 |=0x30;                    //选择ADC的启动模式为手动
  ADCCON1 |=0x40;                    Inicijuoti skelbimų konversijas            
   
  Nors(! (ADCCON1 ir0x80));           //等待ADC转化结束

  vertė = ADCL >>2;
  reikšmė |= (ADCH <<6);               //取得最终转化结果,存入value中
  
  grįžtiVertė*0.06229-311.43;        //根据公式计算出温度值
}

/*主函数
-------------------------------------------------------*/
tuščiapagrindinis(tuščia)
{
  anglisi;
  plūdėvid. Temp;
  nepasirašytas anglisišvestis[]="";
        
  xtal_init ();
  led_init ();
  
  Šviesos diodas1 =0;

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

  Uart0SendString("Sveiki, CC2430 - TempSensor!");

  Nors(1)
  {
    Šviesos diodas1 =0;
    vid. temp =0;
    dėl(i =0; i <64; i++)
    {
      avgTemp += getTemperature();
      avgTemp = avgTemp/2;            //每采样1次,取1次平均值
    }
   
    Rezultatas[0] = (nepasirašytas anglis)(avgTemp)/10 + 48;         //十位
    Rezultatas[1] = (nepasirašytas anglis)(vidgTemp)%10 + 48;         //个位
    Rezultatas[2] ='.';                                       //小数点
    Rezultatas[3] = (nepasirašytas anglis)(avgTemp*10)%10+48;         //十分位
    Rezultatas[4] = (nepasirašytas anglis)(avgTemp*100)%10+48;        //百分位
    Rezultatas[5] ='';                                      //字符串结束符
   
    Uart0SendString(išvestis);
    Uart0SendString("°C");
    Šviesos diodas1 =1;                          //LED熄灭,表示转换结束,
   
    Vėlavimas(20000);
    Vėlavimas(20000);
    Vėlavimas(20000);
    Vėlavimas(20000);
    Vėlavimas(20000);
    Vėlavimas(20000);
    Vėlavimas(20000);
    Vėlavimas(20000);
    Vėlavimas(20000);
    Vėlavimas(20000);
  }
}

Nuosekliojo prievado ryšio kodo turinį rasite ankstesniame skyriuje, kuris čia nebus paaiškintas~

ADC paprastai apima 6 SFR:

ADCCON1ADC bendrajam valdymui, įskaitant konversijos pabaigos žymę, ADC paleidimo metodą, atsitiktinių skaičių generatorių
ADCCON2Nepertraukiamo ADC konvertavimo konfigūracija (šis eksperimentas neapima nuolatinio ADC konvertavimo, todėl šis SFR nenaudojamas)
ADCCON3Vieno ADC konvertavimo konfigūracija, įskaitant etaloninės įtampos, skiriamosios gebos, konvertavimo šaltinio pasirinkimą
ADCH[7:0]Aukštas ADC konversijos rezultato lygis, t. y. ADC [13:6]
ADCL[7:2]Žemas ADC konvertavimo rezultato lygis, t. y. ADC [5:0]
ADCCFGAIN0~AIN7 su P0.0~P0.7 kaip ADC įvestimi (šis SFR nenaudojamas, nes šiame bandyme kaip konvertavimo šaltinis pasirinktas lusto temperatūros jutiklis ir neapima AIN0~AIN7)

(Pastaba: aukščiau pateiktą SFR informaciją rasite CC2430 kinų vadove)

Toliau sutelkime dėmesį į taigetTempuraturefunkcija, kuri yra raktas į temperatūros vertę:

(1) Pirmiausia sukonfigūruokite ADC vienam mėginiui: nustatykite ADCCON3=0x3E, pasirinkite 1.25 V kaip sistemos tūrįtage, pasirinkite 14 bitų skiriamąją gebą ir kaip ADC konvertavimo šaltinį pasirinkite CC2430 lusto temperatūros jutiklį

(2) Tada nustatykite ADCCON1 |= 0x30, kad nustatytumėte ADC paleidimo metodą į rankinį (ty kai ADCCON.6=1, paleiskite ADC perėjimą)

(3) Tada leiskite ADCCON1 |= 0x40, kad pradėtumėte ADC vieną konvertavimą

(4) Naudokite teiginį, o (!( ADCCON1 &0x80)) Palaukite ADC perėjimo pabaigos

(5) Konvertavimo rezultatas saugomas ADCH[7:0] (8 bitų aukščio), ADCH [7:2] (6 bitų žemiau) ir perduodamas:

    vertė = ADCL >>2;
    reikšmė |= (ADCH <<6);   

Įrašyti konversijos rezultatą į reikšmę

(6) Galiausiai naudokite formulętemperatūra = vertė * 0,06229-311,43, apskaičiuokite temperatūros vertę ir grąžinkite

CC2430 patarimai
Tikriausiai jus suglumino paskutinė formulė, kodėl vienkartinė funkcija? Kodėl jo nuolydis yra 0,06229, o sankirta - 211,43? Gerai, štai atsakymas:
Šis temperatūros jutiklis yra CC2430 lusto viduje, todėl jo aprašymą tikrai galite rasti jo vadove. Žinoma, aš čiaElektros specifikacijosAtitinkamas turinys yra šiame skyriuje, o ekrano kopija yra tokia:
Šioje lentelėje aprašoma temperatūros jutiklio temperatūra (°C) išėjimo įtampos atžvilgiu (V).
Pirmiausia pažvelkite į antrą raudoną langelį:temperatūros koeficientas。 "Koeficientas"? Ar tai nesijaučia šiek tiek? Tada pažvelkite į jo vienetą: mV/°C ir staiga suprasite, kad temperatūros ir įtampos santykis yra tiesinis~ Tai yra:
kur V yra išėjimo įtampos vertė, T yra temperatūros vertė, o 2,45 yra nuolydis. Susikirtimas b turi būti nustatytas toliau.
Iš pirmo žvilgsnio pirmajame raudoname langelyje rasime, kad įtampa esant 0°C yra 743 mV, taigi b yra lygi 743? Priešingu atveju, jei ir toliau žiūrėsite žemyn, pamatysite, kad jo absoliuti paklaida siekia net 8 °C! Tada pažvelgę į dešinę pamatysime, kad jis jau pateikia tinkamiausią sankirtą, t.y.: b=763, taigi yra tokia formulė:
Gerai, dabar jau turime temperatūros jutiklįĮveskite temperatūrą TirIšėjimo įtampa VKitas žingsnis - rasti ADCĮėjimo įtampa VirIšvesties vertė N(t. y. 14 bitų konversijos rezultatas) ir galiausiai raskite N ir T konversijos formulę.
Konversijos rezultatas N yra 14 bitų, o kai N=11 1111 1111 1111 (dvejetainis), išėjimo įtampa turėtų būti didžiausia vertė (t. y. etaloninė įtampa 1,25 V). Todėl turime tokį proporcingą santykį:
(Pastaba: Kadangi 14 bitų išvestis yra dvejetainis papildymas, 14-asis bitas yra simbolio bitas.) Taigi absoliučiais skaičiais efektyvi vertė yra tik 13 bitų, taigi ji yra 2 iki 13 galios)
Sujungus dvi formules, galima išvesti ryšį tarp T ir N:
VIRŠ ~

Galiausiai keli žodžiai apie tai, kodėl vienam mėginiui reikia 64 ciklų. Kadangi jutikliai neišvengiamai patiria trukdžius ar atsitiktines klaidas matuojant temperatūrą, jutiklių gauti duomenys kartais būna perdėti (pavyzdžiui, staigus 10 °C pokytis, o tada akimirksniu grįžta į normalią būseną). Bet mes žinome, kad temperatūros pokytis yra neatsiejamas procesas, ir retai kada didelis šuolis įvyksta akimirksniu). Todėl tokioms klaidoms sumažinti naudojame vidutinį metodą.

(4) Eksperimento rezultatai

Pirmiausia atidarykite nuosekliojo prievado derinimo įrankį, tada atsisiųskite programą ir paleiskite ją, ir pasirodys šis ekranas:

Temperatūra plėvelės viduje yra apie 14,5 °C. Autorius savo kūnu jaučia bendrabučio kambario temperatūrą, kuri yra apie šiek tiek daugiau nei 10°C. Lusto vidus turi gauti šiek tiek šilumos, todėl 14 ° C iš esmės yra normalus ~

Tai eksperimento pabaiga.

3. Išvada

Šiame straipsnyje aprašomas ADC vienos atrankos diegimas. Kitame skyriuje pristatysime duomenų perdavimo režimąSkaitmeninių rinkų aktas(tiesioginė prieiga prie atminties), tai yra "tiesioginė prieiga prie atminties". Periferiniai įrenginiai, tokie kaip ADC/UART/RF siųstuvai-imtuvai ir atminties įrenginiai, gali būti keičiami tiesiogiai valdant "DMA valdikliui"Reikalingas nedidelis procesoriaus įsikišimas, o tai labai pagerina bendrą sistemos efektyvumą.

Sekite naujienas!


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




Ankstesnis:Zigbee kelionė (5): keli svarbūs CC2430 pagrindiniai eksperimentai - serijinis ryšys
Kitą:Zigbee kelionė (7): Keletas svarbių CC2430 pagrindinių eksperimentų - DMA perdavimas
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com