[ コンパイラーが動作しない ]
最近出回ってきたIC・PIC12F1822の様な機能の強化されたものに、A/D変換やコンパレーター用として内部基準電圧が使えるようになりました。1.024V、2.048V、4.096Vを選択出来ます。
しかし、mikroC Proのライブラリーは、それらしき設定をしても以前のままで、希望の内部基準電圧に対応せず、電源電圧になってしまいました(前回まで)。
[ 動かないのならSoftを作ろう ]
そこで、「1.024Vを使いたい」という事で考えると「アセンブラーでは作動するのでC言語でも出来るはず」と思い 出来ないのはまだライブラリーが対応していない(Ver 4.6)のだ、と考え、新規に作る事にしました。
結局作ったのは、下記のようにアセンブラーと同じようなものです。これで10bitのA/D変換が出来るようになりました、分解能力は1bitが0.001V(1mV)となります。
void ADC_MRead(char channel) { // PIC12F1822 4MHz(Fosc=100) ADCON1=0b11000011; //7bit=ADFM(h=2 l=8bit) //6.5.4bit=Fosc 1.0=FVR Buffer ADFVR1_bit=0; // FVRCON set 00=off [01=1.024V] ADFVR0_bit=1; // 10=2048V 11=4.098V FVREN_bit =1; //FVR on ADCON0=((channel & 3)<<2) & 0b111111100; //set of channel ADON_bit =1; //A/D module on while(FVRRDY==0); //Wait GO_bit =1; //start while(GO_bit==1); // OK ? ADON_bit =0; //end process FVREN_bit =0; // adt=ADRESL + (unsigned int)(ADRESH <<8) - 600; }○クロックなどの設定(周波数によって変わる:表あり)
○1.024Vを選定[ADFVR1.0=01とする。これによって電圧は選択出来る。]
○Channelの設定
○FVRのEnable設定、完了するまでのポーリング
○ADのStert_GOの設定
○変換終了までのポーリング
○電源を切って終る。実験は電源電圧を表示させる事にしました、この時の基準電圧は1.024Vです。動作は電源2.9Vから3.6Vまで変化させ「その電圧がLCDに表示出来るか」とし、もしLCDの表示がテスターと同じになれば、基準電圧が維持されている事になります。
予想通り電源を変化させるとほぼ、同じ電圧をLCDが表示しました、すごい!と思いました。これは電池動作では特に要求される性能で、順次電圧が低下する電池は安定に作動するのは助かります。
いや、この性能は必修条件でしょう。今まで付いて無いのがおかしいのです(近い内に付くと思っていました)。
[LM61BIZ Temperature Sensor]
最近温度ICがデジタル情報として取り出せるようになりました。でも少し古いアナログ系のICは安価に手に入れることが出来て魅力的です。
そのうち、LM35DZやLM60・LM61BIZは0.01V/℃で動作し、出回っているので手頃です。
ただし、LM61BIZはオフセットとして0.6Vの補正が必要です。A/D変換の基準電圧1.024Vが使えると、1bitが0.1℃に対応出来ます、これって使い易いですねー。
でも0.6Vのオフセットですから最大1.024Vとなり、温度換算で42.3℃が最大という事になります。A/D変換の値-600で温度直読になりますが、Max42℃では少し低い感じもします。この場合は基準電圧を2.048Vにすれば0.2℃ステップになりますがより高い温度まで対応が出来ます。これも-25から+85℃とカタログに出てますから、多少余裕があるはずですからもしかして「100℃近くまでは表示出来る」かも知れない。
希望ですが「PICの16F系でも早くA/D変換が10bitから12bitにしてくれると良いのに!」他のメーカーで出ているのでこの辺も時間の問題と思われます…。少し古くなりますが、LM35DZは0Vから100℃まで(10bitなので)使えます。マイナスは負の減圧が必要で、レベルシフトの工夫が必要です。
今回の実験は0.1℃単位でMax42.3℃としました。動作が不安定なので2.2KΩと0.1μFを付けフィルターとしてみると、ノイズが減ってだいぶ安定しました。
スタート時、Cの容量が多いので2秒ぐらい必要、もっと減らせばと思った(0.01μFでも良いかなー)。アナログICは多量に売られているので安価!
[写真左が今回実験している物]LM61BIZは秋月電子では4個200円です(但し店頭価格)、安価なLCDとの組み合わせに面白いと思います。以前のPICでは基準電圧を自分で用意する必要がありました。
問題点として、各ICは誤差を持っていることです、理想的な動作ではありませんので何所かで補正が必要です。今回実験したものは+2℃ほどあり、オフセット補正する時に修正する事にしました。ソフトかハードで修正する必要があります。
600の所、2℃ですら620にして[2℃]分多くすれば、表示は減ります。あまり細かく表示させても意味が無い感じもします、ただ温度変化が知りたい場合細かい方が良い時があります。
LM61BIZの電源は2.7から10.0Vで125μAとあります、これとLCDの動作電圧などで最終的には電源電圧を決めます。
実験では3.3V動作で約0.88mAでした(電圧を下げればもっと下がりますが、温度センサーが作動しなくなります)、これはCPU+LCD+LM61BIZの消費電流です。
Softの問題点として、プログラムを作る上でスタック不足に遭遇し、一時コンパイル出来ない状態になった(ドキー!)。16もあって、何所かプログラムの設定が悪いのか…(バンクが多くなったからかなー)。
現時点のプログラム、回路図がないと分からないかなー(下の図ダイオードと抵抗値の所がLM61BIZです:追加文)。2011/6/2 作成
[ダイオードを使って温度計]
1mVをA/D変換出来ると、もしかしてシリコンダイオードを使って温度を測れるかも知れない。という事で、試しにLM61BIZを外して机の中でゴロゴロしている「1S1588に電圧を加える」をやってみました。
47KΩを通して3.3Vの電源から供給する方法です。これでもしかして「-2mV/℃になって、温度が測定出来るかも」、でも最適電流値が分かりません。不明点が多く、あまりあてにはなりませんが実験は簡単なのでトライしてみました。色々試している内に「DATAを逆数にして、表示する」のですが室温20℃ぐらいをそれらしく表示するように、変数を決めて動作させてみました。
結論は「良くない!」です。ポイントとして次のことが考えられます。
A.温度係数を「-2mV/℃」にする(基本DATAが無い)。
B.直線性が保てない。
やはりメーカーはただ金を取るだけではありません、そこそこ動作する物はかなりの手間隙を掛けていると思います。簡単にノウハウを出してくれないという事でしょうか。
それでも、プログやHPなど何所か探せばアマチュアが公開しているかも知れません。[実験はこんな感じです]
ダイオードと抵抗に変えただけです。一応20℃の室温が表示するように合わせてからドライヤーを20cm程はなしてゆっくり加熱して行きました。
これで20-34℃ぐらいまではまあまあ変化しましたが、何故か35℃(他の温度計で)辺りから表示が急に多くなってドンドン乖離して行きました。理由は不明です、39℃のはずが表示では56℃とか一気に上がってしまいました。もしかして、A/D変換の基準電圧が狂うのでしょうか、温度を下げると又同じ様に動作しています。時間を待ては室温の20℃近くになります(ぴったり合いません、誤差1-2度あり)。確か、ダイオードの場合100℃位測れると何所かで読んだ記憶があるのですが…。
温度センサーであるダイオードはガラス製で熱風が直接当たり反応が早い、のに対し比較したLM73はプラスチックで封じられているので、熱伝導が鈍い!というのは確かです。(何方か実験をお願いします。)
とすれば「そこそこ使える」かも知れない。結論として「更なる実験をする」ことや「ダイオードが-2℃/mVになる電流値を探せないと実用にはなりにくい」かも知れません。
とすれば、専用のICを使う方が値段も安く、はるかに楽だし信頼性もあります。アマチュアは数たくさん作って売るわけではありませんから。Softは[dt=100-((adc-345)/2); // Diode offset=345]です。
単純に-2℃/mVなら1℃が2bitになるので0.5℃の表示が可能です。あまり意味ありませんが0.5℃ Stepで表示させました。2011/6/4 作成