Arduino初心者熱烈大歓迎質問スレ part33
■ このスレッドは過去ログ倉庫に格納されています
>>590 USBシリアルが有ればpyupdiと言う手もあるかな。 >>591 あいにくそれも持ってないんです。 自分で改造して作れる代物ではないですよね? 百均のケーブルなんかを改造.... とかできないですよね... 回路は合っているのかな。 俺は回路定数違っててはまったことがある >>592 秋月さんとこでUSBシリアル基板買えば百均ケーブル使って実装できるお >>593 あ!抵抗値がちょっと違いました! 4.7kのとこが5.1k?になってます。 これってやっぱり合わせるべきですか? >>585 あってる部分も有るけど間違ってる部分もあるね >>596 俺は合ってると思ったけど、どこが間違ってる? > ADC = (Vin / Vref) * 1024 ADC=((Vin / Vref) * 1024)-1 じゃねえの?よう知らんけど(はなほじ VinがVref-1LSBの電圧の時に1023になる。 まあ実際にはVinにVrefの電圧入れても1024は表現出来ないので、ADCの値は1023になる。でもそれは線形な範囲を越えてるということだと思う。 >>597 ゲイン誤差、オフセット誤差が無い逐次比較型ADCの出力を1023と1024で計算した場合の誤差は 最大値付近で約−0.5LSBか+0.5LSBの差だと思うのでどちらで計算しても変わらない 現実世界では実測するとオフセット誤差の影響で1023で計算した方が近い値になる >>600 まあそういう考え方もあるけど、プログラムの中で1023で割るのは抵抗がある。 やはりここは1024じゃないと気持ち悪いです。 1024にすべきかと /1024 ならコンパイラがシフト演算に置き換えてくれるはず(たぶん) ADC = Vin*1024/VREF ( Vin = ADC*VREF/1024 ) ADC = Vin*1023/VREF ( Vin = ADC*VREF/1023 ) どちらで計算するのかって話かと ADC = (Vin*1024/VREF)-0.5 (Vin = (ADC+0.5)*VREF/1024) ↑非線形性・オフセット誤差・ゲイン誤差が無いならこれが良いんじゃない? これってアナログリファレンスがデフォルトかインターナルなら1023で問題ないんだよね? エクスターナルの問題だよね? ADCは整数だから0.5足しても値は変わらないけど気持ちは判る。あと、1024で割るのに異存は無いってことだよね。 ちなみに、>>585 のリンク先はトラ技に記事書いてる人のブログだから、そこらへんの素人では無いよ >>607 ん、入れ違いになった。 インターナルだろうが何だろうが、10ビットのADCの量子化感度は1024で割って求めるてことだよ。 1023のとき測定電圧がVREFよりLSB一つ分小さいってデータシートに書いてあるんで常に1024にするのがメーカーの指示なんだろう 約0.1パーセントの誤差か ADCにも誤差はあるし ノイズは乗るし 気が付かないよね でもより正確なデータは必要だしやってみるかな なんか変だなと思う事は多々あったから ぐぐった LSB:Least Significant Bit, 最下位ビット≒量子化単位 ・・・初めから量子化単位って言ってくれた方が判りやすいんじゃアルマイカ; 0以上1量子化単位未満→0 1量子化単位以上2量子化単位未満→1 1023量子化単位以上1024量子化単位未満→1023 1024量子化単位以上→オーバーフロー→1023 それだけのことだろ。 0未満→0があるか。 VREF 5VでUNOのADCが1022を出力する電圧範囲 理論値 4.99023〜4.99511V 実測値 4.99003〜4.99535V (試験電圧約100uVで可変) Vin = ADC*VREF/1024 だと4.99023V Vin = ADC*VREF/1023 だと4.99511V Vin = (ADC+0.5)*VREF/1024だと4.99267V ※小数点一部切り捨て そりゃ10bitADなんやから2^10で割らにゃぁあかんでソ・・・ 最上位ビットは、参照電圧の半分以上かどうかだ。 第二位は、そのまた(残りの端数が)更に半分以上かどうかだ。 第三位は、そのまた(残りの端数が)更に半分以上かどうかだ。 ・・・ 第n位は、(上位桁を差し引いた)残りの端数が(1/2)^n 以上かどうかだ。 >>615 analogRead()の値から電圧を求めるとき 1023か1024の2択なら理論上1023の方が誤差が少ない analogReadで取得した数値に0.5足して1024で割るのが理想 例えば基準電圧5VのUNOに4.5000Vを入力する 理論上analogRead()は921を出力する(921 = 4.49707〜4.50195V) 921*5/1023 = 4.50147(誤差 0.00147) 921*5/1024 = 4.49707(誤差 −0.00293) (921+0.5)× 5 / 1024 = 4.49951(誤差 −0.00049) ※小数点第六位を四捨五入 おまけ http://codepad.org/Lmpcbid6 (誤差を乱数で計算) アマで買った中華のProMicro返品して 再注文したら今度はなかなか届かないぞコノヤロー 公式のサンプルが1023になってるから1023じゃないの >>621 入力が4.5Vの時にADCの値が921になる理屈が判んない。計算式らしきものが文字化けしてるし。 ちなみに、入力2.5VならADCの値は512(0x200)になるはずだけど、これはどう説明するの? なお、ADCの階段の位置を0.5LSBシフトする考え方は一理あるとは思う。 うーん・・・(´〜`;) >analogReadで取得した数値に0.5足して1024で割るのが理想 もしそうなら、analogReadの戻り値自体を、 AD化のしきい値をおのおの+0.5した値でADすればいいと思うし、 そうなっているんじゃないか(図のb)と期待したくなるんだががが・・・ ていうか0.000000001V入力時に1(=最小値0+LSB)が返るという解釈(図のa)なん? >>622 春節ってしってるかい? やつら何よりもこれ、優先するんだぜ。 つまりそういうことよ。 少ない解像度で考えりゃわかる。2bit4階調0−3出力とかで。 あと、数値じゃなくて範囲で考えるとわかりやすい。 m5stackだったかもしれないが データシートにADCの誤差のグラフがあった 多分このグラフに沿って補正すれば理論通り1023でいいんじゃないかな 2bitとかの低分解能A/Dコンバータで考えてみたらいいのでは。 5Vをリファレンスとして使うラダー型D/Aとコンパレータで逐次変換型A/Dを構成するとして、 D/Aに与える値と電圧の関係は、 0-0V 1-1.25V 2-2.5V 3-3.75V になる。 入力電圧と、D/Aの電圧を比較して超える一番低い値がA/D結果になる。 >>625 文字化けすまん (921 = 4.49707〜4.50195V) >>入力2.5VならADCの値は512(0x200)になるはずだけど、これはどう説明するの? 入力電圧により1023で計算した方が正解に近い時と1024で計算した方が正解に近い時が存在する 2.5000V入力時にADCが512を出力すれば1024で計算すると誤差が0になり正確とも言える しかし2.5000Vを入力した場合のADCは計算上512だけど以下を見てほしい 511 ( 2.495117 〜 2.500000 ) 512 ( 2.500000 〜 2.504882 ) 丁度境目なんだよね、つまり511と512の可能性が半々・・・・ 512*5/1023 = 2.502443 , 511*5/1023 = 2.497556 512*5/1024 = 2.500000 , 511*5/1024 = 2.495117 (512+0.5)×5/1024 = 2.502441 , (511+0.5)×5/1024 = 2.497558 1024で計算すると誤差が0になる可能性半分、誤差が最大になる可能性が半分 ADCの計算方法は最大誤差を少なくする事が重要だと思うのよ(;´・ω・) >>630 0も含めた1024だから 0から1023だから理論的には 5/1023が1デビになる >>632 ADCの変換特性を、階段のステップの先の延長線がゼロボルトになるイメージで考えてるみたいだけど、それではオフセットが発生する。 そこで、普通は階段の踏面の中央の延長線がゼロボルトになるように作られてる。(オフセット誤差ゼロなら) 先の例のADC結果が0x200となった場合で説明すると、この時のアナログの真値は2.5V±0.5LSBとなる。つまり1024で割って何ら問題無いよ。 >>634 0から1023(の1024種の結果が得られる。)だから理論的には 5/1023が1デビになる? この考え方だと1ビットのA/Dコンバータは、 0〜1だから理論的には 5V/1=5Vが1分解能ってことになるのかな? 1023説の人に聞きたいけど、一般的な、リファレンス5Vの電圧出力D/Aコンバータは、 デジタル値がNのときに Vout = 5V×N/256 それとも Vout = 5V×N/255 よく考えてみたら10bitの最下位を扱うスキルなんて無いやw >>638 1ビットのA/Dって早い話、HかLかなんだけど、 あなたの考え方だと、 2.3Vは0?それとも1? 2.7Vは0?それとも1? もし、分解能が5Vなら、0は何Vから何Vで、1は何Vから何Vなんだい? 1024説で、5Vリファレンスの1ビットのA/Dを説明するなら、 1分解能は、5÷2=2.5Vで、 0V〜2.5VでA/D変換結果は0 2.5V〜5VでA/D変換結果は1 ということになるよ。 区間の端を代表値にするから0かVrefのどっちかだけ現れて気持ち悪さが発生するのよな 5Vリファレンスの1ビットのD/Aとなると、0Vか5Vという認識になってもいいはず。 (1ビットでラダー抵抗を組むことはなさそうだし) A/D、D/Aを対称で考えるなら、やっぱり8ビットとかの多ビットで考えないと混乱を招くかもしれないな。 なんにしても、この問題って、1024説が正しいことはみんなわかっていて、 わからないふりをしている人に対して、納得できるように説明しようと試みる人を困らせてるんだよね? 説明する側も、ほどほどでいいのでは。 理想のD/A変換は、リファレンス電圧とD/A値から一つの電圧値が算出できるけれど、 理想のA/D変換においては、リファレンス電圧とA/D値をもとに算出できる元の電圧は 1分解能を持つ範囲だよ。 >>637 2ビットだともっと分かりやすいかな 4種類数えられる 0から3まで数えられる 33パーセント 33パーセント 33パーセント ゼロ 4種類あるが最初はゼロしか数えられない 数えられるのは3つしかない だから理論的には/3 /1024の人はADCでスケッチ書いたことあるの? 328Pのデータシートだと、 24.6.3 ADC Accuracy Definitions An n-bit single-ended ADC converts a voltage linearly between GND and VREF in 2n steps (LSBs). The lowestcode is read as 0, and the highest code is read as 2n-1. つまり10ビットのA/Dコンバータでは、 GND〜VREFを1024ステップで直線的に変換し、最小コードは0で最大コードは1023だ、となってるよ。 2ビットで/4だと0が25パーセントなのでゼロにはならないよ >0から3まで数えられる >33パーセント >33パーセント >33パーセント >ゼロ >4種類あるが最初はゼロしか数えられない >数えられるのは3つしかない >だから理論的には/3 理論の展開がおかしい。/3を前提にしているから、33%がでてきてる。 >4種類あるが最初はゼロしか数えられない 「最初」が変換値0を表すのだとしたら、だけど、理想の10ビットA/D変換器があるとして そこに現実的な信号をつないだら、マイナス値でも与えない限り、変換結果0は得られないですね。 >>647 理論的にはと前置きしています 現実的な話はしていません >2ビットで/4だと0が25パーセントなのでゼロにはならないよ 5Vリファレンスの正電圧入力の2ビットA/Dコンバータに 0V以上の電圧を与えたとき、変換結果として0が得られたら、 入力値は0V〜1.25Vなのだといえるよ。 A/D変換結果が0のときに、入力が0Vだと言うのはそもそもおかしい。 正確には範囲で表現するべきこと。 >>648 >理論的にはと前置きしています いやー。理論になってない、ってことを↓と書いてるんだけど。 >理論の展開がおかしい。/3を前提にしているから、33%がでてきてる。 そもそも、なんで4段階のうちのひとつだけを不平等にして考えるんだろう。 >33パーセント >33パーセント >33パーセント >ゼロ ID:LrHT+Scpさんの考え方は、>>645 の英語部分に照らして整合性はあるのかな? 整数(int)にアナログ(5V)的な整合性を追及してもキモイことになるだけ 10ビットでアナログ的な辻褄合わせしたいなら float/double使って1023でオペレーションするべきかな どうせ量子化ノイズが-60デシベル程度あるんだし 気にしない気にしない 1ビットに話を戻します 0はゼロ 0の範囲は0から4.9V 1の範囲は5V 量子化の段階でこうなると思います 1は5Vに達しないと1になりません 確かに0だからといって0Vとは限らないのは分かりました 正確さを帰すなら/1ではないでしょうか? /2で2.5Vで1とするのは精度的に問題ではないですか? アナログだからわざと曖昧にするために/2である必要があるのでしょうか >>656 そこまで突っ込む必要があるのでしょうか 桁数が変わるだけで5.00000000000Vで1に達する事には変わりありません >>654 > 1ビットに話を戻します > 0はゼロ > 0の範囲は0から4.9V > 1の範囲は5V ネタだよな。その仮定だと1の範囲は5以上10未満になるけど10はどっから出てきた? >>654 4.9Vを超えて5V未満のときはどうなるんだってばよ?? >>660 量子化なのに0と1で量子単位が違うの? >>663 私はど素人のズブの初心者なので 私の言ってる事が正しいかどうか分かりません どなたかズバっと答えていただけませんか 1ビットは2値。その2値が等しい電圧範囲を持つなら、5Vリファレンスなら A/D変換値0は0〜2.5V。1は2.5V〜5.0Vですよ。 >/2で2.5Vで1とするのは精度的に問題ではないですか? 上記の電圧範囲であることの、どこに精度の問題があるのでしょうか。 ID:LrHT+Scpさん 「逐次変換A/Dコンバータ」の仕組みはわかりますか? >1023説の人に聞きたいけど、一般的な、リファレンス5Vの電圧出力D/Aコンバータは、 >デジタル値がNのときに >Vout = 5V×N/256 >それとも >Vout = 5V×N/255 ↑これについては、どう考えますか? いくつかの8ビットD/Aコンバータのデータシートを見た上で考えてほしいです。 >>652 でも書きましたが、328Pのデータシートに書かれていることと、あなたの説の整合性は 取れていますか? >どなたかズバっと答えていただけませんか 2ビットなら4段階なのでVref/4ですよ。 >>636 >>ADC結果が0x200...の真値は2.5V±0.5LSB これは間違いだと思う>632でも書いたがx200(512)を出力する電圧範囲は2.500000〜 2.504882 Vin = ADC * VREF / 1024 で計算してしまうと最大0.004882(1LSB)の誤差が生じる可能性がある >>665 2bit だと 0〜1.25Vで0 1.25〜2.5Vで1 2.5〜3.75Vで2 3.75V〜5Vで3 なので、 変換値x1.25+0.625 ± 0.625 ですかね。 でも、電圧に変換して表示したときに 最低が0Vでなくて0.625Vってのは気持ち悪い。 気持ち悪いかどうかで、A/Dコンバータの性質を決めちゃだめです。 ググってグラフを見てきたらなんとなく分かってきた 文字だけ見てると分からない 実験して実際に波形を見てみる みなさんありがとう ADCの精度に夢見過ぎな奴多いな 例えば10bitADCならよい製品でも諸々込みで±2LSBくらいの変換誤差は有る前提で考えないと、安物だともっと悪化する 実はVrefの精度も検討してなかったりして >>670 元のURL http://ww1.microchip.com/downloads/en/appnotes/atmel-8456-8-and-32-bit-avr-microcontrollers-avr127-understanding-adc-parameters_application-note.pdf これを見て昨日のID:MSkrqMQwを修正します。 Figure 2-8. Perfect ADC in Single-ended Mode (Adjusted Quantization) だと、実際の値に合わせるために、0.5LSBずらしています。 これを2ビットのADCにあてはめると (面倒なのでリファレンス4Vにします) 変換値0:0〜0.5V 変換値0:0.5〜1.5V 変換値0:1.5〜2.5V 変換値0:2.5〜4V こういうふうに作られているADCもある、ですかね。 https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061B.pdf Figure 24-13を見ると、変換値0の部分はアナログ値の範囲が半分になっています。 アナログデバイセズのAD7813だと、この0.5LSBの補正は意図していないように見えます。 https://www.analog.com/media/en/technical-documentation/data-sheets/AD7813.pdf Figure 7. Transfer Characteristic A/Dコンバータによってこのあたりの考え方は違うのでしょう。 実際の回路では、オフセットエラーを含め、電源レールに近いところは、ADCをドライブする回路も含めて直線性も 悪くなるので、ここの0.5LSBがどうなっているのか突き詰めても益は少ないと思います。 いずれにしても、分解能は Vref/1024 ですけど。 >>674 >これを2ビットのADCにあてはめると >(面倒なのでリファレンス4Vにします) >変換値0:0〜0.5V >変換値0:0.5〜1.5V >変換値0:1.5〜2.5V >変換値0:2.5〜4V >こういうふうに作られているADCもある、ですかね。 ねーよ 元の資料をどう解釈したらそんなことになるんだ >>674 話が本質に近付いて来たね。ADCのオフセットをどう捉えるかがポイントだと思う。 元のURLとしてリンク貼ってくれた資料で説明すると、 https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061B.pdf の Fig24-10 Offset error がそのオフセットに該当すると思うんだけど、 その値はTable 29-15. の Offset error で規定されていて、 スペックでは 2LSB Typ. となっている。(1LSB Typ.となっている資料もある) つまり。0.5LSBとか言ってる場合じゃないくらい大きなオフセットが現実にはある。 .たぶんこれは前段のアナログ回路も含んだ値だろうから、ADC自体のオフセットでは無さそうだけど これくらいのオフセットは覚悟しなさいと言うことなんだろう。 そんなことで、正確な入力電圧を推定するためにはゲインとオフセットの補正は必須と言うことだね。 話を戻すと、ADCの感度は Vref/1024で計算すればOK。 これを1023とか言ってる人は、ゲインとオフセットの区別が付いていない人。まあよくいるんだけどね。 >>675 おめえ文句ばっかり垂れてねえで説明しろやクソが UNO(ATMEGA328)のADCを実測してみました VREF 5000mV 1 > 11.25~16.12 2 > 16.12~21.01 3 > 21.01~25.97 2020 > 4980.16~4985.02 2021 > 4985.02~4990.01 2022 > 4990.01~4995.02 VREF 2000mV 1 > 4.14~6.09 2 > 6.09~8.03 3 > 8.03~10.07 2020 > 1991.15~1993.12 2021 > 1993.12~1995.10 2022 > 1995.10~1997.19 難しいことは良くわからないのだけど 328Pのデータシートに書いてある10bitADCの説明だとADC=Vin×1024/Vrefなんで、 誤差とか無視した理想電圧でvinMAX=Vref=5Vってすると、5Vを1024で割った値に VinとVrefの比率を掛けた値がADCに出てきますってことだよね で、ADC=1024は10bitじゃ表せないので、ADCに実際に上がってくる値の最大は1023 この値は5V-5V/1024から5V以上の間を表すってことなので、ADCの値1に付き何Vかを 計算するのは5/1024で、値が0なら0から4,88mV、値が1なら4.89mvから9.77mV・・・ 値が1023ならば4.99512V以上ってコードで作りこむことになるんだよねぇ? >>678 すごい助かる ありがとう つまり0は0Vではなく他と同じように幅があるから/1024ですね 0〜100を0〜1024に変換するにはどうすればいい? 市販の測定器とかは厳密な数値が出ると思うんだけど arduinoとかとはなんか違うの? >>682 変換後(0-1024) = 変換元(0-100) × ( 1024 / 100 ) 出力には小数点が含まれるので整数に直すには四捨五入するのが理想 >>681 ゼロの幅だけ広くない? 他の2倍くらいあるよね。 >>686 確かに広いですね 厳密な測定は補正が必要なのでしょう とりあえず私は1024でざっくり行く事にしました よほどの時間がないと全部の補正なんてできないし そうかだから+0.5なんだね オフセット誤差補正で >>689 それは表示数値を下限値じゃなくてレンジの中間値で見せてるだけ。オ UNO(atmega328)のanalogRead値から電圧を求めるとして atmega328の内部で量子化補正が「有り・無し」場合 【量子化補正有り】 Vin = ADC * VREF / 1024 (誤差 小) Vin = ADC * VREF / 1023 (誤差 大) Vin = (ADC+0.5) * VREF / 1024 (誤差 中) 【量子化未補正】 Vin = ADC * VREF / 1024 (誤差 大) Vin = ADC * VREF / 1023 (誤差 中) Vin = (ADC+0.5) * VREF / 1024 (誤差 小) 実測値をみてると量子化未補正に思えるけど、データシート見てもその項目が発見できてない(俺の馬鹿!) PICとかのデータシートはわかりやすいのに・・・( https://i.imgur.com/JOZ6gsx.png ) ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる