[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ソース: MPLAB Project files (PowerUnitSrc.zip) 2012/01/10
HEX: PowerUnitHex.zip 2012/01/10
開発環境
① MPLAB v8.83 + C30 v3.30b マイクロチップテクノロジージャパン株式会社
全て無料の環境で開発する事が出来ます。
ライタ&デバッガ
② PICkit 2 または PICkit 3 または 対応ライタ
プログラム説明
上記プロジェクトに含まれるソースファイルは、この main.c だけです。
今回のPICの役割は、電圧電流を表示するだけですので簡素です。
動作クロックは、内部FRC(7.37MHz)を約8MHzに調整し、1/4して2MHzを作っています。
これはFOSCなので、実質的なクロック(FCY)としてはさらに半分の1MHz駆動となっています。
// クロック設定(Fosc = 2.0014155MHz)
_TUN = 23; // +8.625% -> 8.0056625MHz
_FRCDIV = 0b010; // FRC divide by 4
メインループでは、測定をセットアップし、ADC割り込みで値を取得後、表示データを作成する
処理を繰り返すだけです。
作成した表示データは、タイマ割り込みで7セグLEDへ表示します(測定中を除く)。
ADCは、12Bitモード差動入力(負極性入力有効)に設定し、VREFを使うように設定します。
// AD1CON1
_ADSIDL = 0;
_AD12B = 1; // 12Bit mode
_FORM = 0b00; // 符号なし整数
_SSRC = 0b111; // 自動変換
_ASAM = 1; // 自動サンプリング
_SAMP = 0;
// AD1CON2
_VCFG = 0b001; // VREF+ AVSS
_CSCNA = 1; // CH0チャンネルスキャン
_SMPI = 0b0111; // 8回の変換動作完了で割込み
_BUFM = 0; // 全変換結果をバッファ
_ALTS = 0; // 常にサンプルA
// AD1CON3(変換時間=(4+14)xTAD=18x250ns= 4.5us)
_ADRC = 1; // TAD=TADRC=250ns(4MHz)
_SAMC = 4; // サンプルタイム=4TAD(1uS)
// AD1CHS0
_CH0NA = 1; // チャンネル0 負極性入力にAN1を選択
// AD1CSSL
AD1CSSL = 0b0000000000111100; // Analog AN2,3,4,5
_ADON = 1;
測定は、ノイズの影響を受けないようにSleep中に行うようにしています。
Sleep中にチャンネルスキャンを実行させ、8回の測定を終えた後に割り込みが入り、ウェイク
アップします。
最初の4回分は、Sleepモードに入った直後の計測ですので捨てて、安定していると思われる
後の4回分の値を使用します。
電圧電流それぞれ2つのレンジがありますが、ADCは12Bit(max.4096)ですので、低い方の
値4000を境に自動レンジ切り換えを行います。
[電圧]
1mVStep(0~4.000V)
2mVStep(4.000V~)
[電流]
1mAStep(0~4000mA)
2mVStep(4000mA~)
尚、スイッチは、最大値ホールド、最小値ホールド、ノーマル表示を切り換えます。
ホールド表示では、それが判るように電流計の小数点を点滅させるようにしています。