PIC 16:16F819を使ってA/D変換の実験


 以前購入した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

inserted by FC2 system