SSブログ

ATmarquinoでMhysicalna(身近な)コンピューティング 解決編なのか? [ATmarquino Arduino]

arduino_002.png7セグメントLEDで簡易的に温度計を作る目的であったのに、、、。

前回まででAD値が期待通りにならなかった点が解決できませんでした。AVR自身に例えばデバイスのエラーとかが無ければ、やはり使い方に問題がある訳です。
一番問題になりそうなのがロジック側のノイズです。ですからダイナミックスキャンを停止してみました。

この時、LM35DZの出力は約237mVを示しています。それに対してAVRのシリアルの出力でvalueの項目は235(mV)となりました。
うん、これ位の誤差なら十分納得行きますね。やった!低く出る原因はロジック側のノイズに拠るものであると。
これで一件落着という事で、、、で・す・が。

それはLCDを使えばダイナミックスキャンによるノイズは回避できますけれど、高輝度、高コントラスト、広い視野角のLCDを使わないとちょっと離れた所から視認しずらいので、そう言った目的にはやはりLEDは捨て難いものがある。安いですしね。

※そもそもAVRの売りの一つに各端子が直接LEDをドライブできる容量を持っているし、パッケージ合計でも100mAとか150mAとか可能と言う事なので、ならAVRから直接LEDチカチカしてしまうでしょう。これがH8の様に特定のポート以外sinkもsourceも容量が小さければ、別途ドライバーICを用意しますから。
またロジック側を停止してアナログしか使わないと言う事はあまり無いでしょう。
こうなるとONE CHIPマイコンでのADコンバーターの使い方の難しさが出てきます。

例えばフリースケールのONE CHIPマイコンであったり、確かT.I.のマイコンであったり、これらのマニュアルにはAD変換中はできるだけCPUコアを止める事が推奨されています。
つまりAD変換を開始直後にCPUコアをスリープに入れて、AD変換の完了割り込みでCPUコアがスリープから解除される手順です。

ええっと困りましたね。Arduino環境上ではCPUコアを止めるのはどうするんでしょうか?。

HCS08 Unleashed: Designer's Guide to the HCS08 Microcontrollers

HCS08 Unleashed: Designer's Guide to the HCS08 Microcontrollers

  • 作者: Fabio Pereira
  • 出版社/メーカー: Booksurge Llc
  • 発売日: 2007/11/13
  • メディア: ペーパーバック



nice!(0)  コメント(9)  トラックバック(0) 

nice! 0

コメント 9

noritan

今から、似たような所に突っ込んでいきます。
90mAも流したら、きっと立派なノイズが出るんだろうな。

by noritan (2009-03-28 17:14) 

hamayan

見ましたよ。
明らかにのりたんさんの方が難易度が高いので、とても興味がもてます。
時間的制約とか、流す電流の大きさとか。

by hamayan (2009-03-28 18:09) 

noritan

もし、ポートにDC的に電流が流れてGNDレベルが変動してしまうのが原因であれば、CPUを停止させる事では解決できないと思います。

電源とA/Dコンバータの基準電圧を分離するとポートに流れる電流の影響を排除することもできますが、最近のマイコンでは最初からVDD/VSSとつながっているのでどうしても共通インピーダンスを持ってしまいます。せめて、個別にボンディングされていることを祈るばかりです。

あらかじめ、予備実験をしてみますか。

by noritan (2009-03-28 20:31) 

hamayan

うーん、なんかそっちが原因の様な気がしてきました。

スイッチングノイズによる変換エラーかと思いましたが、では2桁あるセグメントの片側のみ8を出力させてスタティックにしてやってみたところ、やはり入力に対して小さめに出力します。

LEDを全部消灯した場合はまあ計算上2~3mV低めに出るのですが、片側だけ8を表示した場合は7~8mV位低く出ます。この時の7セグメントLEDに流れる電流は合計で約20mA程です。

by hamayan (2009-03-28 22:47) 

Sim

こんにちは
誤差みたいな話なんですが、AVRのA/D変換は0/1024~1023/1024なので、1023でなく1024で割った方がよさそうです。って、さらに小さくなってしまいますね。
データシートには内部基準電圧を使うときは、ノイズを減らすために、AREFピンとGNDの間にコンデンサを入れる、とあります。もしかしたら効果あるかもしれません。
やはりノイズを減らすために、AVRはSleepしている間にA/D変換できるらしいのですが、Arduinoからどうやるのかは分かりません。

by Sim (2009-03-29 00:12) 

hamayan

まあ屁理屈みたいな話になってしまうのだけれど、例えば100℃を10bitのADで変換した時、ADの1カウント辺りの分解能は100/1024と言うそれはいいのですが、実際にADから出力される最大カウントは1023なので、温度が100℃になっても100×1023/1024と言う事になって絶対に100℃に到達しない。

極端な事を言えば2bitのADで温度を測った場合ADの出力する最大値は1、1カウントでは50℃の分解能と言う事になる。それでそのまま計算してしまうと100×1/2で50℃とか言うわけの判らん結果になる。

やはり屁理屈ですね。

コンデンサは勿論付いております。
by hamayan (2009-03-29 00:50) 

hamayan

極端な例は、2bitではなく1bitですね。
by hamayan (2009-03-29 01:14) 

noritan

MC9S08SH4でちょいと実験してみました。

ブレッドボードで何も考えずにLM35DZの出力電圧をA/D変換すると、確かに電流を流した状態でA/D変換出力を観測すると誤差が大きくなります。ただし、原因は、GNDの共通インピーダンスではなく電源電圧の変動でした。ニッケル水素電池ですが、5.05Vが4.97Vまで低下しています。

そこで、内蔵バンドギャップのA/D変換値で補正したところ、今度は、GNDの共通インピーダンスが見えてきました。ハンディ・テスタで測定すると0.4mVの電位差があります。マイコンのGNDとLM35DZのGNDをバイパスしてやりましたが、やはり誤差は出ます。マイコンとLM35DZのVDDをバイパスしてやりましたが、劇的な効果はありません。

この時点で、温度計の数値は16.57と16.37の間を行き来しています。残っているのは、マイコン内部の共通インピーダンスだけですから、どうにもなりませんね。

GNDが浮くことを前提として、VOUTとGNDの両端の電圧を測定し、差電圧から温度を計算すると何とかならないかな?

by noritan (2009-03-29 14:29) 

hamayan

実験ありがとうございます。
どうやら省pin ONE CHIPマイコンに共通の問題なのかもしれませんね。

直流オフセットエラーと言う事になるので、予めデータを取って補正を入れるとかが、まあイマイチ納得できないにしても現実的な解決の一つと。
または電流流すなら、別にドライバーICを用意した方が結果的に良いよ!と言う事かも。

前にT.I.のONE CHIPマイコンで16bitΣΔタイプのADを積んでいる14pinのマイコンを動かしていて、なんか時間が経過すると直流データがおかしくなってくる???、指で触るととたんに変化したりして、「うわ!温度ドリフトだぁ」っと。

やはりアナログ計測は難しいですね。

by hamayan (2009-03-29 18:02) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

ATmarquinoでMhysicaln..ATmarquinoでMhysicaln.. ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。