PIC24FでADコンバーターを使ってみる

Pocket

 PIC24FJ64GB002のADコンバーターを使ってみたいと思います。

 

 基本はPeripheral Libraryの関数、マクロを使用します。 Peripheral LibraryはXC16_v1.25には.hファイルが何故か同梱されてないため使えません。v1.24以前のバージョンでコンパイルします。

⊿1: Peripheral Librariesを個別でインストールすれば最新のコンパイラーでもコンパイルできました。

個別に Peripheral Librariesをインストールする方法はこちら

 

 詳細マニュアルはインストール先によりますが、だいたいここら辺りにあります。
\Microchip\xc16\v1.24\docs\periph_libs\Microchip PIC24F Peripheral Library.chm
もっと詳しく知りたい場合はこれを見ましょう。

 

 ADコンバーターで読み取った値からLEDの明るさを変化させるソースです▼

#define USE_AND_OR                      /**/
#define FCY 16000000UL                  /*delay関数用定義 Forc/2*/
#include<ports.h>                       /*ポートbit操作マクロの定義*/
#include<libpic30.h>                    /*delay関数用*/
#include<PPS.h>                         /*ピン割り当て*/
#include<timer.h>
#include<outcompare.h>
#include<adc.h>


unsigned int ADConfig1, ADConfig2, ADConfig3, ConfigPort, Configscan;
unsigned int ADResult;

int main(void) {
  AD1PCFG = 0xfffe;                     /*AN0アナログ他デジタル */
  CLKDIV  = 0x0000;                     /*クロックをPLL prescaler (1:1)で使用 32MHz*/

  ADConfig1 =  ADC_MODULE_ON            |
               ADC_IDLE_CONTINUE        |
               ADC_FORMAT_INTG          |
               ADC_CLK_AUTO             |
               ADC_AUTO_SAMPLING_ON     ;
  ADConfig2 =  ADC_VREF_AVDD_AVSS       |
               ADC_SCAN_ON              |
               ADC_INTR_EACH_CONV       |
               ADC_ALT_BUF_OFF          |
               ADC_ALT_INPUT_OFF        ;
  ADConfig3 =  ADC_CONV_CLK_INTERNAL_RC |
               ADC_SAMPLE_TIME_17 |
               ADC_CONV_CLK_254Tcy;
  ConfigPort = ENABLE_AN0_ANA;
  Configscan = ADC_SCAN_AN0  ;

  SetChanADC10(ADC_CH0_POS_SAMPLEA_AN0);
  OpenADC10(ADConfig1, ADConfig2, ADConfig3, ConfigPort, Configscan);
  EnableADC1;

  mPORTBOutputConfig(IOPORT_BIT_1);   /*RB1出力設定*/
  mPORTBWrite(0);                     /*PORTB Low設定*/
  PPSOutput(PPS_RP14, PPS_OC1);       /*RP14(RB14)にOC1を割り当て*/
  PPSOutput(PPS_RP15, PPS_OC2);       /*RP14(RB14)にOC2を割り当て*/

  OpenTimer2(T2_ON | T2_PS_1_1 , 0xffff);
  OpenOC1(OC_IDLE_CON | OC_TIMER2_SRC | OC_PWM_EDGE_ALIGN , OC_SYNC_TRIG_IN_TMR2, 0, 0);
  OpenOC2(OC_IDLE_CON | OC_TIMER2_SRC | OC_PWM_EDGE_ALIGN , OC_SYNC_TRIG_IN_TMR2, 0, 0);

  while (1) {
    mPORTBSetBits(IOPORT_BIT_1);
    __delay_ms(1);
    mPORTBClearBits(IOPORT_BIT_1);
    __delay_ms(1);

    ConvertADC10();
    while (BusySampADC1);
    ADResult = ReadADC10(0);
    SetDCOC1PWM((0xffff / 1024)*ADResult, 0);
    SetDCOC2PWM((0xffff / 1024) * 1024, 0);
  }

 TimerやPWM出力の使い方は「PIC24FでPWM出力の方法」「PIC24FでTimerを使ったLチカ」で解説してるのでそちらを参照してください。

 PIC24FのADコンバーターをライブラリから使用する場合はまず
SetChanADC10
(ADC_CH0_POS_SAMPLEA_AN0);
OpenADC10(ADConfig1, ADConfig2, ADConfig3, ConfigPort, Configscan);
の2つの関数で初期設定を行います。

 

<スポンサーリンク>

 

 OpenADC10は設定項目が非常に多いので変数を準備してそちらでまとめて定義してます。設定内容の詳細はPeripheral Libraryのマニュアル参照して下さい。

 

ConvertADC10(); でAD変換開始、
while (BusySampADC1); で変換完了待ちしてます。
ReadADC10(0); AD値を読み取ります。変換値は10bitです。

 

 読み取った値をPWM出力し、LEDの明るさを変化させてます。
設定項目が多いですが、ライブラリ使えばそれほど難しくないかと思います。

 

 PIC24Fは今まであまり弄ったことことがありませんでしたが、デジタルI/O、Timer、PWM出力、ADコンバーターと基本的な使用方法はわかりました。これだけ覚えればとりあえず何か作れるでしょう。

 

 

Pocket

<スポンサーリンク>


この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL