====== ガス検知器(TGS2450)(PIC18F1320) ====== ===== 概要 ===== 感ガス素子(金属酸化物半導体)を使用したガス検知器を作成しました。 素子には、秋月電子通商で300円で購入した「TGS2450」を使用しました。 【特徴】 * 低消費電力(電池駆動可能) * 硫黄化合物系ガスに対して高感度 * 低コストかつ長寿命 * 反応物質: * メチルメルカプタン◎ * 硫化水素◎ * エタノール○ * アンモニア○ * ◎は特に高感度 * 検知対象濃度:0.1ppm以上 * ヒーター電圧:DC1.6V 138mA(8msON/242msOFFの繰り返し) * 1.6Vを連続で与えるとヒーターが簡単に壊れます。指定デューティを守ってください。 * センサ抵抗値:5.62kΩ~56.2kΩ(パルスで電圧を印加し、抵抗値を検出します) * ヒーターによって加熱され、センサ抵抗値が安定するまで数10秒~数分かかります。 * 直径:9.2mm 【応用】 * 硫黄化合物系ガス検知器 * 口臭チェッカー * 空気清浄器・換気扇コントロール * {{:imgpaste:202004:admin-20200430-175720.png}} ===== 動作原理 ===== 感ガス素子部を加熱するために、ヒーター抵抗(RH:1-4pin)の両端にヒーター電圧(VH)を印加します。 VH は250msec周期中8msec のみ印加され、残りの242msec は0V とします。 また、センサ信号(Vout)を出力するために、感ガス素子抵抗(Rs:1-3pin)と負荷抵抗(RL)の両端に回路電圧(Vc)を印加します。 つまり、センサ信号はRsとRL の分割電圧となりますので、センサ抵抗に応じてセンサ信号も変化します。 なお、VC もVH 同様断続的に印加する必要があります。 {{:imgpaste:202004:admin-20200430-175753.png}} TGS2450のタイミングチャートです。但し、公表されているデータではありません。 販売元のフィガロ技研のホームページを辿ると姉妹製品のTGS2442がありました。 そのタイミングチャートから想定したものです。 {{:imgpaste:202004:admin-20200430-175806.png?500}} ガス感度特性 {{:imgpaste:202004:admin-20200430-175836.png?500}} ===== 回路図 ===== 最小限の構成にしました。 検出データは、RS232CでPCへ送るようにしました。 {{:imgpaste:202004:admin-20200430-175907.png}} ===== ソースコード ===== //********************************************************************** #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"); } } //********************************************************************** ===== 動作確認 ===== いつものブレッドボードで確認しました。(検出前) {{:imgpaste:202004:admin-20200430-180119.png?500}} 臭いを検出しLEDが点灯した所です。 {{:imgpaste:202004:admin-20200430-180130.png?500}} 検出データをPCのハイパーターミナルで表示してみました。 検出前はほぼ一定の電圧を出力します。 {{:imgpaste:202004:admin-20200430-180145.png}} 臭いを検出すると電圧が変化します。 {{:imgpaste:202004:admin-20200430-180153.png}} プログラムではこの変化を検出し、LEDを点灯させたり、ブザー(PWM)を鳴らせたりしています。 このページは稲崎様の閉鎖した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]]