ガス検知器(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へ送るようにしました。

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");
	}
}
 
//**********************************************************************

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

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

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

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

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

著作権表示 copyright notice

このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。詳細
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.Details
  • elechobby/picdic/otherpic/167.txt
  • 最終更新: 2025/10/17 14:29
  • by 127.0.0.1