ADC (STM32)

(2015.4.28 作成)

 ADC全体の説明ページで簡単に触れていますが、1チャンネルごとに指定してAD変換を行うクラス(ADC_Singleクラス)とDMAを使用して複数のチャンネルをスキャンするクラス(ADC_Scanクラス)の2種類があります。

ADC_Signle

 DKS_ADC_Base.hに記載されているIADCクラスを継承しているAD変換の基本クラスです。Arduino版と同等の扱いが可能です。本家ArduinoのAnalogReadやmbedのAnalogInクラスとほぼ同じ扱いです。

関数リファレンス

コンストラクタ

プロトタイプ

ADC_Single( ADC_TypeDef *ADCx,

                   const uint32_t &Channel,

                   const uint32_t &SamplingTime);

戻り値

なし

引数

ADCx

F303:ADC1~4のいずれかを指定

F401:何を指定してもADC1になります

Channel

ADC_CHANNEL_1などチャンネル指定

SamplingTime

ADC_SAMPLETIME_112CYCLESなどサンプリング時間を指定します。マイコン機種依存です。未指定時のデフォルトは

F303 : ADC_SAMPLETIME_181CYCLES_5

F401 : ADC_SAMPLETIME_112CYCLES

備考

 

 使用されるピンやSamplingTimeの指定値はマイコンのリファレンスマニュアルやデータシートを参照してください。

サンプルコード

#include "DKS_Util_NucleoF401.h"
#include "DKS_ADC_NucleoF401.h"

extern "C"
{
uint16_t tes[3]={0};

int main(void)
{
    DKS::InitSystem();

    const uint32_t channels[]={ADC_CHANNEL_1, ADC_CHANNEL_8, ADC_CHANNEL_10}; //PA1,PB0,PC1
    DKS::ADC_Single adc1(ADC1, channels[0]);
    DKS::ADC_Single adc2(ADC1, channels[1]);
    DKS::ADC_Single adc3(ADC1, channels[2]);

    while (1)
    {
       tes[0]=adc1.read_u16();
       tes[1]=adc2.read_u16();
       tes[2]=adc3.read_u16();
    }

}
}

このコードをマイコンに書き込むとSTM studioでパラメータtes[3]の変化をグラフ化してみることが出来ます。

ADC_Scan

 DMAを使用してCPUを介在させずに複数チャンネルを連続して変換します。CPUを使用しないためCPUの動作には影響を与えませんが、常に変換を行い続けているため電力的には損になると思います。これが問題になる場合は変換毎に割り込みを発生させるなど応用したクラスが必要になります。

 使い方は単純でConversionStart()で連続変換を開始します。その後はクラスのメンバ変数であるvalue値が自動で更新され続けているので、任意のタイミングで値を確認するだけです。サンプルコードを見ていただければ分かりやすいかと思います。

関数リファレンス

コンストラクタ

プロトタイプ

ADC_Scan(ADC_TypeDef *ADCx,

                 const uint32_t *Channels,

                 const uint8_t &NbrOfChannels,

                 const uint32_t *SamplingTime=0);

戻り値

なし

引数

ADCx

F303:ADC1~4のいずれかを指定

F401:何を指定してもADC1になります

Channel

ADC_CHANNEL_1などチャンネル指定の配列

NbrOfChannels

変換を行うチャネル数

SamplingTime

ADC_SAMPLETIME_112CYCLESなどサンプリング時間を配列で指定します。マイコン機種依存です。未指定時のデフォルトは

F303 : ADC_SAMPLETIME_181CYCLES_5

F401 : ADC_SAMPLETIME_112CYCLES

備考

 

変換を開始する

プロトタイプ

void ConversionStart()const;

戻り値

なし

引数

なし

備考

変換開始後は常に変換を行い続けます。

変換した値はクラス変数のvalueに格納されます。 

変換を終了する

プロトタイプ

void ConversionStop()const;

戻り値

なし

引数

なし

備考

変換開始を終了します 

サンプルコード

#include "DKS_Util_DiscoF3.h"
#include "DKS_ADC_DiscoF3.h"
#include 

extern "C"
{
uint16_t tes[3]={0};

int main(void)
{
        DKS::InitSystem();

        const uint32_t channels[]={ADC_CHANNEL_2, ADC_CHANNEL_3, ADC_CHANNEL_5}; //PA1,PA2,PF4
        const uint8_t NumOfChannels = sizeof(channels)/sizeof(uint32_t);
    const uint32_t Sampling[]={ADC_SAMPLETIME_181CYCLES_5,ADC_SAMPLETIME_181CYCLES_5,ADC_SAMPLETIME_181CYCLES_5};

        DKS::ADC_Scan adcCnt(ADC1,channels,NumOfChannels,Sampling);
        adcCnt.ConversionStart();

        while (1)
        {
            memcpy((uint16_t*)tes, (uint16_t*)(adcCnt.value), NumOfChannels * sizeof(uint16_t));
        }

}
}

このコードをマイコンに書き込むとSTM studioでパラメータtes[3]の変化をグラフ化してみることが出来ます。