電子工作etc


■PICのA/D変換時間(関数比較)
  ★概要
    使用しているコンパイラ 「mikroC PRO for PIC」が、v3.2からv3.8にバージョンアップしました。
    追加された関数の一つに、A/D変換関数があります。
      ・既存関数 → ADC_Read関数
      ・追加関数 → ADC_Init関数、ADC_Get_Sample関数

    そこで、今後の製作に役立つのではと考え、既存関数と追加関数によるA/D変換時間を比較してみました。

  ★実験内容
    PIC12F683を、8MHzクロックで使用した時のA/D変換時間を測定しました。

    <既存関数の測定の流れ>  ※スイッチ(SW1)をOFFにします。
      ・TPを“1”にします。
      ・ADC_Read関数でA/D変換を1000回行います。
      ・TPを“0”にします。
      ・ADC_Read関数でA/D変換を1000回行います。
      ・これらの処理を繰り返します。
      ※TPが“1”になってから“0”になるまでの時間をオシロスコープで観測します。

    <追加関数の測定の流れ>  ※スイッチ(SW1)をONにします。
      ・TPを“1”にします。
      ・ADC_Init関数でADCを初期化します。
      ・ADC_Get_Sample関数でA/D変換を1000回行います。
      ・TPを“0”にします。
      ・ADC_Init関数でADCを初期化します。
      ・ADC_Get_Sample関数でA/D変換を1000回行います。
      ・これらの処理を繰り返します。
      ※TPが“1”になってから“0”になるまでの時間をオシロスコープで観測します。

  ★実験回路図
     

  ★実験プログラム

void main()
{
    int    cnt;
    //
    OSCCON = 0b01110000;
    CMCON0 = 0b00000111;
    ANSEL = 0b00000001;
    TRISIO = 0b00001001;
    //
    while (1) {
        if (GPIO.B3 == 1) {
            GPIO.B2 = 1; //TP->1
            for (cnt = 0; cnt < 1000; cnt++) {
                ADC_Read(0);
            }
            GPIO.B2 = 0; //TP->0
            for (cnt = 0; cnt < 1000; cnt++) {
                ADC_Read(0);
            }
        } else {
            GPIO.B2 = 1; //TP->1
            ADC_Init();
            for (cnt = 0; cnt < 1000; cnt++) {
                ADC_Get_Sample(0);
            }
            GPIO.B2 = 0; //TP->0
            ADC_Init();
            for (cnt = 0; cnt < 1000; cnt++) {
                ADC_Get_Sample(0);
            }
        }
    }
}

  ★実験の様子と結果
     
    <ADC_Read関数を使用した場合>
      ・1000回のA/D変換時間は、約74msecです。
      ・1回あたりの変換速度は、約74usecです。
     
    <ADC_Init関数+ADC_Get_Sample関数を使用した場合>
      ・1000回のA/D変換時間は、約70msecです。
      ・1回あたりの変換速度は、約70usecです。
     
    如何ですか?

    ※A/D変換時間を少しでも、短縮する際の参考になれば幸いです。


電子工作etc