Arduino MKR WiFi 1010をデータ入力に使う⑥アナログ入力

 Arduinoの特徴に、A-D変換入力が最初からついていることです。UNOは10ビット、MKRシリーズで使われているCortex-Mシリーズでは12ビットのA-Dコンバータが内蔵されています。

環境

  • matlab home License R2021a update4
  • MATLAB Support Package for Arduino バージョン21.1.1
  • Windows 10 Pro 21H1 メモリ40Gバイト

Arduino MKR WiFi 1010のアナログ

  • CPU Cortex-M0 32ビット SAMD21
  • ピン数 7(A0~A6)、A0はアナログ出力DAC0(10ビット、350ksps)と兼用
  • 分解能 8/10/12ビット(350ksps)

●プログラム<その1>

 A4ポートには、実験用電圧源TL431の出力(約2.5V)を、A5ポートはGNDにつないでいます。


clear
a = arduino('COM15', 'MKR1010');
readVoltage(a,'A4')
readVoltage(a,'A5')

 A4の入力に、電圧発生器TR6142を使って0.1から1.1Vの電圧を入力し、測定値と比較しました。

 一見入力と測定値は比例しているように見えますが、0.6V以下は、誤差がそれなりにあります。

プログラム<その2>

 A4入力に、発振器(Agilent 33120A)の出力をつなぎます。1Hz、1Vp-p、+1Vp-pシフトした正弦波を入力しました。


clear
a = arduino('COM15', 'MKR1010');
counter = 1:1000;
voltage = (counter);
for t = counter
    voltage(t) = readVoltage(a,'A4');
end
plot(counter, voltage);
ylabel('電圧 [V]');
grid on;
xlabel("時間");
%voltage_LPF = lowpass(voltage, 10 ,100);
%hold on
%plot(counter, voltage_LPF);

hold off
fs = 130;
Y = fft(voltage);
L = length(voltage);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

f = fs*(0:(L/2))/L;
loglog(f, P1)
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')
grid on

 グラフです。ほぼ正弦波で取り込めています。FFTをかけると、高調波が少し観測されました。

  コメントアウトしているローパス・フィルタをかけます。いくらか見えていた高調波がなくなりました。

voltage_LPF = lowpass(voltage, 10 ,1000);

 正弦波を方形波に切り替えます。ほかの条件は変更していません。ローパス・フィルタは外します。

 奇数次の高調波が観測できます。

  FFTのプログラムは、サンプルでよく登場します。サンプリング周波数fsをいくつにすればよいのかがわかっていません。ここでは1Hzになるように130を設定していますが、プログラム自体は、もっと高い周波数でも計算します。

前へ

Arduino MKR WiFi 1010をデータ入力に使う⑤気圧センサLPS25HB <その2>グラフ

次へ

Arduino MKR WiFi 1010をデータ入力に使う⑦アナログ入力-温度センサLM35/MCP9700