1. はじめに
HAL関数のバージョンが変わっていて,引っかかったので備忘録とする。
2. HALを使ったADCについて
STM32マイコンのADC実装は他記事が豊富にあるので割愛するが,簡単に説明すると
① CubeIDE内のCubeMXでADC設定
② コードで以下のような関数を呼んでスタート
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);
③ 変換を待って値を読むなり,DMAの値を読んでADC値を取得
といった流れである。
3. そもそもADCキャリブレーションとは
簡単に言えばアナログを正確に取得するための下準備である。
正確には,一度"0V"と"VCC"をADCに入力し,それぞれの変換値を取得,ADCの特性が0~VCC対0~4095(12bitの場合)で線形になるように取得値から補正をかける,といったものである。
キャリブレーションを実行せずともADCは動作するが,取得したADC値にズレが生じる可能性が高い。
特に理由がない場合は実行することおすすめする。
4. ADCキャリブレーション関数
以下の関数を呼び出すだけである。
なお,HAL_ADC_Start()系の関数実行前,またはHAL_ADC_Stop()実行後に行う事。
HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef* hadc, uint32_t SingleDiff);
ここで本記事を書く理由となった過去の関数を記載する。
HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef* hadc);
新しいバージョンのHAL関数では"uint32_t SingleDiff"という引数が追加されている。
この引数は,ADCの設定が「シングルエンドモード」「差動モード」どちらであるかを記述する必要がある。
引数はヘッダファイル内で定義されており以下である。
#define ADC_SINGLE_ENDED (0x00000000U)
#define ADC_DIFFERENTIAL_ENDED (0x00000001U)
つまり,実際にコードとして書く場合は
// ADCユニット1 シングルエンドモードの場合
HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
のようになる。
5. おわりに
I2C通信でカラーセンサから色を取得しているが,ずれが発生する事象が発生した。
マイコンへ電源供給をしているNucleoボード上のLDOをカラーセンサの電源としているので,ここの電圧が変化している可能性があった。
V_REFINTを利用したVDD測定を実施しようとしたところで今回の問題で躓いた。
大ハマりにはならなかったが,もしハマっている人の役に立ったら幸い。