ショウのマイクロマウス研修マウス自作研修

ショウのマイクロマウス制作-Part9

ショウのマイクロマウス制作-Part9 ショウのマイクロマウス研修

こんにちは、ショウです。
前回は割り込みを設定しました。
今回はAD変換を使えるようにします。AD変換はバッテリーの電圧のチェックや、壁センサの値の取得に使います。
とりあえず今回は1チャンネルのAD変換をするように作成します。

CubeMX

ADCのシングル変換
今回はPA0ピンをAD変換に使います。

PA0をクリックしてADC2_IN1を使います。CategoriesのADC2をクリックしてModeの中のIN1の機能としてSingle-endedを選択します。
Single-endedを選択

Configurationで設定を行います。
設定は次のようにしました。

Configuration

clockprescalerをAsynchronous clock mode divided by 2を選択します。
これはADCに供給するクロックの周波数を決めています。divided by 1も選択できますが、供給するクロックが早すぎて正確な変換ができないようなのでdivided by 2を選択しています。
Resolutionは12-bitを選択して、12bitAD変換を行うように設定しています。
また、Rankと書いてあるとこの中のSampling Timeを24.5Cyclesにします。Sampling TimeはADCの計算にかけるクロック数の選択と同時に、インピーダンスをあわせるという目的があります。下の表はデータシートの表で今回はGNDにつなげる抵抗を1kΩを使用しているので1kより大きくかつ値が近い24.5を使用しています。

STM32G474データシートより(DS12288)

STM32G474データシートより(DS12288)

LLライブラリを使った1チャンネルADC

AD変換を動かすためにはまずLL_ADC_Enable関数でADCを有効化します。

AD変換の値を取得する関数を用意します。

uint16_t ADC2_SingleConversion(void)
{
    uint16_t data;
    LL_ADC_REG_StartConversion(ADC2);
    while(LL_ADC_IsActiveFlag_EOS(ADC2) == 0);
    LL_ADC_ClearFlag_EOS(ADC2);
    data = LL_ADC_REG_ReadConversionData12(ADC2);
    return data;
}

LL_ADC_REG_StartConversionはAD変換を開始させる関数です。

LL_ADC_IsActiveFlag_EOSはADC_ISRレジスタのEOSビットの値を確認する関数です。EOSビットは変換処理が完了したことを示すフラグです。ループで変換終了を待っています。

EOSビットはソフトウェアでクリアしなければ行けないのでLL_ADC_ClearFlag_EOS関数でクリアしています。

LL_ADC_REG_ReadConversionData12は12bitADCの値を取得する関数です。

動作確認

ADCの値が取得できるようになったのでAD変換を行って動作確認をします。

今回は電源を抵抗で分圧してAD変換してチェックします。

簡単に下のような回路を作ってテストしました。

回路

ブレットボードで配線をして変換させます。

ブレットボードで配線をして変換

AD変換の値と抵抗の分圧から計算して入力電圧(今回は3.3V)を取得してみました。

入力電圧(今回は3.3V)を取得

このように抵抗の誤差もあって3.3V弱になっていますがちゃんと電圧を取得できるようになりました。

ちなみにclockprescalerをdivided by 1でAD変換をすると値が3.96Vになりました。clockprescalerをdivided by 1でAD変換をすると値が3.96Vになりました

多分変換時間が足りないせいなんだろうと思います。

次回は複数チャンネルのAD変換を行います。

参考URL

STM32 + LL でADCのレギュラ変換を動かしてみる | Sora's Activity Record
STM32マイコンのペリフェラル関連記事を一覧にまとめました。 センサの入力でよく使用するA/D変換の使い方を書いていきたいと思います。今回は、LLAPIを使用してレギュラ変換の1...
タイトルとURLをコピーしました