STM32マイコンでアナログ入力
今回もNucleo Board STM32F303K8とArduino IDEの組み合わせでの使い方の学習です。今回はアナログ入力です。
使い方
普通のArduinoと同じようにanalogReadが使えます。A0ピンで読んでシリアルに数値を出力するプログラムはこんな感じになります。
void setup() {
pinMode(A0, INPUT);
Serial.begin(38400);
}
void loop() {
uint16_t val;
val = analogRead(A0);
Serial.println(val);
delay(20);
}
A0ピンに2Hz、3.3Vの正弦波を入れて、シリアルプロッタで見てみます。
特に問題なく読めました。分解能は10bit、0~1023まできれいに読めているようです。
複数同時に使う
A0とA1を同時に使ってみます。
void setup() {
pinMode(A0, INPUT);
pinMode(A1, INPUT);
Serial.begin(38400);
}
void loop() {
uint16_t val[2];
val[0] = analogRead(A0);
val[1] = analogRead(A1);
Serial.print(val[0]);
Serial.print(",");
Serial.println(val[1]);
delay(20);
}
ノコギリ波も入れてみました。直線性も問題なさそうです。
もう少し早いサンプリング周期で使う
ロボット工作などでセンサなどの電圧を読み込みたいときはもう少し信号を読みたくなるかもしれません。サンプリング周期を約1kHz、入力信号を50Hzの正弦波にして試してみます。
シリアル出力が間に合わないので、いったんバッファに保存して後でシリアル出力するというのを繰り返すプログラムです。
void loop() {
int i;
uint16_t buf[1024]; // アナログ入力結果を保存するバッファ
// アナログ入力を繰り返してバッファに保存
for (i = 0; i < 1024; i++) {
buf[i] = analogRead(A0);
digitalWrite(D13, !digitalRead(D13)); // D13を反転
delayMicroseconds(800); // 周期を調整。だいたい1kHzになる
}
// バッファのデータをシリアルで出力
for (i = 0; i < 1024; i++) {
Serial.println(buf[i]);
}
}
D13ピンの出力でアナログ入力の周期を確認。だいたい1kHzに調整できています。(High+Lowでループ2回分なのでこれで1kHzです。)
A0ピンに50Hz、3.3Vの正弦波を入れてシリアルプロッタで見た結果がこちら。きれいに読めています。
まとめ
アナログ入力が使えるようになりました。速さも直線性も簡単なロボット工作に使うには十分そうです。