以前購入した16F819を使ってA/D変換の実験をしました。8Bit/10Bitの変換が出来ますが10Bitにしてループ化すると変換のちらつきが出るので、8bit使用としました。
8bitとすると0-255までですが、電圧表示程度なら問題なく使えます。変換をたまにする程度なら10bitにしても良いと思います。
現物写真は[前回のLCDの実験基板]ですご覧下さい、これの電源端子の上に付いているVRを経由して「供給電圧を表示する」という仕組みです。
51KΩと20KΩのVRで分圧して測っています。入力の最大電圧は25.5Vまで表示させることが出来ます。
基準は電源電圧、つまり3端子レギュレータの精度に掛かっています。温度によってあまり変化しては困るのですが、今のレギュレータICは安定しているので簡易電圧測定なら十分使えそうです。実験の結果
始めICをいれずに電圧を測り、VRを合わせておよその抵抗値にしておきます、後は動き出したらテスターと同じ値になるように合わせるだけです。
結果は10.0Vで合わせるとほぼ0.1Vの誤差程度で表示出来ました。
その後10bit(max=1024)で表示させてみました(下段プログラム)がチラツキが多く見難いです。表示DATAが多いので使い道は必要に応じて、かと思います。(2007/MAR/18)
A/D変換、スイッチオン1回目でミスがありました。
20V入力で表示が13Vでした。2回目は正常の20.0Vとなりました。
待ち時間のWAITを入れれば良いのか不明、もし待ち時間を入れると2回目以後も入るので「一度カラ読みをして2回目を使う」ことにしました。
RA0入力A/D変換 8bit255MAX
入力10V時ICには1.97Vとなった、この時の抵抗は14.1KΩ・20V入力では約4Vです。
端子に5V以上加えると、ICが破壊する可能性がありますから、ぎりぎりの測定には御注意!
(右側に続く!)その後の実験では
[movwf ADCON0]の設定と [bsf ADCON0,GO ;A/D start]の間に[NOP]コマンドを入れたら動作するようになりました。
これでも少し不十分で現在は4 step入れている。
変換が終わったら電源OFFするため「bit0をクリヤする」と良いみたいです。(3/24)
動作は4MHzなので、メインクロックが遅い場合は不用かも知れません。逆に少し多めに待ち時間を入れた方が安心です。
何も接続しないと002-3など少しの数字が出ることがありました。これにはコンデンサを入れると止まりますが表示精度が保てず、しばらく何も付けずに使うことにしました。
(2007/MAR/20)A/D変換の設定ですが、基準を電源電圧(ここでは5V3端子レギュレータ使用)にする場合。
ADCON1のPCFG<3:0>: A/D Port Configuration Control bitsの設定でAN4-AN0までポートの選択が出来る。
PCFG=0000で全入力:PCFG=0100でAN3,1,0の3ヶ所:PCFG=1110でAN0のみの選択が出来る。(サンプルはこれ)
今回使わなかったのですが、基準電圧をAN3端子に加えて使う方法もある。これだと少し余裕があるので5V近くの電圧にビク付くことも無い。
PCFG=0001で全入力:PCFG=0101でAN1,0の2ヶ所の使用が出来る。
他に作動入力もあるのでマニアルで研究して下さい、ただアンプが付いてないので使い難いかも知れない。
右の図で20KΩのVRで電圧調整していますが結構クリチカルです、ここは多回転のVRが欲しいです。プログラム [サブルーチン]
AD_COV [8bit mode] BANKSEL ADCON1 movlw B'00001110' ;RA0=input movwf ADCON1 BANKSEL ADCON0 movlw B'01000001' movwf ADCON0 bsf ADCON0,GO ;A/D start AD_CLP btfsc ADCON0,GO goto AD_CLP movf ADRESH,W ;read movwf BYTE0 ;DATA to BCD clrf BYTE1 call CONV ;8bit return --------------------------------- AD_COV [10bit mode] BANKSEL ADCON1 movlw B'10001110' ;10bit Right justified, movwf ADCON1 BANKSEL ADCON0 movlw B'01000001' ; movwf ADCON0 bsf ADCON0,GO ;A/D start AD_CLP btfsc ADCON0,GO goto AD_CLP movf ADRESH,W ;read andlw 0x03 movwf BYTE1 BANKSEL ADRESL movf ADRESL,W ;read BANKSEL BYTE0 movwf BYTE0 ;DATA to BCD call CONV return
もどる [MAIN MENU]