ラズピコ ADCで温度測定してみる

  • 2023.02.18
  • ADC
ラズピコ ADCで温度測定してみる

皆さん こんにちは。

今回は 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 の画面表示を貼っておきます。

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

お疲れさまでした。

ADCカテゴリの最新記事