STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版 (12) ADCを使ってみよう


STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版の続きです。
今回は、ADCです。
初めにDigiKey社のYoutubeと記事があるのでこちらをお勧めします。
https://www.digikey.com/en/maker/projects/getting-started-with-stm32-working-with-adc-and-dma/f5009db3a3ed4370acaf545a3370c30c

**投稿準備していたのですが、月刊トランジスタ技術2020年3月号にSTM32特集が組まれSTM32CubeIDEのプログラミングガイドブックもついていましたので、こちらを踏まえて修正しています。
(特集の話は昨年の夏ごろから聞いていただけにやっと・・・)

ADCとは

まずは、ADCとは何かです
今までSTM32においてスイッチなどの値を1か0として扱ってきました。
しかし、世の中にはアナログの値というものが存在します。
例えば、照度などです。
これらを電圧に変換し一定の分解能において、デジタルデータとして見える化します。
これがアナログデジタルコンバート ADCです

なお、分解能を上げることで細かい値を知る事も可能です。
今回は12bit 4096段階とします。

マイコンでは、アナログ⇒デジタル変換できるポートは限られています
仕様を見てみましょう。

STM32F401REの仕様から抜粋しました。

  1. FT = 5 V tolerant except when in analog mode or oscillator mode (for PC14, PC15, PH0 and PH1)

PC14, PC15, PH0、PH1以外は5V入力でも使えるようです
マイコンは3.3Vなので、5Vを入れても最大値の4096などになりますが、5V対応ならば、0~5Vまで計測可能です。

配線

今回は可変抵抗を使用します。
左右のピンを3.3vとGND、真ん中のピンをA0につなぎます。

前回の続きの場合は、こうなります。

Pinout&Configuration

それでは、設定しましょう。

まずは、ピンマップからPA0にADC1_IN0を設定します。
左のADC1 Mode and ConfigurationのIN0にチェックを入れても同じです、

これでコード生成をします。

コード追加

追加するのは以下です

float adcval;
uint8_t adcout[12];

adcvalとadcoutという二つの値を用意します。

HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
HAL_ADC_Stop(&hadc1);
adcval= HAL_ADC_GetValue(&hadc1);

最初にADCをスタートします。
ADCの変換をします。
*Timeの100は適宜変更しましょう。
そして、ADCをストップします。
*これも無くても良いと思います。
最後に、値を出力します。

sprintf((char*)adcout,"ADCVAL %u \n\r",
  (unsigned int)adcval);
printf(adcout);
HAL_Delay(500);

最後に、値をシリアル出力します。

この状態でコンパイルします。
すると、温度や湿度は変化しますが、ADCの値が変化しません。
これは、While分の中にADCを読み取る機能がないからです。
それでは、Whileの中に追加してみましょう。

すると、
無事変化しますね。

OLEDへ表示しよう

次はOLEDに表示させてみましょう。

/*ADC VAL*/
ssd1306_SetCursor(5,45);
ssd1306_WriteString(adcout,Font_11x18,Black);

これで完成です。

一定周期で温度湿度、ADCの値を表示するようになりましたね。