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段階とします。
マイコンでは、アナログ⇒デジタル変換できるポートは限られています
仕様を見てみましょう。
- 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の値を表示するようになりましたね。