ADC (STM32)

(2015.4.28 作成)

(2018.12.29 更新)

(2019.6.16 Update)

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

ADC_Signle

 ArduinoのAnalogReadやmbedのAnalogInと同様なインターフェースを持つクラスです。基底クラス(DKS_ADC_Base.hに記載されているIADCクラス)を継承しているためArduino版と同様に使用することができます。DMAを使用していないため、呼び出すたびにADC変換が実施されます。

関数リファレンス

初期化

プロトタイプ

void Init( ADC_TypeDef *ADCx, const uint32_t &Channel,

              const uint32_t &SamplingTime);

戻り値

なし

引数

ADCx

変換に使用するADC。F103xBの場合はADC1またはADC2を指定

Channel

ADC_CHANNEL_1などチャンネル指定

SamplingTime

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

ADC_SAMPLETIME_41CYCLES_5=約3usです

備考

 

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

サンプルコード

#include "DKS_Common_F103xB.h"
#include "DKS_ADC_F103xB.h"
#include "DKS_F103C8T6.h"

extern "C"
{
uint16_t tes[3]={0};
DKS::STM32F103C8T6 board(DKS::BluePill);

int main(void)
{
    DKS::InitSystem();
    board.Init();

    const uint32_t channels[] = { LL_ADC_CHANNEL_1, LL_ADC_CHANNEL_8, LL_ADC_CHANNEL_2 }; //PA1, PB0, PA2
    DKS::ADC_Single adc1, adc2, adc3;
    adc1.Init(ADC1, channels[0]);
    adc2.Init(ADC1, channels[1]);
    adc3.Init(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値が自動で更新され続けているので、任意のタイミングで値を確認するだけです。サンプルコードを見ていただければ分かりやすいかと思います。

関数リファレンス

初期化

プロトタイプ

Init(ADC_TypeDef *ADCx,  const uint32_t *Channels,

      const uint16_t *Buffer,const uint8_t &NbrOfChannels,

      const uint32_t *SamplingTime=0);

戻り値

なし

引数

ADCx

F103xBの場合ADC1またはADC2のいずれか

Channel

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

Buffer

変換結果を格納する配列へのポインタ。事前確保が必要

NbrOfChannels

変換を行うチャネル数

SamplingTime

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

ADC_SAMPLETIME_41CYCLES_5=約3usです

備考

 

変換を開始する

プロトタイプ

void ConversionStart()const;

戻り値

なし

引数

なし

備考

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

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

変換を終了する

プロトタイプ

void ConversionStop()const;

戻り値

なし

引数

なし

備考

変換開始を終了します 

サンプルコード

#include "DKS_Common_F103xB.h"
#include "DKS_ADC_F103xB.h"
#include "DKS_F103C8T6.h"
#include <string.h>

extern "C"
{
uint16_t tes[3]={0};
DKS::STM32F103C8T6 board(DKS::BluePill);

int main(void)
{
    DKS::InitSystem();
    board.Init();

    const uint32_t channels[] = { LL_ADC_CHANNEL_1, LL_ADC_CHANNEL_8, LL_ADC_CHANNEL_2 }; //PA1, PB0, PA2
    const uint8_t NumOfChannels = sizeof(channels)/sizeof(uint32_t);
    const uint32_t Sampling[] = { LL_ADC_SAMPLINGTIME_41CYCLES_5, LL_ADC_SAMPLINGTIME_41CYCLES_5,

    uint16_t buff[NumOfChannels];

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

    while (1)
    {
        memcpy((uint16_t*) tes, buff, NumOfChannels * sizeof(uint16_t));
    }
}
}

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