Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 10718|Yanıt: 0

Zigbee Yolculuğu (6): Birkaç önemli CC2430 temel deneyi - ADC tek örnekleme

[Bağlantıyı kopyala]
Yayınlandı 30.10.2014 23:20:31 | | | |
1. Üst ve alt katların birbirine bağlanması

Kablosuz sensör ağlarında, sensörlerin analog değerlerinin dijital büyüklüklere dönüştürülmesi önemlidir ki kolay iletim ve işleme sağlanabilsin. Bu dönüşümü tamamlamak için ADC (Analogdan Dijitale Dönüştürücü) kullanılır.

Önceki bölümde, CC2430 ile bir PC arasında seri port iletişimini tanıtmıştık. CC2430'un içine gömülü bir sıcaklık sensörü bulunur ve bu bölüm, önceki bölüme dayanarak çip içi sıcaklık izleme üzerine basit bir deney uygulayacaktır: ADC'yi kullanarak çip üzerindeki sıcaklık sensörünün voltaj değerini dijital bir niceliğe dönüştürün, formülü kullanarak sıcaklık değerini hesaplayın ve ardından sıcaklık değerini seri port üzerinden PC'ye iledip gösterin.

2. ADC tek örnekleme(1) Deneye giriş

ADC, CC2430 çip üzerindeki sıcaklık sensörünün sıcaklık değerini dönüştürmek için kullanılır ve sıcaklık değeri seri port üzerinden PC'ye gönderilir ve görüntülenir.

(2) Program akış şeması

(3) Deneysel kaynak kodu ve analiz/*
    Deneysel açıklama: Çip içi sıcaklık alma deneyi, verileri seri port 0 üzerinden PC'ye gönderir
*/

#include

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

