PSoCとS-8100Bで温度を計測する

psoc_8100b_01.gif
今回はPSoC Designerと温度センサー「S-8100B」を組み合わせて温度を測る。

「S-8100B」は秋月電子で100円程度で購入できる安価な温度センサーだ。5Vで動作させると、30℃のときに1.508V出力で、温度に応じて-8.0mV/℃変化する。例えば20℃であれば1.508V - 8.0mV/℃×(20℃ - 30℃)=1.588V、-20℃なら1.508V - 8.0mV/℃×(-20℃ - 30℃)=1.908Vが出力される。
逆に出力電圧から温度を求めるには「温度=(1.508V - 出力電圧)÷8+30℃」となる。

psoc_8100b_02.gif
プロジェクトを作成する手順は前回の「PSoCとLM35で温度を計測する」とまったく同じため省略する。

前回と異なるのは最終的なソースコードの一部だけだ。前回は温度センサーからの出力電圧を8倍したが、これは不要なのでコメントアウトする。そしてA/Dコンバーターからの出力値を1.22倍して電圧値に変えたのち、前述の式に当てはめて温度を計算している。ただし8で除算する代わりに10/8(=1.25)を乗算した。


//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules

char* itoa(int nData,char* pszData)
{
int pn2n[] = {10000,1000,100,10,1};
int i;
char* pszTmp;

pszTmp = pszData;
for(i = 0; i < 5; i++)
{
(*pszTmp) = 0;
while(nData >= pn2n[i])
{
nData -= pn2n[i];
(*pszTmp)++;
}
(*pszTmp) += '0';
pszTmp++;
}
pszData[5] = 0;
}

INT iData;
void main()
{
LCD_1_Start(); // Initialize LCD

PGA_1_Start(PGA_1_MEDPOWER);
// PGA_1_SetGain(PGA_1_G8_00);

M8C_EnableGInt; // Enable Global Interrupts
ADCINC12_1_Start(ADCINC12_1_HIGHPOWER); // Apply power to the SC Block
ADCINC12_1_GetSamples(0); // Have ADC run continuously
for(;;){
while(ADCINC12_1_fIsDataAvailable() == 0); // Loop until value ready
ADCINC12_1_ClearFlag(); // Clear ADC flag
iData=ADCINC12_1_iGetData(); // Get ADC result
// Add user code here to use or display result

LCD_1_Position(0,5); // Place LCD cursor at row 0, col 5.

iData += 2048;
iData *= 1.22;
iData = (1508 - iData) * 1.25 + 3000;
{
char pszData[6];

itoa(iData,pszData);
LCD_1_PrString(pszData);
}
}
}





_DSC8999.JPG
これでPSoCへ書き込み動作確認をする。今回もPSoCEvalを利用した。

_DSC9000.JPG
温度センサーの「S-8100B」は写真を見て左側の端子からOUT、GND、VCCとなる。それぞれポート01、GND、VCCに接続する。温度がきちんと計測できない(実際より高く表示される)ようであればOUTとVCCの間に1MΩ程度の抵抗を配置するといい。

_DSC9002.JPG
これで温度が表示された。


カテゴリー「電子工作」 のエントリー