https://tonarinoyj.jp/episode/13933686331708336402
なんんと、数日でワンパンマン更新来てた。早いな。
4日だ。その前が結構あいてたからかな。
Arduino Nano EveryのADC、こないだ調べたように、素の
ままでは、Mega328コア(Unoとか)と同様に、毎秒
9000回弱といったところだった。
で、こないだの消化項目(1)(2)を調べたいなと。
で、まずは(2)を調べるために、SFRの設定内容を
ダンプしたい。
調べた範囲では、どんなコード(タグ)を使ったら
ADC関係のSFRをいじれるのかがよくわからなかったので、
思いつく感じでコードをでっち上げてみて、うまく動く
方法を探しながらやってみた。
結果、こんなコードを書くと、ADC関係に設定された
SFRを読み出すことができたので載せておく。
(例によって、1行1行空いてしまうのはこのブログ
サービスの仕様なので、手修正で行を詰めて使って
ください)
void setup() {
Serial.begin(9600);
//int a = analogRead(A0);
}
// the loop function runs over and over again forever
void loop() {
Serial.print("CTRLA : ");
Serial.println(ADC0.CTRLA, BIN);
Serial.print("CTRLB : ");
Serial.println(ADC0.CTRLB, BIN);
Serial.print("CTRLC : ");
Serial.println(ADC0.CTRLC, BIN);
Serial.print("CTRLD : ");
Serial.println(ADC0.CTRLD, BIN);
Serial.print("CTRLE : ");
Serial.println(ADC0.CTRLE, BIN);
Serial.print("SAMPCTRL : ");
Serial.println(ADC0.SAMPCTRL, BIN);
Serial.print("MUXPOS : ");
Serial.println(ADC0.MUXPOS, BIN);
Serial.print("COMMAND : ");
Serial.println(ADC0.COMMAND, BIN);
Serial.print("EVCTRL : ");
Serial.println(ADC0.EVCTRL, BIN);
Serial.print("INTCTRL : ");
Serial.println(ADC0.INTCTRL, BIN);
Serial.print("INTFLAGS : ");
Serial.println(ADC0.INTFLAGS, BIN);
Serial.print("DBGCTRL : ");
Serial.println(ADC0.DBGCTRL, BIN);
Serial.print("TEMP : ");
Serial.println(ADC0.TEMP, BIN);
Serial.print("RES : ");
Serial.println(ADC0.RES, BIN);
Serial.print("WINLT : ");
Serial.println(ADC0.WINLT, BIN);
Serial.print("WINHT : ");
Serial.println(ADC0.WINHT, BIN);
Serial.print("CALIB : ");
Serial.println(ADC0.CALIB, BIN);
for(;;);
}
各タグについては、データシートの「29.ADC」のところに
にそれぞれ説明があるので、ご参照あれ。
http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega4808-4809-Data-Sheet-DS40002173A.pdf
で、こいつを実行して、シリアルモニタを開くと、
こんな風に出てくる。
(なお、setupにある最初の1回目の読み取りをコメント
アウトすると、初期化されていない状態のADC関係の
SFRをダンプできるので、比較してみるとちょっと面白い。
あと、サンプリング結果は8ビットを超えるので、RESに
どんなふうに入ってくるのかなぁ?と思ったら、ちゃんと
ここに10ビットデータで入っていた。これはなかなか)
さて、このシリアルモニタに表示された内容のうち、今回
一番大きな意味があるのは、「CTRLC」(コントロールC)
で、特にその下位3ビットはADCサンプリング速度にかかわる
「プリスケーラ」の設定。
設定値を見ると、「0b110」(=0x6)になっている。つまり
プリスケーラはデフォルトで128に設定されていることが
判った。
これは、Mega328と同じなので、16MHzで動かしてるUnoも
Nano Everyも、同じプリスケーラだから同じサンプル速度に
なるのは当然だったことが判った。
というわけで、(2)については判った。
なので、(1)の実験をやってみることにする。ADC関係
のSFRにアクセスする方法は判ったので、プリスケーラに
任意の値を設定して、ADCのサンプル速度を計測してみる
ことにする。
こんなコードをでっち上げた。ADCを1回行うごとに、D13
の出力をトグルするので、D13端子に出力される周波数
を計測して、2倍すればサンプル周波数が判るという次第。
ちなみに、プリスケーラの設定値と、サンプル周波数の関係
は、こんな具合。(あとで計算に必要な部分なので、簡単に
計算式を挙げておく)
16MHz ÷(プリスケーラ値)÷ 13 =(サンプル周波数)
(CPUのクロック16MHzをプリスケーラで分周したものが
ADCのベースクロックで、そのベースクロックの13回分
で、1回のADCが完了するので、こういう計算式)
プリスケーラを自由に設定できるようにしてあるので、
計算上Mega4809の最大精度(10ビット)でサンプリング
できる範囲で設定するとして、プリスケーラをひとまず
「16」(データシート上は)で設定してある。
(まぁ、個体によっては「8」に設定しても、10ビット
精度が丸々確保できるんじゃないかなぁって思うんだけどな。
プリスケーラ8ならば。あとこのくらいの設定値で影響が出る
のは、ADCの入力値がサンプルごとに0→1023→0→1023…
みたいに、最大振幅かつ最大周波数となるような矩形波を
入力するような極端な時だと思うので、通常の使い方であれば、
精度に影響が及ぶこともないんじゃないかな)
ってことで、まずはプリスケーラを16としてサンプル周波数
を計算してみたんだけど…
理論値上は、76.923kspsとなるはずなのに、実際に計測
してみた結果としては、58.62kspsになってしまった。
ちょっとだけ遅い…。
あれこれプリスケーラをいじって計測してみると、どうやら
1回のADC処理の間に、なんらかのオーバーヘッドが生じて
いるっぽいなぁ。
なので、理論値ほど高速にはサンプリング出来なさそう。
各プリスケーラの設定値ごとに、実測と理論値を求めて、
表にして、グラフ化したらこんな具合。
どうやら、理論値と実測値に大きく差異が生じるのは、
プリスケーラが16のあたりからみたい。
一体なにがこういうオーバーヘッドを生じさせている
のかは、コアコードが見つからなかったので、よく
判らなかったんだよな。何かが悪さしていることだけは
確かなんだけど。
(Mega328のコアなんかはすぐに見つかるんだけど、
Mega4809のコアって、どこに置いてあるんだろう?)
まぁひとまず、サンプル周波数が判って、1回のサンプル
時間も判った。
Arduino Uno(互換機)で作りかけだった、Arduinoオシロ
を、Mega4809の「Arduino Nano Every」の6KBのSRAM使って
先に進めるとして、最大精度でサンプリングをさせると
なると、プリスケーラを16に設定することになる。
…んだけど、そうすると最大のサンプリング頻度は、多少の
余裕値を見て、50kspsくらいになるんだろうな…。これだと、
アナログ帯域で考えたときに、せいぜい10kHzくらいが見える
感じだよな。
やっぱ、この2倍くらいは欲しいんだよな。100ksps程度
にするためには、プリスケーラは8にしたい。まぁ、8に
しても、最大精度までは届かなくても、9ビット精度くらい
にはなるだろうし、個体によっては多分最大精度が出る
くらいなので、あまり気にせず、プリスケーラを8に設定
しちゃうのがいいんじゃないかな、っていう気がしてる
ところ。
ただ、プリスケーラを8にしても、実は100kspsには
ギリギリ届かないんだよな。実測では97kspsなので、
実用上はせいぜい80kspsくらいが限界だろう。
アナログ帯域20kHzを眺めるには、ギリギリボーダーといった
感じ。(なお、プリスケーラ8の時の理論値は153.846ksps
なんだよな…なんか微妙に残念)
でもまぁ、とりあえず直近で知りたかったあたりの情報
が整理できた気がする。うん。
(Arduino内部で使ってる割込み関係を、必要最小限に
して、要らない部分を禁止してしまえば、もう少し
速度上げられるのかなぁ?)
あとは、TimerOneライブラリがNano Everyに対応して
ないので、タイマ割込み関係をどうするかを考えないと
いけないんだよな。
https://playground.arduino.cc/Code/Timer1/
https://kuruma-news.jp/post/294297
新しいフェアレディーZ。6速MTモデルがあるみたい。
Zへの思い入れは、無くはないし、FR(多分)でMTって
だけで、存在意義がすごいんだけど、Zを買って乗ろう
っていうのは、昔からキモチが沸かないところがあるん
だよな…。なぜかは解らないんだけど。
日産車だからかなぁ?
https://news.yahoo.co.jp/byline/mamoruichikawa/20200911-00197625/
この冬(北半球の夏)に、南半球でインフルエンザに
かかる人がびっくりするほど少なかったらしい。
まぁ、理由は解るよな。でも、この傾向が北半球の冬にも
当てはまってくれるのかはわからないところ。
https://twitter.com/wanpakuten/status/1304716057324601344
https://twitter.com/cooo55/status/1304740373709770752
https://twitter.com/MinaMaeda/status/1304137877752750080
何か変わったかといえば、むしろ何も変わらずに、
これまでの悪事を便所に流しておしまい…っていう
感じにしか見えないんだよなぁ。