文書の表示以前のリビジョンバックリンクPDF の出力全て展開する/折り畳むODT 出力文書の先頭へ この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。 ====== ダイオード温度計 ====== ===== 概要 ===== 温度計を自作する場合、一般的には、次のような高精度IC温度センサを利用します。 * LM35DZ(0~100℃、10.0mV/℃ ) * S8100B(:-40~+100℃、-8.0mV/℃ ) 今回は、シリコンダイオードの温度特性を利用した温度計を作成してみました。 ===== 動作原理 ===== シリコンダイオードの順方向電圧は、接合部の温度が変化すると-2mV/℃の割合で変化します。 通常20℃の順方向電圧は、約600mVです。 測定可能な温度範囲は、ダイオードの種類にもよりますが、約-20℃から150℃まで可能です。 但し、温度変化の割合は必ずしも直線的ではないので、誤差がでますので、厳密な計測には向きません。 今回の温度計では、この電圧の変化を計測し、温度として表示しています。 ダイオードを5個直列に接続することにより、温度の変化による、電圧の変化量を-10mV/℃としました。 <シリコンダイオードの特性> * シリコン半導体の接合電圧(順方向電圧)は、通常0.5~0.9Vの範囲で使用される。 * その接合電圧の温度係数は、負の値を持っており、約-1.7~-2.2mV/℃の値が示されることが多い。 * また接合電圧の温度係数は、接合電圧に大きく依存し、接合電圧が大きくなると温度係数は小さくなる。 * ダイオードに流す電流に応じて接合電圧が変化する。 * 高電流密度になれば負の温度係数の絶対値は小さくなる。 * 接合電圧が、0.65Vで温度係数は、約-2mV/℃になる。 * 電流が小さければ温度係数の絶対値はもっと大きくなる。 ===== 回路図 ===== {{:imgpaste:202004:htmikan-20200429-183047.png}} ===== ソースコード ===== <code c ThermoMeter3.c> //********************************************************************** /* 『温度計(シリコンダイオード使用)』 */ //********************************************************************** unsigned int measurement() { unsigned int ad, cnt; // ad = 0; for (cnt = 0; cnt < 60; cnt++) { ad += Adc_Read(1); } return (ad / 60); } //********************************************************************** void main() { static unsigned char buf[6], cnt; static unsigned int ad; // OSCCON = 0b01110000; // クロックは8Mhz CMCON = 0b00000111; // コンパレータは使用しない。 // A/D変換を使用する。 ANSEL = 0b00000010; // ポートを初期化する。 TRISA = 0b00111010; TRISB = 0b00001111; // 入力割り込みの設定 INTCON.INTE = 1; INTCON.INTF = 0; OPTION_REG.INTEDG = 1; // LCDを初期化する。 Lcd_Custom_Config(&PORTB,4,5,6,7,&PORTA,0,7,6); Lcd_Custom_Cmd(LCD_CURSOR_OFF); Lcd_Custom_Cmd(LCD_CLEAR); Lcd_Custom_Out(1, 1, "ThermoMeter3"); Delay_ms(500); Lcd_Custom_Cmd(LCD_CLEAR); // INTCON.PEIE = 1; // これ以降の処理で割り込みを許可する。 INTCON.GIE = 1; // これ以降の処理で割り込みを許可する。 // while (1) { ad = measurement(); ad = (double)ad * 4.8828125; WordToStr(ad, buf); Lcd_Custom_Out(2, 1, buf); Lcd_Custom_Out(2, 6, "mV"); // WordToStr(100.0 - (((double)ad - 1380.0) / 10.0), buf); Lcd_Custom_Out(1, 1, buf); Lcd_Custom_Out(1, 6, "゚C"); } } //********************************************************************** </code> ===== 動作確認 ===== いつものブレッドボードで確認しました。 上の白い温度計は市販のものです。 {{:imgpaste:202004:htmikan-20200429-183208.png?500}} シリコンダイオードを5個直列にした、温度センサー部分です。 市販の温度計よりも、温度変化に敏感に反応します。 {{:imgpaste:202004:htmikan-20200429-183222.png?500}} 上:温度を表示 下:5個のダイオードの両端電圧です。 {{:imgpaste:202004:htmikan-20200429-183238.png?500}} ===== 調整 ===== ダイオードに流す電流によって、温度係数の絶対値が変わってきますので、使用するダイオードに応じて、バイアス用の抵抗、回路図では、100kを調整し、プログラム上の100℃のときの電圧や1℃あたりの温度計数(10mV)の単位を調整することにより、更に精度を高めることが可能となります。 <callout type="warning" title="著作権表示 copyright notice"> このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]] This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]] </callout> elechobby/picdic/pic16f88/70.txt 最終更新: 2025/10/17 14:29by 127.0.0.1