Arduino初心者熱烈大歓迎質問スレ part33
■ このスレッドは過去ログ倉庫に格納されています
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 ) >>678 さんがやっているような実測をもって、この0.5LSBの補正がなされているかどうかの 検証をすることには、ほぼ意味がないと思う。それ以上のオフセットエラーがある。 それに入力電圧が0Vのときに変換値が0にならないようなオフセットエラーはハードでも ソフトでも補正が効かないので、素子自体は変換値0となる電圧範囲は広く取られることが 多いのでは。 >>696 DeepLをGoogle検索するぐらいはやったうえで、分からん、って言ってるのかな? >>698 最初の質問(>>585 )の結論を出すことが目的だとして 現状結論を出せていない 0.5LSBの補正が「有る・無し」が答えのカギとなると思う >>700 >結論:ADCからVinへのスケーリングは「1/1024」で計算しなけ > ればならない。 > 「1/1023」は間違いである。 これは、明白なことなので、ここでやっているような議論をする意味がない。 誤差のある現実世界のデバイスを実測してみても、あまり意味はない。 様々なエラーを含んだデバイスを、誤差のある測定を行って、仮に 「得られた結果は1LSBは1/1023に近いものだ」 となったとしても、1LSBが1/1024であることに変わりはない。 >>698 の主旨は、実験で判断してはいけない、ということなのは理解してもらってるだろか? こういうことはデータシートかメーカーの公式資料を引用して議論するか、 個人的に納得したいなら、メーカーか公式フォーラムに尋ねるのがいい。 実測で判断したいなら、誤差のないデバイスを持ってくるべき。(数を増やして平均してもだめだよ) UNO(atmega328)の場合 Vin = ( ADC + Offset Error ) * VREF / ( Resolution -1 + Gain Error ) ※Gain Error = 2LSB Typ , Offset Error = 2LSB Typ つまり Vin = ( ADC + 2 ) * VREF / 1025 これかもしれない・・・(;´・ω・) 詳しい人助けて( ;∀;) >>701 実機は理論通りには動かないってことだな。 >>701 のまとめに同意だな。 >>678 が測定してくれたVref5000mVの場合で説明すると、 近似直線は、Vin = 4.8776 * ADC + 7.4907 となっている。 傾きの理論値は 5000/1024=4.8828 なので、実際には少し小さな値で計算しないといけない ことが判る。そこで、コードは、 #define KA 0.998932 // 感度補正係数 #define KB 7.4907 // オフセット補正量 Vin = KA * ADC * 5.0 / 1024.0 + KB; // 電圧の計算式 (mV) と書くのが判り易くて良いと思う。 なお、式の中で定数になる部分はコンパイラがあらかじめ計算してくれるので、実際には何度も 計算が必要になる訳では無い。 あと、オフセットの話だけど、 片電源のオペアンプは入力電圧ゼロ付近に30mVくらいの不感帯、つまりオフセットがある。 それに比べるとATmaga328Pのアナログ回路は優秀だと思うよ。 正確な実測データがあるならそれ使って校正するのは測定器なら普通のことだしなぁ。個体のクセは実測データでしか補正できないし。まぁ、正確な実測データを得るのが難しいんだけど。 Vref=5Vのとき 1LSB=5/1024=0.0048828125[V] (Vrefー1LSB)が1023(0x3ff)になるのだから 5-0.0048828125=4.995117188[v]が0x3ff 最大値が3ffだから1023で割るのかな?と思っちゃった人は 「植木算」を思い出そうず(^p^) (1〜3ffじゃなくて)0起算だから1024段階、という単純なハナシかとおもいきや、 なんかみんなえらく難しそうなこと話してるなぁ・・・ 1bit DAC は、0Vと2.5Vを出すのだろうか? 0Vと5Vを出すのが自然ではないか。 デジタルとアナログの区別がつかないからDACが成立しないのでは? 1chステレオサウンドといってるようなもの >>710 だがしかしラダー抵抗で解説されているページが検索でヒットしたので ざっと拝読したところ三ビット出力111で4.375Vだそうですよん(5Vではなかった)。 http://mitt.la.coocan.jp/pic/pic7_16.html DACでもvrefがどの値に対応してるかによる。秋月で売ってるやつ何個か見てみたけど vrefと2^n(nはビット分解能) が対応。出力は2^n―1までってのが多かった。microchipとLTだけだから他のところのまではわからんけど。 >>710 どういう回路構成のD/Aを想定してる? 今、話題になっている逐次変換型A/Dの場合は、ラダーD/A+コンパレータの構成をとるものが 多いので、必然的に1LSBの電圧がどうなのかについてはラダーD/Aを前提に考えることになる。 ところが、1ビットD/AだとラダーD/Aにする意味がほぼない。 ラダーを1ビットにすると、単なる分圧になるので2.5V。 でも意味が乏しいからラダーにしないので1ビットなら0-5Vとなると思う。 10ビットA/DでVref/1023考えると精度が要らないから2ビット無視して 8ビットA/Dとして使うときVref/255になるのかVref*4/1023になのかと 考えると1023というのがおかしいことが分かる。 10ビットでVref/1024 8ビットでVref/256 となるのが自然な考え。 ◆Offset The deviation of the first transition (0x000 to 0x001) compared to the ideal transition (at 0.5 LSB). Ideal value: 0 LSB. 0>1に変化する理想の場所は0.5LSBの位置と有るのでこの説明だと量子化補正の有る理想ADCとの比較が前提となってる ◆Gain error: After adjusting for offset, the gain error is found as the deviation of the last transition (0x3FE to0x3FF) compared to the ideal transition (at 1.5 LSB below maximum). Ideal value: 0 LSB 1022>1023に変化する理想の位置は最大値(VREF)から-1.5LSBの位置と有るので量子化補正の有る理想ADCとの比較が前提となってる データシート読むとゲインエラーはオフセット補償をした後の値と有るので Arduino(UNO)はこれが正解じゃないだろうか・・・ Vin = ( ADC + Offset ) * Vref / ( 1024 + Offset + ( Offset - Gain error ) ) Vin = ( ADC + 2 ) * Vref / ( 1024 + 2 + 2 - 2 ) Vin = ( ADC + 2 ) * Vref / 1026 (※オフセット・ゲインエラーはデータシートの標準値を適応) 参考資料 ATmega48A/PA/88A/PA/168A/PA/328/P(Data Sheet) AVR120: Characterization and Calibration of the ADC on an AVR (APPLICATION NOTE) AVR127: Understanding ADC Parameters (APPLICATION NOTE) >>717 328PのデータシートのADCのエラーは、2LSBって書いてあったら、それは±2LSBだよ。(おそらく常識的に) あと、実回路ではA/D変換に入るまでの回路の誤差もついてくる。 Vref/1024は理屈での話にすぎない。(理屈の話において、Vref/1023は誤り) オフセットもゲインも実際のセットではリテラル値ではなく、ファームまたは ハードウェアで作られる変数にするわけだしね。 (ファームならEEPROM、ハードウェアなら半固定抵抗などですね) 入力電圧がいくらなのか、って話をするときに、理屈の話なのか、実際の電圧を知りたいんだ、なのかは 切り分けないといけない。 Vref/1023かVref/1024かは、結果的にはゲインエラーとして効いてくるけど、1024と1023とを取り違えた ところで、ここで発生する誤差は0.1%にすぎない。でもそのもとのVrefの誤差のほうがはるかにでかい(ことが多い)。 議論の中でVref=5Vがたびたび出てきたけれど、回路内で完結する何かの電圧が同じ5Vから分圧して得られている ケースをのぞけば、この5Vの誤差がそのままゲインエラーにつながる。 7805みたいなレギュレータで作った5Vなら、数%の誤差があるよね。 328Pには1.1V内蔵リファレンスもある。こっちは正確かなw >>713 3bit程度なら電流加算型にすればいいじゃん 出力の時に1024とか4096で計算すると振り切らない? 使わないボードを選択する一覧から消したいのですが、どこを消せばいいのでしょうか? promicro,promini5v,promini3.3v この3つを頻繁に切り替えるので他のやつを非表示にしたいです。 >>718 最初は自分もデータシートの誤差は±2LSBって意味だと思ってた でもデータシートでは数値は以下の様に明確に区別されてるので±ではないと思われる(たぶん・・・) https://i.imgur.com/SyzxuYu.png もう一つの理由としてオフセット誤差・ゲイン誤差の数値がMaxではなくTypとして表記されてる事もある ±2等の誤差で有ればTypではなくMaxの方に記載されてるもしくは(Min>-2LSB MAX +2LSB)の様な表記になるはず 以上の事から自分は±ではなく2LSBの誤差を標準値として考慮する必要があると判断した 議論の中心はanalogReadから入力電圧を求める正しい式は何か?だと思ってる 機種の話は直接的には出てないけどArduino UNO(atmega328)を前提に考えてる 個体差での誤差は考慮出来ないので標準的な誤差はデータシートのTypを元に補償する場合での正しい式を求めようとしてる ついでに混乱の原因としてAVRのデータシートでも2種類の計算式が記載されてる https://i.imgur.com/sWKwOtU.png https://i.imgur.com/GvoiOZ4.png (ATmega4809) UNO(ATmega328) -> 1024 Micro,Leonardo,(ATmega32U4) -> 1023 Nano Every(ATmega4809) ->1023 >>723 もし標準的に+2LSBになるようにデバイスを製造できるのなら、標準的に0LSBに合わせて製造すればいいのに なんでそうしなかったんでしょね。 >議論の中心はanalogReadから入力電圧を求める正しい式は何か?だと思ってる 現実の入力電圧を求めるのはハードウェアかソフトウェアの個別チューニングですよ。あくまで理屈の話でしかありません。 「Vref/1024で計算しているから」あるいは「データシートに書かれた標準誤差を含めた計算をしているから」という根拠で 「この装置は正しい入力電圧を得ている」と言えることなんてないです。 それより、>723で興味深いのは、1023と書いているデータシートです。 https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7766-8-bit-AVR-ATmega16U4-32U4_Datasheet.pdf これの310ページで、たしかにADC=VIN*1023/VREFとなっています。 でも差動チャンネル(10ビットを±9ビットで使う)だと511ではなくて、512なんですね。 一方で、307ページには、 An n-bit single-ended ADC converts a voltage linearly between GND and VREF in 2^n steps (LSBs). 「シングルエンドの10ビットのADコンバータは、GNDからVREFを1024ステップで直線的に変換する」とあります。 また、1023と書かれている310ページにも 0x000 represents analog ground, and 0x3FF represents the selected reference voltage minus one LSB. 変換値0は、アナロググランド、変換値1023は、[選択したリファレンス電圧]-[1LSBの電圧] となっています。記述に矛盾がありますので、どこかが間違っている可能性が高いと思います。 電池駆動のとき電源電圧が変動すると思うんですが、 例えば、4.8V-3.3Vに変動したとき、処理速度とかAD変換とか 何か弊害が出ることはありますか? >>725 16MHz動作は5V付近でしか保証されなかったような。 できるだけ変動しないようにすればいいんじゃないの? >>725 A/D変換のリファレンス電圧が電源電圧からとられたものだったら、その分狂うね。 ただし、たとえば電源電圧とGNDをサーミスタと抵抗で分圧して温度を測るような しくみだったら、実害は小さいだろうね。 >>722 ttps://programresource.net/2020/02/28/3015.html boards.txt を編集して、非表示にしたいボードに .hide=true を設定すればおk int raw = analogRead(A0); map(raw, 0, 1024, 0,5000); ってするとえわわわに届かない アドバイス求む Arduino Pro miniをピンヘッダーを設置と同時に「ヒューズビット」及び 「.hex」ファイルの書換えを行いました。 ユニバーサル基板に「Arduino Pro mini」「USB to TTL converter」「ICSP端子」「その他必要配線」を設置したので 動作確認の為、AVRライターでPro miniと通信しようとしたが、何故かエラーで通信できない? ◆試した事 ・デジタルマルチメーターでの導通test -> 問題無し ・ポリウレタン銅線を2度の取替 -> 改善せず ・配線ミスの確認 ・本体「Arduino Pri mini」は問題無く動作確認済 ●先人の方に何か見落とし等がありましたらアドバイス願います。 >>732 そりゃ〜最大ぬわふあまでなんだからそうなるでしょ お騒がせ致しました。 PCのUSB端子口を変えたら問題無く通信出来ました。 ∧_∧ / ̄ ̄ ̄ ̄ ̄ ( ´∀`)< オマエモナー ( ) \_____ | | | (__)_) わたい江戸っ子だんねん 生まれはかみたと申しますえ 「変ちきなジジイがおりましてさ、百二十畳敷きの紙に大達磨を描いてみたり、かと思えば米一粒に雀を二羽描いてみたり」 nanoにUSBコネクタに繋いで 5Vピンからも5V注入したら壊れる? >>741 Arduino nano は USB 付いてるだろ。 電池駆動だとどこから電源供給するのが良いの? VINだと6Vから12V 余分な電圧は熱になるが5Vは安定しそう 5Vから入力だと5Vピッタリじゃないとダメなので電池の電圧が瞬間的にちょっと下がっても無理そうだし 電池駆動だとnanoじゃなくpro-miniにするよな ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる