Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 10718|Jawab: 0

Zigbee Journey (6): Beberapa eksperimen dasar CC2430 penting - pengambilan sampel tunggal ADC

[Salin tautan]
Diposting pada 30/10/2014 23.20.31 | | | |
1. Menghubungkan tingkat atas dan bawah

Dalam jaringan sensor nirkabel, penting untuk mengubah nilai analog sensor menjadi kuantitas digital untuk memudahkan transmisi dan pemrosesan. ADC (Analog-to-Digital Converter) digunakan untuk menyelesaikan konversi ini.

Di bagian sebelumnya, kami memperkenalkan komunikasi port serial antara CC2430 dan PC. CC2430 memiliki sensor suhu yang tertanam di dalamnya, dan bagian ini akan menerapkan eksperimen sederhana pada pemantauan suhu on-chip berdasarkan bagian sebelumnya: gunakan ADC untuk mengubah nilai tegangan sensor suhu on-chip menjadi kuantitas digital, gunakan rumus untuk menghitung nilai suhu, lalu transmisikan nilai suhu ke PC melalui port serial dan tampilkan.

2. Pengambilan sampel tunggal ADC(1) Pengantar percobaan

ADC digunakan untuk mengonversi nilai suhu sensor suhu on-chip CC2430, dan nilai suhu dikirim ke PC melalui port serial dan ditampilkan.

(2) Bagan alir program

(3) Kode sumber dan analisis eksperimental/*
    Deskripsi eksperimental: Eksperimen akuisisi suhu dalam chip mengirimkan data ke PC melalui port serial 0
*/

#include

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

