Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ADC 遅い #2

Closed
Nobutarou opened this issue Nov 21, 2023 · 3 comments
Closed

ADC 遅い #2

Nobutarou opened this issue Nov 21, 2023 · 3 comments

Comments

@Nobutarou
Copy link
Owner

https://rtmrw.parallel.jp/laboratory6/lab-report-157/lab-157.html
によると 16MHz/128 のクロックで動作し、analogRead() に 13クロックかかるから、1回のサイクルが 1e-4 sec となる。

分周比を 2まで下げられるので 1.63e-6 sec までサイクルを下げられる。そうすると 時定数 0.01 ~ 0.001sec でも静電容量の測定精度がまずまずいなりそう。分周比 1まで下げれられないかと思って、データシートも確認したが 2 だった。

こちらの例だと、分周比設定の ADCSRA を設定したら、普通に analogRead() している。ということは、analogRead() 自身はこのレジスタの操作をしてないということになるので、ソースで確認する。

https://forums.ni.com/t5/%E5%8C%97%E6%9D%B1%E5%8C%97-LabVIEW%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E4%BC%9A/%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%A0%E3%81%91%E9%AB%98%E9%80%9F%E3%81%ABArduino%E3%81%AE%E3%82%A2%E3%83%8A%E3%83%AD%E3%82%B0%E5%85%A5%E5%8A%9B%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E5%8F%8E%E9%8C%B2%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-%E7%A5%9D-quot-LabVIEW-Community/td-p/3980985

hardware/arduino/avr/cores/arduino/wiring_analog.c で ADCSRA が使われてるのはここだけで、これはレジスタの有無を調べてるだけで、内容の設定はしていない。なので、どっかで分周比を設定すれば、それが書き換えられることはないということになる。

#if defined(ADCSRA) && defined(ADCL)
	// start the conversion
	sbi(ADCSRA, ADSC);

	// ADSC is cleared when the conversion finishes
	while (bit_is_set(ADCSRA, ADSC));

	// we have to read ADCL first; doing so locks both ADCL
	// and ADCH until ADCH is read.  reading ADCL second would
	// cause the results of each conversion to be discarded,
	// as ADCL and ADCH would be locked when it completed.
	low  = ADCL;
	high = ADCH;
#else
	// we dont have an ADC, return 0
	low  = 0;
	high = 0;
#endif
@Nobutarou
Copy link
Owner Author

やってみたけど、まともに動く分周比は 4。なので 1サイクルが 1/(16MHz/4)*13=3.25e-6 sec。時定数は 1e-3 ~ 1e-2 sec くらいで大丈夫そうだ

  // No, they won't work.
  // ADCSRA = ADCSRA & 0b11111000;
  // ADCSRA = ADCSRA & 0b11111001;

  // it works. Thus, I can choose up to 16MHz/4.
  ADCSRA = ADCSRA & 0b11111010;

@Nobutarou
Copy link
Owner Author

10kΩでのテスト. やっぱり時定数 1e-3 までかなという感じ。1e-4 でも、大丈夫かな?くらいの判断はできそうかな、そんな感じ
0.1uF --> 0.1uF
0.01uF --> 0.011uF
22pF --> 0.0008 uF (8000pF)

@Nobutarou
Copy link
Owner Author

あれ、ADCSRA = ADCSRA & 0b11111010; これなんで & で良いんだ?
これ デフォルトがたまたま 111 だから良かっただけか。

https://forums.ni.com/t5/北東北-LabVIEWユーザー会/できるだけ高速にArduinoのアナログ入力でデータ収録する方法-祝-quot-LabVIEW-Community/td-p/3980985

でやってるように ADCSRA = ADCSRA & 0b11111000; で ADSP0, 1, 2 ビットをクリア。これが初期化。上位5 ビットは何も影響していない。その次に ADCSRA = ADCSRA | 0b11111010 で二段でやらないといけないな。

@Nobutarou Nobutarou mentioned this issue Jun 25, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant