皆さん こんにちは。
今回は ADC を使ってみます。
ADCとは
アナログ・ディジタル・コンバーターの略です。
文字通りアナログの電圧をディジタルに変換する機能です。
ここでは ADC と略して呼ぶことにします。
温度測定
ラズピコのマイコン RP2040 には電圧出力の温度センサーが内蔵されていてADCにつながっています。
ADCには5つの入力があり、ain_sel = 4 で温度センサーの電圧を計測することができるようになっています。

プロジェクトの作成
以下の設定でプロジェクトを作成します。
Project Name: picoAdc
Console Options の Console over UART をチェックする
IDE Options の Create VSCode project をチェックする
Debugger: は PicoProbe を選択する

VSCodeを起動する
起動後、何かファイルが開いてたら File – Close Folder で閉じた後、File – Open Folder から picoAdc のフォルダーを辿って選択します。
こちらの環境では C:\Users\m3925\Documents\Pico\pico-project-generator\picoAdc です。
m3925の部分は皆さんのユーザー名に置き換えてください。
vscode関連の json ファイルは前回作成済のプロジェクトのものをドラッグ&ドロップでコピー&ペーストすると楽です。
ソースコードを書く
picoAdc.c を以下の通りに編集します。
#include <stdio.h>
#include "hardware/adc.h"
#include "hardware/gpio.h"
#include "pico/stdlib.h"
int main() {
stdio_init_all();
printf("ADC Example, measuring temprature\n");
adc_init();
adc_set_temp_sensor_enabled(true);
adc_select_input(4);
while (1) {
// 12-bit conversion, assume max value == ADC_VREF == 3.3 V
const float conversion_factor = 3.3f / 4095;
uint16_t result = adc_read();
float v = result * conversion_factor;
float temprature = 27 - (v - 0.706) / 0.001721;
printf("V=%f, temprature=%f\r\n", v, temprature);
sleep_ms(1000);
}
}
PC側の準備
WDTの動作確認用として Tera Term を使います。
API関数がうまく動作したか否かなどの結果をUARTのputs()やprintf()でログ出力するようにしてみました。
Tera Termをお持ちでない方は こちら からダウンロードしてお使いください。
インストール後、 Tera Term を起動し、シリアルポートでPicoprobeのCOMポートを選択します。
もしCOMポートが複数ある場合には、Picoprobe以外の通信ケーブルをはずしてデバイスマネージャーでCOMポート番号を確認しておきます。

起動後、設定メニューのシリアルポートから以下の設定を行います。
スピート : 115200
データ : 8 bit
パリティ : なし
ストップビット : 1
フロー制御 : none
(設定値からスピードだけ変更すれば良いはずです)
今回使ったADCのAPI
adc_init()
ADCを初期化します。
adc_set_temp_sensor_enabled()
温度センサーを有効にします。
第1引数: true で有効、false で無効にします。
adc_select_input()
入力チャンネル(0-4)を選択します。
4 を選択することで温度を測定します。
第1引数: 入力チャンネルを指定します。
adc_read()
ADC 変換を実行し、結果を待ってから値を返します。
コードの説明
adc_init()でADCを初期化し、adc_set_temp_sensor_enabled(true)で温度センサーを有効化します。
それから adc_select_input(4)で温度センサーのチャンネルを選択します。
12ビット分解能のADCなので 3.3f / 4095 で1ビットあたりの電圧を求めておきます。
そして adc_read() した値とかけ合わせれば電圧が測定できます。
RP2040のデータシートより 温度は以下の式から求めることができます。
float temprature = 27 - (v - 0.706) / 0.001721;
動作させてみる
それでは F5キーを押してプログラムを動作させてみます。
1秒毎にを繰り返します。
実行後の Tera Term の画面表示を貼っておきます。

いかがでしたか?
皆さんはうまく温度測定できましたか?
お疲れさまでした。