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を設定していますが、プログラム自体は、もっと高い周波数でも計算します。