電子工作6 – UV消去型12-bitADC付き16C773JW で温度表示実験-始末記
概要
前の電子工作5 の10-bit ADC(1024 bits) を持つ16F819 を使って温度をLCDに表示する実験では、小数点以下1桁の安定した表示には、アンプを導入して温度センサからの入力を増幅してやる必要があった。
12-bit(4096 bits) ADCを持つPICを使えば、アンプなしでもいけるのでは、と考え探したが、”F”タイプのものはまだなく、紫外線消去タイプで窓付きの16C773JW
というものが市販されていることが分かった。高かったが(\2700)、大阪の通販店より入手し、同時に、イレーサも\2500ほどかけて自作することにした。
12-bitADCは10-bitADCに比べ、4倍も精度が高いので、アンプによる増幅なしで、温度センサからの入力を、小数点以下1桁まで安定して表示出来ると思ったが、実際はそうはいかなかった。やはり、小数点以下1桁目が不安定であった(特に10°C以下で)。試行錯誤の末、結局、アンプを導入して、5倍に増幅することにした。今回は、新たに知ったrail-to-rail
タイプ(電源と出力がほぼ同じという特徴を持つ)を使い、電源を5.0Vのみと単純化した。Voltage Divider を使って、温度センサ
LM35DZ(10mV/C) からの出力と同じような電圧を主回路に入力電圧として加え、この入力電圧とLCD上の温度値の関係をみた。その結果、検討した2.5 -
100°C(入力電圧0.025
–1.00Vに相当)で、十分実用的な安定した表示が得られた。また、実際の温度センサからの入力の場合も、下の写真のように安定した小数点以下1桁以上の温度表示が可能であった。
LCD上の温度表示
紫外線消去タイプの窓付き16C773JW
自作UVイレーサ(殺菌灯GL-30 ナショナル: 4W、ガラス管部長さ:11cm)
回路
下図の様に、16C773JW
の ADCは12-bitなので、液晶LCDとのピンの結線が、前の16F819 の場合と違っている。また、外付けのクロックが必要で、4MHzのセラロックを用いた。また、センサ入力を5倍に増幅するアンプには、rail-to-railのLMC662CNを用いた。5.00V
の電源電圧で、最大出力4.97Vが得られた。つまり、アンプの電源電圧が5.00Vの時、1.00Vの入力があると、最大で4.97V(ほぼ5.0V)に増幅されるということです。
下の表は、PICのポートにLM35DZからの出力(10mV/°C)を模した電圧(分圧器から)を加え、LCD上に温度を表示させた結果である。理論値(相当する温度値)と比較
的良く一致していることが分かる。また、表示値は2.5/5.0–100°Cまで安定していた。
PICポートへの入力基準電圧 (V) |
相当する温度値 (°C) |
LCD上に表示された温度値
(°C) |
1.000 |
100 |
99.5 stable |
0.950 |
95 |
94.6 stable |
0.900 |
90 |
89.8 stable |
0.800 |
80 |
79.9 stable |
0.700 |
70 |
69.9 stable |
0.600 |
60 |
59.9 stable |
0.550 |
55 |
54.8 stable |
0.500 |
50 |
49.7 stable |
0.450 |
45 |
44.8 stable |
0.400 |
40 |
39.9 stable |
0.350 |
35 |
35.1 stable |
0.300 |
30 |
30.2 stable |
0.250 |
25 |
25.2 stable |
0.200 |
20 |
20.1 stable |
0.150 |
15 |
15.1 stable |
0.100 |
10 |
10.1 stable |
0.050 |
5 |
5.0
(5.0-5.1) |
0.025 |
2.5 |
2.6 |
プログラム
前の電子工作 4、5 の16F819を使ったプログラムと考え方は基本的には同じである。しかし、16C773JW は28ピンのチップで、12-bit ADCを搭載しているので、LCDとのピン結線や設定の仕方が多少違う。また、今回は、AD変換の完了をtime
delayではなく、polling 〈AD変換の状態を定期的に調べる〉によって検知する方法に改めた。
'ADLC73h7.bas(<-ADLC73h4.bas) - 16C773/JW (UV erasable PIC with 12-bit ADC)
'Completely renewed (ADC polling introduced, Define ADC_CLOCK 1)
'This time, the input was amplified 5 times (actually 4.97 times)
'with LNC662CN and the result was divided by 5.
'Starting from 2004.10.29
'Exp. to read a voltage value (V) from PortA.0 and display the
'temperature (V/5) on LCD
'Pin connection between LCD (SC1602) and 16C773JW
'LCD PIC16C773JW
'DB4(P11) PortB.4(P25)
'DB5(P12) PortB.5(P26)
'DB6(P13) PortB.6(P27)
'DB7(P14) PortB.7(P28)
'RS(P4) PortB.1(P22)(add 4.7K pullup resistor to 5 volts)
'E(P6) PortB.0(P21)
'R/W(P5) Ground(P19)
'Vdd(P1) 5 volts(P20)
'Vss(P2) Ground(P19)
'Vo(P3) Ground(P19) or 20K potentiometer (p.sply for LCD driver)
'DB0-3 No connect
'ADC input from LM35DZ - PortA.0(P2) of 16C773JW
'MCLR/Vpp(P1) of 16C773JW - Vdd(5V) via 4.5K resistor (essential!)
'4MHz ceralock was connected to Pins 9 and
10 of 16C773JW
'**New LCD connection setting** See p.88 in PBP Manual
DEFINE LCD_DREG PORTB 'Set LCD Data port
DEFINE LCD_DBIT 4 'Set starting Data bit
'(0 or 4) if 4-bit bus
DEFINE LCD_RSREG PORTB 'Set LCD Register Select port
DEFINE LCD_RSBIT 1 'Set LCD Register Select bit
DEFINE LCD_EREG PORTB 'Set LCD Enable port
DEFINE LCD_EBIT 0 'Set LCD Enable bit
DEFINE LCD_BITS 4 'Set LCD bus size (4 or 8 bits)
DEFINE LCD_LINES 2 'Set number of lines on LCD
DEFINE LCD_COMMANDUS 2000 'Set command delay time in us
DEFINE LCD_DATAUS 50 'Set data delay time in us
'**Setting for ADC of 16C773JW
Define ADC_BITS 12 '12-bit ADC used (new!)
Define ADC_CLOCK 1 'for 8Tosc (PIC of 5MHz or below - 4MHz used)
Define ADC_SAMPLEUS 50 'Sample timing
'**Setting ADCON0 and ADCON1
ADCON0=%01000001 '=65 (decimal) - ADC setting
'bit7-6=01(Fosc/8-ADCS1:ADCS0),'bit5-4-3,1=000x0(channel0(RA0/AN0)),
'bit2=0(GO/DONE-Conversion polling used instead of a time delay),
'bit0=1(ADON-AD module is operating)
ADCON1=%10001110 '=142 (decimal) - ADC and pin setting
'bit7=1 (right justified), bit6-5-4=000 (A/D VrefH-AVdd(supply power),
'A/D VrefL-AVss(GND)), bit3-2-1-0=1110 (AN0-Analog port, all others-
'Digital I/O ports)
TRISA=%00000001 'PortA.0-analog input, all others PortAs-output
TRISB=%00000000 'All PortBs are output
Samples var word 'Samples
Sample var byte 'Sample
Vin var Word 'Vin is variable (16 bits?)
Result VAR WORD 'Result is variable
ADCloop: 'Averaging routine (n=10)
Samples=0
For Sample=1 to 10 'Take 10 samples (changed from 20)
ADCON0.2=1 'Start of conversion
adcnotdone: Pause 5
IF ADCON0.2=1 then adcnotdone 'Wait for adc finished
ADCIN 0, Vin 'Read ADC ch-0 and save in Vin
'(range 0-4096)
Pause 1 'Wait for ADC (new?)
Samples=Samples + Vin
Next sample
Vin=Samples/10 'Mean of 10 Vin values
Result=Vin*/3125 'Scale 4096 to 50000
Result=Result/5 'Convert Volt. to Temp. (due to 5-times amplification)
Result=(Result+5)/10 'Round the result
Lcdout $fe, 1 'Clear LCD
Lcdout $fe, 2
Lcdout "Temp.=",dec1 Result DIG 2,DEC1 Result DIG 1,".",DEC1 Result DIG 0,"C"
'So as to display like "23.4C"
Pause 500
goto ADCLoop
'Note: Aki Pic programmer configuration for 16C773JW:
'FOSC-HS, WDTE-Enable, PWRTE-Enable,
'BODEN-Enable, BORY-2.5V, CP-Disable
(Important!!, or destroy Chip)
余談
UV消去型12-bitADC付き16C773JWは、紫外線で消すのに30分位時間がかかり、やっぱり使いづらい。また、焼き込み時に、CP(Code
Protect)を誤って“Disable” 以外の設定にすると“再書込み“が出来なくなる、つまり、オシャカにしてしまうので、神経を使う。せっかくの12-bitの高精度も、多分、小生の力量不足からか、十分引き出せなかった。関連フォーラムを探しても、このIC
Chip に関する情報は殆んどなかった。PICBasic Proの愛好家には、あまり使われていないようである。理由は不明。