/*32M晶振初始化
-------------------------------------------------------*/
Voidxtal_init(Void)
{
  UYKU &= ~0x04;            //都上电
  while(! (UYKU &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;         32MHz kristal osilatör seçin
  UYKU |=0x04;
}

/*LED灯初始化
-------------------------------------------------------*/
Voidled_init(Void)
{
  P1SEL =0x00;         P1 normal I/O portudur
  P1DIR |=0x0F;         P1.0 P1.1 P1.2 P1.3 çıkışı
  
  led1 =1;
  led2 =1;
  led3 =1;
  led4 =1;
}

/*UART0初始化
-------------------------------------------------------*/
Void  Uart0Init(imzasız charStopBits,imzasız charEşitlik)
{
   P0SEL |=  0x0C;                  //初始化UART0端口
   PERCFG&= ~0x01;                  //选择UART0为可选位置一
   U0CSR =0xC0;                    UART moduna ayar ve alıcıyı etkinleştir
   U0GCR =11;
   U0BAUD =216;                    //设置UART0波特率为115200bps
   U0UCR |= StopBits| Eşitlik;        //设置停止位与奇偶校验
}

/*UART0发送字符
-------------------------------------------------------*/
Void  Uart0Send(imzasız charveriler)
{
  while(U0CSR&0x01);   //等待UART空闲时发送数据
  U0DBUF = veri;
}

/*UART0发送字符串
-------------------------------------------------------*/
VoidUart0SendString(imzasız char*s)
{
  while(*s !=0)
    Uart0Send(*s++);
}

/*UART0接收数据
-------------------------------------------------------*/
imzasız charUart0Receive(Void)
{
  imzasız charveri;
  while(! (U0CSR&0x04));//查询是否收到数据,否则继续等待
  data=U0DBUF;
  Dönüşveri;
}

/*延时函数
-------------------------------------------------------*/
VoidGecikme(imzasız intn)
{
  imzasız inti;
  için(i=0; i<n; i++);
  için(i=0; i<n; i++);
  için(i=0; i<n; i++);
  için(i=0; i<n; i++);
  için(i=0; i<n; i++);
}

/*得到实际温度值
-------------------------------------------------------*/
FloatgetTemperature(Void)
{
  imzasız int  değer;

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

  değer = ADCL >>2;
  değeri |= (ADCH <<6);               //取得最终转化结果,存入value中
  
  Dönüşdeğer*0.06229-311.43;        //根据公式计算出温度值
}

/*主函数
-------------------------------------------------------*/
Voidmain(Void)
{
  chari;
  FloatavgTemp;
  imzasız charçıktı[]="";
        
  xtal_init();
  led_init();
  
  led1 =0;

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

  Uart0SendString("Merhaba CC2430 - TempSensor!");

  while(1)
  {
    led1 =0;
    avgTemp =0;
    için(i =0; i <64; i++)
    {
      avgTemp += getTemperature();
      avgTemp = avgTemp/2;            //每采样1次,取1次平均值
    }
   
    çıktı[0] = (imzasız char)(avgTemp)/10 + 48;         //十位
    çıktı[1] = (imzasız char)(avgTemp)%10 + 48;         //个位
    çıktı[2] ='.';                                       //小数点
    çıktı[3] = (imzasız char)(avgTemp*10)%10+48;         //十分位
    çıktı[4] = (imzasız char)(avgTemp*100)%10+48;        //百分位
    çıktı[5] ='';                                      //字符串结束符
   
    Uart0SendString(output);
    Uart0SendString("°C");
    led1 =1;                          //LED熄灭,表示转换结束,
   
    Gecikme(20000);
    Gecikme(20000);
    Gecikme(20000);
    Gecikme(20000);
    Gecikme(20000);
    Gecikme(20000);
    Gecikme(20000);
    Gecikme(20000);
    Gecikme(20000);
    Gecikme(20000);
  }
}

Seri port iletişiminin kod içeriği için lütfen burada açıklanmayacak önceki bölüme bakınız~

ADC'ler genellikle 6 SFR içerir:

ADCCON1ADC genel kontrolü için, dönüşüm son bayrağı, ADC tetikleme yöntemi, rastgele sayı üreteci dahil
ADCCON2Sürekli ADC dönüşümü için yapılandırma (bu deney sürekli ADC dönüşümünü içermez ve bu SFR kullanılmaz)
ADCCON3Tek bir ADC dönüşümü için yapılandırma, referans voltaj, çözünürlük, dönüşüm kaynağı seçimi dahil
ADCH[7:0]ADC dönüşüm sonucunun yüksek seviyesi, yani ADC [13:6]
ADCL[7:2]ADC dönüşüm sonucunun düşük seviyesi, yani ADC [5:0]
ADCCFGAIN0~AIN7 ve ADC girişi olarak P0.0~P0.7 (bu SFR kullanılmaz çünkü bu testte dönüşüm kaynağı olarak çip içi sıcaklık sensörü seçilir ve AIN0~AIN7 içermez)

(Not: Yukarıdaki SFR detayları için lütfen CC2430 Çin kılavuzuna bakınız)

Şimdi ona odaklanalımgetTempuraturefonksiyonu ile birlikte sıcaklık değerini elde etmenin anahtarıdır:

(1) İlk olarak, ADC'yi tek bir örnekleme için yapılandırın: ADCCON3=0x3E ayarlayın, sistem voltajı olarak 1.25V seçin, 14 bit çözünürlüğü seçin ve ADC dönüşüm kaynağı olarak CC2430 çip üzerindeki sıcaklık sensörünü seçin

(2) Sonra ADCCON1 |= 0x30 ADC tetikleme yöntemini manuel olarak ayarlamak için ayarlayın (yani ADCCON.6=1 olduğunda ADC geçişini başlatın)

(3) Sonra ADC tekli dönüşümünü başlatmak için ADCCON1 |= 0x40

(4) Ifadeyi kullanın(!( ADCCON1 &0x80)) ADC geçişinin sonunu bekle

(5) Dönüşüm sonucu ADCH[7:0] (8 bit yüksek), ADCH [7:2] (6 bit daha aşağı) içinde saklanır ve şu şekilde geçirilir:

    değer = ADCL >>2;
    değeri |= (ADCH <<6);   

Dönüşüm sonucunu değerde kaydet

(6) Son olarak, formülü kullanıntemperature= değer*0.06229-311.43, sıcaklık değerini hesaplayıp geri dönüşü

CC2430 İpuçları
Son formül sizi şaşırtıyor olmalı, neden tek seferlik bir fonksiyon? Neden eğimi 0.06229 ve kesişmesi 211.43? Tamam, cevap şu:
Bu sıcaklık sensörü CC2430 çipinin içinde yer aldığından, tanımı kesinlikle kılavuzunda bulunabilir. Gerçekten de buradayımElektrik özellikleriİlgili içerik bu bölümde bulunmakta ve ekran görüntüsü şöyledir:
Bu tablo, sıcaklık sensörünün çıkış voltajına (V) kıyasla sıcaklığını (°C) tanımlar.
İlk olarak ikinci kırmızı kutuya bakın:sıcaklık katsayısı。 "Katsayı" mı? Biraz hissettirmiyor mu? Sonra birimine bakarsanız: mV/°C, aniden sıcaklık ile voltaj arasındaki ilişkinin doğrusal olduğunu fark edeceksiniz~ Yani:
burada V çıkış voltaj değeri, T sıcaklık değeri ve 2.45 eğimdir. Kesişme b aşağıda belirlenmelidir.
İlk bakışta, ilk kırmızı kutuda 0°C'deki voltajın 743mV olduğunu göreceğiz, yani b 743'e eşit mi? Aksi takdirde, aşağıya bakmaya devam ederseniz, mutlak hatasının 8°C'ye kadar ulaştığını göreceksiniz! Sağa baktığımızda, en uygun kesişmeyi zaten sağladığını göreceğiz, yani: b=763, bu yüzden aşağıdaki formül vardır:
Tamam, şimdi zaten sıcaklık sensörü varT sıcaklığına girinveÇıkış voltajı VSonraki adım ADC'yi bulmaktırGiriş voltajı VveÇıkış değeri N(yani 14 bitin dönüşüm sonucu) ve sonunda N ve T'nin dönüşüm formülünü bulur.
Dönüşüm sonucu N 14 bittir ve N=11 1111 1111 1111 1111 (ikili) olduğunda, çıkış voltajı maksimum değer olmalıdır (yani referans voltajı 1.25V). Bu nedenle, aşağıdaki orantılı ilişkiye sahibiz:
(Not: 14 bitlik çıktı ikili tamamlayıcı olduğundan, 14. bit sembol bitidir.) Yani mutlak terimlerde, etkin değer sadece 13 bit, yani 13'ün kuvvetine 2 vermiştir)
İki formül birleştirildiğinde, T ile N arasındaki ilişki şu şekilde çıkarılabilir:
BITT~

Son olarak, örnek başına neden 64 döngü gerektiğiyle ilgili birkaç kelime. Sensörler sıcaklık ölçümünde kaçınılmaz olarak parazite veya rastgele hatalara maruz kaldığından, sensörlerin elde ettiği veriler bazen abartılıdır (örneğin, ani 10°C değişimi ve ardından anında normale dönüş). Ama sıcaklık değişiminin bütünsel bir süreç olduğunu ve büyük bir sıçramanın anında gerçekleşmesinin nadirdigini biliyoruz). Bu nedenle, bu tür hataları azaltmak için ortalama yöntemi kullanıyoruz.

(4) Deneysel sonuçlar

Öncelikle, seri port hata ayıklama aracını açın, sonra programı indirip başlatın, aşağıdaki ekran belirecek:

Filmin içindeki sıcaklık yaklaşık 14,5°C'dir. Yazar, bedeniyle yurdun oda sıcaklığını hissediyor; bu sıcaklık yaklaşık 10°C'den biraz fazladır. Çipin içi biraz ısınmalı, yani 14°C normal~

Deneyin sonu.

3. Sonuç

Bu makale, ADC tek örneklemenin uygulanmasını açıklar. Bir sonraki bölümde bir veri aktarım modu tanıtacağızDMA(doğrudan bellek erişimi), yani "doğrudan bellek erişimi". ADC/UART/RF vericiler ve bellek cihazları gibi çevresel üniteler doğrudan "DMA denetleyicisi" kontrolü altında değiştirilebilirAz CPU müdahalesi gereklidir, bu da sistemin genel verimliliğini büyük ölçüde artırır.

Takipte kalın!


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




Önceki:Zigbee Yolculuğu (5): Birkaç önemli CC2430 temel deneyi - seri iletişim
Önümüzdeki:Zigbee Yolculuğu (7): Birkaç önemli CC2430 temel deneyi - DMA iletimi
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com