1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ArduinoDueの計算速度と出力電圧について

Last updated at Posted at 2020-04-09

概要

digitalWrite

出力は2.8V
ON、OFFさせて、速度を見ます

void setup() {
  pinMode(7,OUTPUT);
}

void loop() {
  digitalWrite(7,HIGH);
  digitalWrite(7,LOW);

}

HIGH->LOW :2.2μs
LOW->HIGH+loopReturn : 4.2μs
よくて500kHzぐらいですね。ちょっと遅いかな
image.png

制御周期1msでロボットを作るならば、500回であふれる感じです。
長いとも短いとも言えます
https://garretlab.web.fc2.com/arduino/lab/performance_io/
ArduinoUNOと比較してそんなに変わらないですね。

analogRead(A0)

デフォルトでは0~1023
2.8Vで1023
1.4Vで500
0Vで0
という感じ

取得速度は

volatile float data;
void setup() {
  pinMode(7,OUTPUT);
  Serial.begin(250000);
}

void loop() {
  digitalWrite(7,HIGH);
  Serial.println(data);
  digitalWrite(7,LOW);
  digitalWrite(7,HIGH);
  for(int i=0;i<10000;i++){
    data = analogRead(A0);
  }
  digitalWrite(7,LOW);
}

image.png
10000回読み込みに50msかかるので、一回5μsぐらい
ここは、かなり速くてうれしい
追記:タイマー割り込み内で使用した際に、データが別の変数同士で入れ替わる現象が起こった。loop内に移動したら直った。割り込み内で使用する際、こういったバグが起こる可能性がある。

analogWrite(DAC0,data)

data=1023 : 2.35V
data=900 : 1.53V
data=500 : 2.25V
data=400 : 1.53V
data=300 :0.783V
data=244 : 2.28V
data=168 :1.701V
data=80 :1.062V
data=40 : 0.76V
data=20 :0.613V
data=1 :0.478V

image.png

0Vにはならないみたいです。
0~255で入力して、0.50V~2.34Vの範囲で変動するッぽいです。

analogWrite(7,data)

PWM出力を試します。
data = 200の時
image.png
1kHzでON,OFFしているッぽいです。周波数を上げる方法はレジスタをたたく以外見当たらなかったです。

data=255で完全にONになりました。この時2.8Vとなりました。

Serial

Arduino UNOと同様に扱える

void setup() {
  pinMode(DAC0,OUTPUT);
  pinMode(7,OUTPUT);
  Serial.begin(250000);
  pinMode(A0,INPUT);
  //digitalWrite(7,HIGH);
}

void loop() {
  
  int data = analogRead(A0);
  data=data/4;
  Serial.println(data);
  analogWrite(DAC0,data);
  analogWrite(7,data);

}

タイマー割り込み

(DueTimer)[https://www.arduinolibraries.info/libraries/due-timer]を使います。(参考)[https://lipoyang.hatenablog.com/entry/20161205/p1]

# include <DueTimer.h>

volatile boolean flag = true;
// タイマハンドラ
void Timer3_handler(void){
  if(flag == true){
    digitalWrite(7,HIGH);
    flag = false;
  }else{
    digitalWrite(7,LOW);
    flag = true;
  }
}

void setup()
{
  // タイマ割り込みの設定
  Timer3.attachInterrupt(Timer3_handler);
  Timer3.start(10000); // 10msec (10,000usec)
  pinMode(7,OUTPUT);
}
void loop(){
  
}

image.png

ちゃんと10ms周期でON、OFFできています。
Timer1~4の動作を試しましたが、なんかできてそうです。
10μsの速度で回ししながら、float,analogReadの処理を割り込みでさせたら、戻ってこなくなり、反応がなくなるので、うまくいかない時は「超多重割り込み」が起動していると疑うのもいいかもしれません。

計算速度

floatのかけ算


volatile float data;
void setup() {
  pinMode(7,OUTPUT);
  Serial.begin(250000);
}

void loop() {
  digitalWrite(7,HIGH);
  Serial.println(data);
  digitalWrite(7,LOW);
  digitalWrite(7,HIGH);
  for(int i=0;i<10000;i++){
    data = i*9.03245f;
  }
  digitalWrite(7,LOW);
}

10000回の掛け算で約18ms
一回の掛け算に1.8μsかかる。結構時間かかるなぁ
image.png

sin

volatile float data;
void setup() {
  pinMode(7,OUTPUT);
  Serial.begin(250000);
}

void loop() {
  digitalWrite(7,HIGH);
  Serial.println(data);
  digitalWrite(7,LOW);
  digitalWrite(7,HIGH);
  for(int i=0;i<10000;i++){
    data = sin(i);
  }
  digitalWrite(7,LOW);
}

523msかかる。
一回のsin計算には52μsかかるということになる。
同じ値なら、保存して使いまわしたほうがいいレベルの時間だと思う

割り算


volatile float data;
volatile float k = 2.1;
void setup() {
  pinMode(7,OUTPUT);
  Serial.begin(250000);
}

void loop() {
  digitalWrite(7,HIGH);
  Serial.println(data);
  digitalWrite(7,LOW);
  digitalWrite(7,HIGH);
  for(int i=0;i<10000;i++){
    data = 5.0/k;
  }
  digitalWrite(7,LOW);
}

image.png
10000回で29msなので、一回2.9μsぐらい

mbedと比較

https://os.mbed.com/users/hsgw/notebook/LPC1768_calcSpeed/
float演算に関しては倍程度の時間がかかる。倍程度なので、結構早いということかな?

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?