(2015.4.28 作成)
(2018.12.29 更新)
(2019.6.16 Update)
ADC全体の説明ページで簡単に触れていますが、1チャンネルごとに指定してAD変換を行うクラス(ADC_Singleクラス)とDMAを使用して複数のチャンネルをスキャンするクラス(ADC_Scanクラス)の2種類があります。
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]の変化をグラフ化してみることが出来ます。
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]の変化をグラフ化してみることが出来ます。