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。

前へ

CO2センサを使う⑪7セグメントLEDに表示

次へ

ANALOG OUTPUT ① MKR WiFi 1010で波形生成<その2>