ガス検知器(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がありました。
そのタイミングチャートから想定したものです。
回路図
ソースコード
- gasSensor.c
//********************************************************************** #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"); } } //**********************************************************************






