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

#概要


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

```C
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/c98b6438-5b9c-60bb-a96e-adcd5e417aab.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
という感じ

取得速度は

```C
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/665f77ed-45d6-34e5-7c4f-1a8317b24cdd.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/21ecbf3c-6f58-dea2-47b4-774ce04010ab.png)

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

#analogWrite(7,data)
PWM出力を試します。
data = 200の時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/b09dbec9-0ddc-b9a5-3870-c0ca7630b9ca.png)
1kHzでON,OFFしているッぽいです。周波数を上げる方法はレジスタをたたく以外見当たらなかったです。

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

#Serial
Arduino UNOと同様に扱える

```C
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]

```C
#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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/03818ada-2768-9b40-a641-c9cea2e47734.png)

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

#計算速度
###floatのかけ算

```C

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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/19faf3a4-88ee-9ecf-7f3b-f76a60615bb6.png)

##sin

```C
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かかるということになる。
同じ値なら、保存して使いまわしたほうがいいレベルの時間だと思う

###割り算

```C

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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/b56b3961-b2f1-f457-aca4-f2136dea4f24.png)
10000回で29msなので、一回2.9μsぐらい


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