|
1. 上層と下層の接続 無線センサーネットワークでは、センサーのアナログ値をデジタル量に変換し、簡単に伝送・処理することが重要です。 この変換を完了するためにADC(アナログからデジタル変換器へ)が使用されます。 前節では、CC2430とPC間のシリアルポート通信を導入しました。 CC2430には温度センサーが内蔵されており、このセクションでは前回のセクションに基づくオンチップ温度監視の簡単な実験を実装します。すなわち、ADCを使ってオンチップ温度センサーの電圧値をデジタル値に変換し、その式で温度値を計算し、シリアルポートを通じてPCに温度値を送信して表示します。 2. ADCシングルサンプリング(1) 実験への導入ADCはCC2430オンチップ温度センサーの温度値を変換するために使われ、その温度値はシリアルポートを通じてPCに送信され表示されます。 (2) プログラムフローチャート
(3) 実験的ソースコードと解析/*
実験的説明:チップ内の温度取得実験は、シリアルポート0を通じてデータをPCに送信します
*/
#include
#define リード1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*32M晶振初始化
-------------------------------------------------------*/
虚無xtal_init(虚無)
{ 眠り &= ~0x04; //都上电
ただし(! (眠りと0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; 32MHzのクリスタルオシレーターを選びましょう 眠り |=0x04;
}
/*LED灯初始化
-------------------------------------------------------*/
虚無led_init(虚無)
{ P1SEL =0x00; P1は通常のI/Oポートです P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 出力
led1 =1; led2 =1; led3 =1; led4 =1;
}
/*UART0初始化
-------------------------------------------------------*/
虚無 Uart0Init(署名なし チャーStopBits、署名なし チャーパリティ)
{ P0SEL |= 0x0C; //初始化UART0端口 PERCFG&= ~0x01; //选择UART0为可选位置一 U0CSR =0xC0; UARTモードに設定し、受容体を有効にする U0GCR =11; U0BOUD =216; //设置UART0波特率为115200bps U0UCR |= StopBits|パリティ; //设置停止位与奇偶校验
}
/*UART0发送字符
-------------------------------------------------------*/
虚無 Uart0Send(署名なし チャーデータ)
{
ただし(U0CSR&0x01); //等待UART空闲时发送数据 U0DBUF = data;
}
/*UART0发送字符串
-------------------------------------------------------*/
虚無Uart0SendString(署名なし チャー*s)
{
ただし(*s !=0) Uart0Send(*s++);
}
/*UART0接收数据
-------------------------------------------------------*/
署名なし チャーUart0Receive(虚無)
{
署名なし チャーデータ;
ただし(! (U0CSR&0x04));//查询是否收到数据,否则继续等待 data=U0DBUF;
帰還データ;
}
/*延时函数
-------------------------------------------------------*/
虚無遅延(署名なし 知力n)
{
署名なし 知力私;
に対して(i=0; i<n; i++);
に対して(i=0; i<n; i++);
に対して(i=0; i<n; i++);
に対して(i=0; i<n; i++);
に対して(i=0; i<n; i++);
}
/*得到实际温度值
-------------------------------------------------------*/
浮き上がるgetTemperature(虚無)
{
署名なし 知力 価値;
ADCCON3 = (0x3E); //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
ADCCON1 |=0x30; //选择ADC的启动模式为手动 ADCCON1 |=0x40; AD変換を開始する
ただし(! (ADCCON1 &0x80)); //等待ADC转化结束
値 = ADCL >>2; 値 |= (ADCH <<6); //取得最终转化结果,存入value中
帰還価値*0.06229-311.43; //根据公式计算出温度值
}
/*主函数
-------------------------------------------------------*/
虚無メイン(虚無)
{
チャー私;
浮き上がる平均温度;
署名なし チャー出力[]="";
xtal_init(); led_init();
led1 =0;
Uart0Init(0x00, 0x00); //初始化串口:无奇偶校验,停止位为1位
Uart0SendString(「こんにちは、CC2430 - 温度センサー!");
ただし(1) { led1 =0; avgTemp =0;
に対して(i =0; 私 <64; i++) { avgTemp += getTemperature(); avgTemp = avgTemp/2; //每采样1次,取1次平均值 }
出力[0] = (署名なし チャー(avgTemp)/10 + 48; //十位 出力[1] = (署名なし チャー(avgTemp)%10 + 48; //个位 出力[2] ='.'; //小数点 出力[3] = (署名なし チャー(avgTemp*10)%10+48; //十分位 出力[4] = (署名なし チャー(avgTemp*100)%10+48; //百分位 出力[5] =''; //字符串结束符
Uart0SendString(output); Uart0SendString(「°C"); led1 =1; //LED熄灭,表示转换结束,
遅延(20000); 遅延(20000); 遅延(20000); 遅延(20000); 遅延(20000); 遅延(20000); 遅延(20000); 遅延(20000); 遅延(20000); 遅延(20000); }
}
シリアルポート通信のコード内容については、ここでは説明しない前の節を参照してください~ ADCは通常6人のSFRを含みます: | ADCCON1 | ADCの一般的な制御用で、変換エンドフラグ、ADCトリガーメソッド、乱数生成器などが含まれます。 | | ADCCON2 | 連続ADC変換の構成(この実験は連続ADC変換を含まず、このSFRを使用しません) | | ADCCON3 | 単一のADC変換のための構成(参照電圧の選択、分解能、変換源を含む) | | ADCH[7:0] | ADC変換結果の高いレベル、すなわちADC [13:6] | | ADCL[7:2] | ADC変換結果の低レベル、すなわちADCは[5:0] | | ADCCFG | AIN0~AIN7で、P0.0~P0.7をADC入力として使用します(このSFRは、このテストではオンチップ温度センサーが変換源として選択され、AIN0~AIN7は関与していないため使用されません) |
(注:上記のSFRの詳細についてはCC2430中国語マニュアルをご参照ください) 次に、それに注目しましょうgetTempuratureこれは温度値を得る鍵です: (1) まず、ADCを単一サンプリングとして設定します。ADCCON3=0x3Eに設定し、システム電圧として1.25Vを選択し、14ビット解像度を選択し、ADC変換ソースとしてCC2430オンチップ温度センサーを選択します (2) 次にADCCON1 |= 0x30を設定し、ADCトリガーメソッドを手動に設定します(すなわち、ADCCON.6=1の時点でADC遷移を開始します) (3) 次に ADCCON1 |= 0x40 とし、ADC 単一変換を開始します (4) 文を使ったときに(!( ADCCON1 &0x80)) ADCの移行が終わるまで待つ (5) 変換結果はADCH[7:0](8ビット高)、ADCH [7:2](6ビット下位)に保存され、次のように伝達されます: 値 = ADCL >>2; 値 |= (ADCH <<6);
変換結果を値に保存します (6) 最後に、次の式を用います温度=値*0.06229-311.43温度値を計算し、返す CC2430のヒント最後の式に不思議に思っているでしょう。なぜ一度きりの機能なのか? なぜ傾きが0.06229で、切片が211.43なのでしょうか? では、答えをお伝えします: この温度センサーはCC2430チップ内部に搭載されているため、その説明はマニュアルに確かに記載されています。 案の定、ここにいる電気仕様関連コンテンツはこのセクションにあり、スクリーンショットは以下の通りです:
この表は、温度センサーの温度(°C)と出力電圧(V)の関係を示しています。 まずは2つ目の赤いボックスを見てみましょう:温度係数。 「係数」? ちょっと変な感じじゃない? 次に単位mV/°Cを見ると、温度と電圧の関係が線形であることに気づくでしょう~つまり: ここでVは出力電圧値、Tは温度値、2.45は傾きです。 切片bは下記で決定しなければなりません。 一見すると、最初の赤いボックスで0°Cの電圧は743mVであることがわかります。つまり、bは743に等しいということですか? そうでなければ、さらに下を見れば絶対誤差が最大8°Cに達することがわかります! 右を見ると、すでに最も適した切片、すなわち b=763 を提供していることがわかります。したがって次の式があります。 さて、もう温度センサーは手に入れた温度Tの登場そして出力電圧V次のステップはADCを見つけることです入力電圧Vそして出力値N(すなわち14ビットの変換結果)、そして最終的にNとTの変換式を求めます。 変換結果Nは14ビットであり、N=11 1111 1111 1111(2進数)の場合、出力電圧は最大値(すなわち基準電圧1.25V)であるべきです。 したがって、次の比例関係が得られます。
(注:14ビットの出力は2進補数であるため、14ビット目はシンボルビットです。) したがって、絶対値では実効値は13ビット、つまり2の13のべき乗です) この二つの式を組み合わせると、TとNの関係は次のように導出できます。 オーバー~
最後に、なぜサンプルあたり64サイクルが必要なのかについて少し説明します。 センサーは温度測定時に干渉やランダムな誤差が生じるため、得られるデータは時に誇張されることがあります(例えば、10°Cの急激な変化があってすぐに正常に戻る場合など)。 しかし、温度変化は不可欠な過程であり、一瞬で大きなジャンプが起こることは稀です。 したがって、このような誤差を減らすために平均法を用います。 (4) 実験結果まずシリアルポートデバッグツールを開き、プログラムをダウンロードして起動すると、次の画面が表示されます。
フィルム内の温度は約14.5°Cです。 著者は自分の体で寮の室温、約10°C強を感じます。 チップの内部には熱が必要なので、14°Cは基本的に普通の温度です~ これで実験は終わりだ。 3. 結論この記事では、ADCシングルサンプリングの実装について説明します。 次のセクションでは、データ転送モードを紹介しますDMA(直接メモリアクセス)、すなわち「直接メモリアクセス」です。 ADC/UART/RFトランシーバーやメモリデバイスなどの周辺機器は、「DMAコントローラ」の直接制御下で交換可能ですCPUの介入はほとんど必要ありませんこれにより、システム全体の効率が大幅に向上します。 続報をお楽しみに! </n; i++); </n; i++); </n; i++); </n; i++); </n; i++);
|