/*32M晶振初始化
-------------------------------------------------------*/
kosongxtal_init(kosong)
{
  TIDUR &= ~0x04;            //都上电
  sementara(! (TIDUR &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         Pilih osilator kristal 32MHz
  TIDUR |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
kosongled_init(kosong)
{
  P1SEL =0x00;         P1 adalah port I/O normal
  P1DIR |=0x0F;         Keluaran P1.0 P1.1 P1.2 P1.3
  
  led1 =1;
  led2 =1;
  led3 =1;
  led4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
kosong  Uart0Init(tidak ditandatangani arangStopBits,tidak ditandatangani arangParitas)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    atur ke mode UART dan aktifkan akseptor
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| Paritas;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
kosong  Uart0Kirim(tidak ditandatangani arangdata)
{
  sementara(U0CSR&0x01);   //等待UART空闲时发送数据
  U0DBUF = data;
}

/*UART0发送字符串
-------------------------------------------------------*/
kosongUart0SendString(tidak ditandatangani arang*dt)
{
  sementara(*s !=0)
    Uart0Kirim(*s++);
}

/*UART0接收数据
-------------------------------------------------------*/
tidak ditandatangani arangUart0Menerima(kosong)
{
  tidak ditandatangani arangdata;
  sementara(! (U0CSR&0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF;
  Kembalidata;
}

/*延时函数
-------------------------------------------------------*/
kosongPenundaan(tidak ditandatangani intn)
{
  tidak ditandatangani inti;
  untuk(i=0; i<n; i++);
  untuk(i=0; i<n; i++);
  untuk(i=0; i<n; i++);
  untuk(i=0; i<n; i++);
  untuk(i=0; i<n; i++);
}

/*得到实际温度值
-------------------------------------------------------*/
mengapunggetTemperature(kosong)
{
  tidak ditandatangani int  nilai;

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

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

/*主函数
-------------------------------------------------------*/
kosongutama(kosong)
{
  arangi;
  mengapungavgTemp;
  tidak ditandatangani arangkeluaran[]="";
        
  xtal_init();
  led_init();
  
  led1 =0;

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

  Uart0SendString("Halo CC2430 - TempSensor!");

  sementara(1)
  {
    led1 =0;
    rata-rata Temp =0;
    untuk(i =0; i <64; i++)
    {
      avgTemp += getTemperature();
      avgTemp = rata-rata temp/2;            //每采样1次,取1次平均值
    }
   
    keluaran[0] = (tidak ditandatangani arang(rata-rata Temp)/10 + 48;         //十位
    keluaran[1] = (tidak ditandatangani arang(rata-rata Temp)%10 + 48;         //个位
    keluaran[2] ='.';                                       //小数点
    keluaran[3] = (tidak ditandatangani arang)(rata-rata Temp*10)%10+48;         //十分位
    keluaran[4] = (tidak ditandatangani arang)(rata-rata Temp*100)%10+48;        //百分位
    keluaran[5] ='';                                      //字符串结束符
   
    Uart0SendString(keluaran);
    Uart0SendString("°C");
    led1 =1;                          //LED熄灭,表示转换结束,
   
    Penundaan(20000);
    Penundaan(20000);
    Penundaan(20000);
    Penundaan(20000);
    Penundaan(20000);
    Penundaan(20000);
    Penundaan(20000);
    Penundaan(20000);
    Penundaan(20000);
    Penundaan(20000);
  }
}

Untuk konten kode komunikasi port serial, silakan lihat bagian sebelumnya, yang tidak akan dijelaskan di sini ~

ADC umumnya melibatkan 6 SFR:

ADCCON1Untuk kontrol umum ADC, termasuk bendera akhir konversi, metode pemicu ADC, generator angka acak
ADCCON2Konfigurasi untuk konversi ADC berkelanjutan (eksperimen ini tidak melibatkan konversi ADC berkelanjutan dan oleh karena itu tidak menggunakan SFR ini)
ADCCON3Konfigurasi untuk satu konversi ADC, termasuk pemilihan tegangan referensi, resolusi, sumber konversi
ADCH[7:0]Tingkat tinggi dari hasil konversi ADC, yaitu ADC [13:6]
ADCL[7:2]Tingkat rendah dari hasil konversi ADC, yaitu ADC [5:0]
ADCCFGAIN0~AIN7 dengan P0.0~P0.7 sebagai input ADC (SFR ini tidak digunakan karena sensor suhu on-chip dipilih sebagai sumber konversi dalam pengujian ini dan tidak melibatkan AIN0~AIN7)

(Catatan: Silakan lihat manual bahasa Cina CC2430 untuk detail SFR di atas)

Selanjutnya, mari kita fokus padanyagetTempuraturefungsi, yang merupakan kunci untuk mendapatkan nilai suhu:

(1) Pertama, konfigurasikan ADC untuk satu pengambilan sampel: atur ADCCON3=0x3E, pilih 1.25V sebagai tegangan sistemage, pilih resolusi 14-bit, dan pilih sensor suhu on-chip CC2430 sebagai sumber konversi ADC

(2) Kemudian atur ADCCON1 |= 0x30 untuk mengatur metode pemicu ADC ke manual (yaitu, ketika ADCCON.6=1, mulai transisi ADC)

(3) Kemudian biarkan ADCCON1 |= 0x40 untuk memulai konversi tunggal ADC

(4) Gunakan pernyataan selama(!( ADCCON1 &0x80)) Tunggu akhir transisi ADC

(5) Hasil konversi disimpan di ADCH[7:0] (tinggi 8 bit), ADCH [7:2] (6 bit lebih rendah), dan diluluskan:

    nilai = >> ADCL2;
    nilai |= (ADCH <<6);   

Simpan hasil konversi dalam nilai

(6) Terakhir, gunakan rumusnyasuhu = nilai * 0.06229-311.43, hitung nilai suhu dan pengembalian

CC2430 Tips
Anda pasti bingung dengan rumus terakhir, mengapa fungsi satu kali? Mengapa memiliki kemiringan 0.06229 dan intersep 211.43? Oke, inilah jawabannya:
Sensor suhu ini terletak di dalam chip CC2430, sehingga deskripsinya tentu dapat ditemukan di manualnya. Benar saja, saya di siniSpesifikasi listrikKonten yang relevan ditemukan di bagian ini, dan tangkapan layarnya adalah sebagai berikut:
Tabel ini menjelaskan suhu (°C) sensor suhu dalam kaitannya dengan tegangan keluaran (V).
Lihat pertama kotak merah kedua:koefisien suhu。 "Koefisien"? Bukankah itu terasa sedikit? Kemudian lihat unitnya: mV/°C, dan Anda tiba-tiba akan menyadari bahwa hubungan antara suhu dan tegangan bersifat linier ~ Artinya:
di mana V adalah nilai tegangan keluaran, T adalah nilai suhu, dan 2.45 adalah kemiringan. Intersep b harus ditentukan di bawah ini.
Sekilas, kita akan menemukan pada kotak merah pertama bahwa tegangan pada 0°C adalah 743mV, jadi b sama dengan 743? Jika tidak, jika Anda terus melihat ke bawah, Anda akan menemukan bahwa kesalahan absolutnya mencapai sebanyak 8°C! Kemudian melihat ke kanan, kita akan melihat bahwa ia sudah memberikan intersep yang paling cocok, yaitu: b=763, jadi ada rumus berikut:
Oke, sekarang kita sudah memiliki sensor suhuMasukkan suhu TdanTegangan keluaran VLangkah selanjutnya adalah menemukan ADCTegangan masukan VdanNilai keluaran N(yaitu, hasil konversi 14 bit), dan akhirnya temukan rumus konversi N dan T.
Hasil konversi N adalah 14 bit, dan ketika N=11 1111 1111 1111 (biner), tegangan keluaran harus berupa nilai maksimum (yaitu tegangan referensi 1.25V). Oleh karena itu, kami memiliki hubungan proporsional berikut:
(Catatan: Karena output 14 bit adalah pelengkap biner, bit ke-14 adalah bit simbol.) Jadi secara absolut, nilai efektifnya hanya 13 bit, jadi 2 pangkat 13)
Menggabungkan dua rumus tersebut, hubungan antara T dan N dapat diturunkan:
LEBIH~

Akhirnya, beberapa kata tentang mengapa 64 siklus diperlukan per sampel. Karena sensor pasti mengalami interferensi atau kesalahan acak saat mengukur suhu, data yang diperoleh oleh sensor terkadang dibesar-besarkan (misalnya, perubahan mendadak 10°C, dan kemudian kembali normal secara instan). Tetapi kita tahu bahwa perubahan suhu adalah proses integral, dan jarang terjadi lompatan besar dalam sekejap). Oleh karena itu, kami menggunakan metode rata-rata untuk mengurangi kesalahan tersebut.

(4) Hasil eksperimen

Pertama, buka alat debugging port serial, lalu unduh program dan mulai, dan layar berikut akan muncul:

Suhu di dalam film sekitar 14.5°C. Penulis merasakan suhu kamar asrama dengan tubuhnya, yaitu sekitar sedikit lebih dari 10°C. Bagian dalam chip perlu mendapatkan panas, jadi 14°C pada dasarnya normal~

Ini adalah akhir dari percobaan.

3. Kesimpulan

Artikel ini menjelaskan penerapan pengambilan sampel tunggal ADC. Di bagian selanjutnya, kami akan memperkenalkan mode transfer dataDMA(akses memori langsung), yaitu "akses memori langsung". Unit periferal seperti transceiver ADC/UART/RF dan perangkat memori dapat ditukar langsung di bawah kendali "pengontrol DMA"Sedikit intervensi CPU diperlukan, yang sangat meningkatkan efisiensi sistem secara keseluruhan.

Nantikan!


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




Mantan:Zigbee Journey (5): Beberapa eksperimen dasar CC2430 penting - komunikasi serial
Depan:Perjalanan Zigbee (7): Beberapa eksperimen dasar CC2430 penting - transmisi DMA
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com