Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
analogRead()

analogRead()

概要

アナログ‐デジタル(AD)変換器を使って、アナログピンから値を読み取ります。Atmel社提供のライブラリ群を呼び出すことで実現しています。

SAM3X8Eプロセッサは12ビットのADC(Analog-to-Digital Converter:アナログ・デジタル変換器)を持っています(ATmega328Pは10ビットのADCです)。ただし、デフォルトでは10ビットの分解能に設定されています。おそらく、今までとの互換性のためだと思われます。分解能はanalogReadResolution()で変更することができます。

analogRead()のリファレンスはこちらをご覧ください。

ソースコード

analogRead()は、hardware/arduino/sam/cores/arduino/wiring_analog.c に定義されています。以下に全ソースコードを示します。

uint32_t analogRead(uint32_t ulPin)
{
  uint32_t ulValue = 0;
  uint32_t ulChannel;

  if (ulPin < A0)
    ulPin += A0;

  ulChannel = g_APinDescription[ulPin].ulADCChannelNumber ;

        switch ( g_APinDescription[ulPin].ulAnalogChannel )
        {
                // Handling ADC 12 bits channels
                case ADC0 :
                case ADC1 :
                case ADC2 :
                case ADC3 :
                case ADC4 :
                case ADC5 :
                case ADC6 :
                case ADC7 :
                case ADC8 :
                case ADC9 :
                case ADC10 :
                case ADC11 :

                        // Enable the corresponding channel
                        adc_enable_channel( ADC, ulChannel );

                        // Start the ADC
                        adc_start( ADC );

                        // Wait for end of conversion
                        while ((adc_get_status(ADC) & ADC_ISR_DRDY) != ADC_ISR_DRDY)
                                ;

                        // Read the value
                        ulValue = adc_get_latest_value(ADC);
                        ulValue = mapResolution(ulValue, ADC_RESOLUTION, _readResolution);

                        // Disable the corresponding channel
                        adc_disable_channel(ADC, ulChannel);

                        break;

                // Compiler could yell because we don't handle DAC pins
                default :
                        ulValue=0;
                        break;
        }
        return ulValue;
}
uint32_t analogRead(uint32_t ulPin)
{

入力は、ピン番号(ulPin)です。

  uint32_t ulValue = 0;
  uint32_t ulChannel;

  if (ulPin < A0)
    ulPin += A0;

  ulChannel = g_APinDescription[ulPin].ulADCChannelNumber ;

ulValueとulChannelを定義します。ulChannelはuint32_tとなっていますが、実際に代入されるのはenum adc_channel_num_t型です。

ulPinがA0よりも小さい場合は、ulPinにA0を加えます。analogRead()を呼び出す際に、シンボル(A0からA11)を用いず数字(0から11)を用いた場合のための処理です。

ulChannelに、g_APinDescription[ulPin].ulADCChannelNumberを代入します。g_APinDescriptionにはArduinoの全てのピンの情報が定義されています。

        switch ( g_APinDescription[ulPin].ulAnalogChannel )
        {
                // Handling ADC 12 bits channels
                case ADC0 :
                case ADC1 :
                case ADC2 :
                case ADC3 :
                case ADC4 :
                case ADC5 :
                case ADC6 :
                case ADC7 :
                case ADC8 :
                case ADC9 :
                case ADC10 :
                case ADC11 :

g_APinDescription[ulPin].ulAnalogChannelの値がADC0からADC11のときにAD変換を行います。

                        // Enable the corresponding channel
                        adc_enable_channel( ADC, ulChannel );

adc_enable_channel()を呼び出し、チャネルを有効にします。

                        // Start the ADC
                        adc_start( ADC );

adc_start()を呼び出し、AD変換を開始します。

                        // Wait for end of conversion
                        while ((adc_get_status(ADC) & ADC_ISR_DRDY) != ADC_ISR_DRDY)
                                ;

adc_get_status()を呼び出し変換が完了するのを待ちます。変換が完了するとADC状態レジスタのADC_ISR_DRDYビットが設定されます。

                        // Read the value
                        ulValue = adc_get_latest_value(ADC);
                        ulValue = mapResolution(ulValue, ADC_RESOLUTION, _readResolution);

adc_get_latest_value()を呼び出し値を読み取ります。

その後、mapResolution()を呼び出し、読み取った値の分解能を変換します。ADC_RESOLUTIONは12です。_readResolutionはデフォルトでは10と設定されています。analogReadResolution()を使って変更することができます。

                        // Disable the corresponding channel
                        adc_disable_channel(ADC, ulChannel);

                        break;

最後にadc_disable_channel()を呼び出しチャネルを無効化します。

                // Compiler could yell because we don't handle DAC pins
                default :
                        ulValue=0;
                        break;
        }

g_APinDescription[ulPin].ulAnalogChannelの値がADC0からADC11ではない場合は、ulValueを0に設定します。

        return ulValue;
}

最後にulValueを返却します。

バージョン

Arduino 1.5



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2013 garretlab all rights reserved.
inserted by FC2 system