2012年9月7日金曜日

PIC32MX220F032B-04 A/D変換(ADC)を使う


秋月にてPIC32MX220F032Bが220円と大変安価かつDIPにて32bitマイコンが手に入るようになりました.
折角なので,PIC16FシリーズだけでなくPIC32MXも遊んでみようと試みようと
後閑さんの『高速・多機能を実現する pic32mx活用ガイドブック
を購入させていただきました.
大変良くまとまっています.PIC32MXをC32コンパイラで使うなら手元に置いておきたい.購入するべきです.
しかしながらPIC32MX340F256H用に書かれたものであり,PIC16Fシリーズで扱っていたCCS-Cなどと異なり,単純なコピー&ペーストを行っただけではコンパイルエラーになったり正しい動作が行われなかったりしまてしまいました.
ここではPIC32MX220F032B用に書き直して紹介していきたいと思います.

注意:私の提供する情報を元に何らかのトラブルが生じても責任を負いません.


<今回行うこと>
PIC32MX220F032BにてA/Dコンバータ機能の基本機能を扱えるようにします.
今回はAN5(7番ピン)でアナログ値を入力し,値の情報をシリアル通信で送信します.
ADコンバータが機能しているかどうかターミナルソフト「Tera Term」で確認します.

  • AN5(7番ピン)でA/D変換(ADC)を行う
  • UART1(RX):RB13で使用(受信割り込み)
    • "a"入力で A/D値,"v"入力で電圧値の表示選択を行う.
  • UART1(TX):RB15で使用(printf出力)
    • 50msec待機ごとに(50msec周期ではない)A/D値or電圧値を送信
<対象者>
PIC32MX220F032BでUARTを使う(受信割り込み)(printf出力)を理解した方

<用意するもの>
  • PIC32MX220F032BでUARTを使う(受信割り込み)(printf出力) の環境
    • パソコン(「MPLAB X IDE v1.30」と「C32 Cコンパイラv2.02」の環境で行いました)
    • PIC32MX220F032B(言うまでもないけど)
    • PICkit3(PICkit2でも書き込む方法があるらしい)
    • ブレッドボード(EIC-102が好きなのですが,単品で買える店が少ない)
    • ジャンパ線( EIC-102J付属品で良いと思う)
    • 抵抗 1k Ω(LED用),10k Ω(プルアップ用) 各1こ
    • コンデンサ 10uF 最低1こ (0.1uでも動作したが,「なし」では動作しなかった)
    • LED 1こ
    • Tera Term などといった通信ソフト
    • 3.3VレベルのUSBシリアル変換ケーブル 
  • 半固定抵抗
    • 0~3.3Vを出力するものであれば何を使用しても構いません
<資料>
最新版を探してきたつもりですが,検索かけ直して入手する方が良いと思います.
<配線>
特別解説すべきことはありません.私は図1に示すような配線を行いました.
図1 半固定抵抗の接続

<プログラム>
以下からソースコードをダウンロードできます.(リンク先にてCtrl+SでZIP保存)
※前回と異なり,ボーレートが57600bpsになっています.
設定事項は後閑さんの『高速・多機能を実現する pic32mx活用ガイドブック』に書かれています.
ただし,丸コピすると他のアナログピンを持つI/Oピンが機能しなくなるトラブルに見舞われました.
PIC32MX220F032Bデータシートを眺めてみると,AD1PCFGレジスタが存在しませんでした.
AD1PCFGレジスタに何か書き込む指令を行うと不具合の元になります.
また,AN5;RB3のI/Oポート設定を入力にするのを忘れないよう気をつけてください.

// ADC Configパラメータ定義
#define AD1CON1R ADC_MODULE_OFF | ADC_FORMAT_INTG16 | ADC_CLK_MANUAL | ADC_AUTO_SAMPLING_ON |ADC_SAMP_ON
#define AD1CON2R ADC_VREF_AVDD_AVSS | ADC_OFFSET_CAL_DISABLE | ADC_SCAN_OFF | ADC_SAMPLES_PER_INT_4 | ADC_ALT_BUF_OFF | ADC_ALT_INPUT_OFF
#define AD1CON3R ADC_SAMPLE_TIME_3 | ADC_CONV_CLK_SYSTEM | ADC_CONV_CLK_6Tcy
#define AD1PCFGR (0x0000)
#define AD1CSSLR SKIP_SCAN_ALL


    CloseADC10();
    SetChanADC10( ADC_CH0_NEG_SAMPLEA_NVREF | ADC_CH0_POS_SAMPLEA_AN5 );
    OpenADC10(AD1CON1R, AD1CON2R, AD1CON3R, AD1PCFGR, AD1CSSLR);
    EnableADC10();

ConvertADC10();    // 変換開始
while(BusyADC10());   // 変換完了待ち(1チャネル分)
Result = ReadADC10(0);   // 変換結果読み出し


半固定抵抗を任意に回転させ,ターミナルで表示させると以下のようになりました.

Voltage = 2.155
Voltage = 2.155
Voltage = 2.145
A/Ddata =  665
A/Ddata =  665
A/Ddata =  665
A/Ddata =  668
値が±3程度で暴れ,見事に安定しません.これは,PIC32MX220F032BでLEDチカチカ(+入力)をするの 図2 推奨する最小接続部品構成 の指示に従っていないこと,電源が不安定であること,ブレッドボードを利用していることが原因と考えられます.場合によってはA/D変換速度を見直すべきでしょう.

追記:推奨する最小接続部品構成の指示に従ってみたところ,+1あるいは-1に収まりました.


ブログランキング・にほんブログ村へ

0 件のコメント:

コメントを投稿