こんにちは、ショウです。
前回は割り込みを設定しました。
今回はAD変換を使えるようにします。AD変換はバッテリーの電圧のチェックや、壁センサの値の取得に使います。
とりあえず今回は1チャンネルのAD変換をするように作成します。
CubeMX
ADCのシングル変換
今回はPA0ピンをAD変換に使います。
PA0をクリックしてADC2_IN1を使います。CategoriesのADC2をクリックしてModeの中のIN1の機能としてSingle-endedを選択します。
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)
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弱になっていますがちゃんと電圧を取得できるようになりました。
ちなみにclockprescalerをdivided by 1でAD変換をすると値が3.96Vになりました。
多分変換時間が足りないせいなんだろうと思います。
次回は複数チャンネルのAD変換を行います。
参考URL
