別の素子でADCを試してみよう

前回の内蔵温度センサは変化に乏しいため、あまり見た目が面白くありませんでした。そこで、今回は外部からアナログ入力してADコンバータの変化を楽しんでみましょう。

一番簡単にできそうなのが可変抵抗器(いわゆるボリューム)ですので、これをつないで試してみましょう。

準備するもの

まずはハードウェアから押さえておきましょう。前回から追加で必要なものを列挙します。

  • 可変抵抗器(50KΩ)
  • クリップ付きジャンパー線(3本)
可変抵抗器とクリップ

可変抵抗器は極端なものでなければ何Ωでもいいと思いますが、たまたま手元にあった50KΩのものを使用しました。あと、接続のためにクリップ付きのジャンパー線を用意しました。可変抵抗器をクリップで接続してNucleoのコネクタに挿して使用します。

可変抵抗器は3端子になっており、両側の端子を3.3VとGNDに接続し、真ん中をアナログインプットのPA0に接続します。回路図としてはこんな感じになります。

回路図1

可変抵抗器のつまみを回すと抵抗値が変化し、3.3Vが分圧されPA0の電圧が変化します。

可変抵抗器を接続する

可変抵抗器の各端子をクリップでつまんで、NucleoのCN7の16番ピン(+3V3)、20番ピン(GND)、28番ピン(PA0)に接続しました。ポイントは可変抵抗器の抵抗値の変化する端子をPA0に接続することです。

可変抵抗器接続

これでハードウェアの準備はOKです。次はソフトウェアの作業に移ります。

STM32CubeIDEでADCを設定する

STM32CubeIDEを起動して、ペリフェラルの設定を行います。左のツリーから「adc.ioc」をダブルクリックします。

Device Configuration Toolが開きますので、ADC1をクリックしIN1の設定を「IN1 Single-ended」に変更します。

ADCの設定1

次は下側の設定を行います。IN1を有効にすることで「Rank 2」の設定が追加されています。ADコンバータはRankの順番に変換が行われるようになっていますので、変換数を「Number Of Conversion」で2に設定します。次にRank 2の設定では「Channel」と「Sampling Time」をそれぞれ「Channel 1」と「601.5 Cycles」に変更します。

ADCの設定2

この設定を保存すればコードジェネレーターで、新たな設定が現在のソースコードに追加されます。

ADCチャネル1の初期設定コード

この状態は初期設定が行われただけですので、実際にADCの値を読み出す処理を追加する必要があります。マルチチャネルの読み出しはシーケンシャルに行われますので、同じコードを繰り返せばOKです。変数としては新たに「gu_ain0」を宣言して、ここにPA0からの値が代入されるようにします。

ADCチャネル1の読み出しコード

ビルドを行い、PALMiCE4のリアルタイムモニタで確認しましょう。

リアルタイムモニタで確認する

それでは、前回と同様にPALMiCE4を起動してリアルタイムモニタを登録します。起動に関しては前回の手順を参考にしてください。プロジェクトファイルに保存していればそれで起動します。

リアルタイムモニタのウィンドウから、追加ボタンを押して新たに「gu_ain0」を登録します。設定は以下のように行いました。グラフNoの設定で、別のグラフを開いて表示することもできますが、温度センサと一つのスケールで比較するために「メイン・グラフ」を選択しています。

RTM設定

それではプログラムを実行してみましょう。グラフの縦軸は0~4095までなのでそのぐらいで収まるようにCTRL+マウスホイールをぐりぐり回して拡大しています。

上の青い線が内蔵温度センサで、下の赤い線が今回追加したアナログ入力です。可変抵抗器の値に従ってそれなりの値が表示されています。これで可変抵抗器を回せば変化するはずです。

RTMの表示1

うわわっ、なんじゃこれはっ!

RTMの表示2

何かヤバイものが表示された感じがしますが、これは可変抵抗器が変化するときに抵抗値が定まらない状態なのだと思われます。可変抵抗器は接点が回る仕組みなので接触面の抵抗値にばらつきが出てノイズになるのでしょう。古いパーツだったので経年劣化も考えられますが、もっと高価な可変抵抗器なら滑らかな変化が出るかもしれません。

何はともあれ、抵抗値がこういう変化をしているということが、リアルタイムモニタで見える化することで明らかになりました。

これで終わってもいいのですがもう一つ試したいことがあります。ADCをマルチチャネルにする場合、ポーリングして読み出しを繰り返しますので、チャネル数が多くなると効率が落ちます。そこでADCの値をDMAで転送する方法を使用します。ということで、次回はアナログ入力をもう一つ増やしてDMA転送を行ってみます。