ANALOG OUTPUT ① MKR WiFi 1010で波形生成<その1>
Arduino UNOのアナログ出力はPWMです。PWMのデューティ比を変化させて、疑似的に出力電圧を変化させます。
Cortex-M0などのマイコンを利用した場合、D-Aコンバータが内蔵されている場合があり、10もしくは12ビットのD-Aコンバータで、直流電圧を出力できます。
MKR WiFi 1010は、SAMD21(Cortex-M0+)マイコンを搭載していて、D-Aコンバータのスペックは次のとおりです。
10ビット、350ksps
アナログ出力のDAC0はアナログ入力A0端子と兼用です。Arduino IDEではA0で端子名を指定します。
●スケッチ
徐々にA0端子の電圧を上げていき、最大値に達したら0に戻すというプログラムを作ります。のこぎり波になります。
const int analogOutPin = A0; // Analog output pin
int outputValue = 0; // value output (analog out)
void setup() {
Serial.begin(115200);
analogWriteResolution(10);
}
void loop() {
for (outputValue = 0; outputValue <1024; outputValue = outputValue+1){
analogWrite(analogOutPin, outputValue);
}
}
実行結果です。
ON/OFFを繰り返すと方形波になります。
const int analogOutPin = A0; // Analog output pin
int outputValue = 0; // value output (analog out)
void setup() {
Serial.begin(115200);
analogWriteResolution(10);
}
void loop() {
analogWrite(analogOutPin, 1023);
analogWrite(analogOutPin, 0);
}
実行結果です。
電圧を低く(1/10)してみました。波形の立ち上がりがきれいです。
sin波を作ります。
#define radPi 0.0174527 // 3.1415/180
const int analogOutPin = A0; // Analog output pin
int outputValue = 0; // value output (analog out)
void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(115200);
analogWriteResolution(10);
}
void loop() {
for( outputValue = 0; outputValue <360; outputValue++){
float outputValueR = outputValue * radPi;
analogWrite(analogOutPin, (sin(outputValueR) + 1) *511);
}
}
実行結果です。sinの計算時間にばらつきがあるようです。
D-Aコンバータでいくつかの波形を発生しましたが、ゆっくりな変化ならば対応ができます。高い周波数の波形が必要な場合は、専用のICを利用すべきでしょう。
●測定器
Pico Technology PicoScope 5242B、Ver7 beta。