ガス検知器(TGS2450)(PIC18F1320)

概要

感ガス素子(金属酸化物半導体)を使用したガス検知器を作成しました。 素子には、秋月電子通商で300円で購入した「TGS2450」を使用しました。 <TGS2450:硫黄化合物ガス検知> 【特徴】

低消費電力(電池駆動可能)

硫黄化合物系ガスに対して高感度

低コストかつ長寿命

反応物質:

メチルメルカプタン◎

硫化水素◎

エタノール￮

アンモニア￮

◎は特に高感度

検知対象濃度:0.1ppm以上

ヒーター電圧:DC1.6V 138mA(8msON/242msOFFの繰り返し)

1.6Vを連続で与えるとヒーターが簡単に壊れます。指定デューティを守ってください。

センサ抵抗値:5.62kΩ~56.2kΩ(パルスで電圧を印加し、抵抗値を検出します)

ヒーターによって加熱され、センサ抵抗値が安定するまで数10秒~数分かかります。

直径:9.2mm

【応用】

硫黄化合物系ガス検知器

口臭チェッカー

空気清浄器・換気扇コントロール

動作原理

感ガス素子部を加熱するために、ヒーター抵抗(RH:1-4pin)の両端にヒーター電圧(VH)を印加します。 VH は250msec周期中8msec のみ印加され、残りの242msec は0V とします。 また、センサ信号(Vout)を出力するために、感ガス素子抵抗(Rs:1-3pin)と負荷抵抗(RL)の両端に回路電圧(Vc)を印加します。

つまり、センサ信号はRsとRL の分割電圧となりますので、センサ抵抗に応じてセンサ信号も変化します。 なお、VC もVH 同様断続的に印加する必要があります。

TGS2450のタイミングチャートです。但し、公表されているデータではありません。 販売元のフィガロ技研のホームページを辿ると姉妹製品のTGS2442がありました。 そのタイミングチャートから想定したものです。

ガス感度特性

回路図

最小限の構成にしました。 検出データは、RS232CでPCへ送るようにしました。

ソースコード

//********************************************************************** #define LED PORTA.F1 #define VC PORTA.F2 #define VH PORTA.F3 static unsigned int cnt, buzzer; static unsigned char adFlag; //********************************************************************** void interrupt() { if (INTCON.T0IF == 1) { // 約1msec周期 INTCON.T0IF = 0; TMR0L = 0x2F; TMR0H = 0xF8; cnt++; if (cnt == 1) VH = 1; if (cnt == 9) VH = 0; if (cnt == 245) VC = 1; if (cnt == 248) adFlag = 1; if (cnt == 250) { VC = 0; cnt = 0; } if (buzzer >= 1) { buzzer--; if (buzzer == 0) { Pwm_Stop(); LED = 0; } else { Pwm_Start(); LED = 1; } } } } //********************************************************************** void Pwm_Change_DutyEx(unsigned int duty_ratio) { CCPR1L = duty_ratio >> 2; CCP1CON.F6 = duty_ratio & 0b00000001; CCP1CON.F7 = (duty_ratio & 0b00000010) >> 1; } //********************************************************************** void Usart_Write_String(char *buf) { static int len, i; len = strlen(buf); for (i = 0; i < len; i++) { Usart_Write(buf[i]); } } //********************************************************************** void main() { static unsigned int ad0, old; static unsigned char buf[10]; // OSCCON.IRCF2 = 1; OSCCON.IRCF1 = 1; OSCCON.IRCF0 = 1; ADCON1 = 0b11111110; TRISA = 0b00000001; TRISB.F1 = 0; // TX TRISB.F4 = 1; // RX TRISB.F3 = 0; // CPP T0CON.T0CS = 0; T0CON.PSA = 1; T0CON.T0PS0 = 1; T0CON.T0PS1 = 1; T0CON.T0PS2 = 1; T0CON.T0SE = 1; T0CON.T08BIT = 0; T0CON.TMR0ON = 1; TMR0L = 0x2F; TMR0H = 0xF8; // INTCON.PEIE = 1; INTCON.TMR0IE = 1; INTCON.TMR0IF = 0; INTCON.GIE = 1; // Usart_Init(9600); // Pwm_Init(1000); // 1Khz Pwm_Change_DutyEx((PR2 * 4) / 2); Pwm_Stop(); // cnt = 0; adFlag = 0; ad0 = 0; old = 0; buzzer = 0; // while (1) { if (adFlag == 0) continue; adFlag = 0; ad0 = Adc_Read(0); if (ad0 > old) { if ((ad0 - old) > 2) { buzzer = 1000; } } else { if ((old - ad0) > 2) { buzzer = 1000; } } old = ad0; WordToStr(ad0 * 5, buf); Usart_Write_String(buf); Usart_Write_String("mV\r\n"); } } //**********************************************************************

動作確認

いつものブレッドボードで確認しました。(検出前)

臭いを検出しLEDが点灯した所です。

検出データをPCのハイパーターミナルで表示してみました。 検出前はほぼ一定の電圧を出力します。

臭いを検出すると電圧が変化します。

プログラムではこの変化を検出し、LEDを点灯させたり、ブザー(PWM)を鳴らせたりしています。

このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。詳細 This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.Details