![]()
今回は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と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 Moduleschar* 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 resultLCD_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);
}
}
}
これでPSoCへ書き込み動作確認をする。今回もPSoCEvalを利用した。
温度センサーの「S-8100B」は写真を見て左側の端子からOUT、GND、VCCとなる。それぞれポート01、GND、VCCに接続する。温度がきちんと計測できない(実際より高く表示される)ようであればOUTとVCCの間に1MΩ程度の抵抗を配置するといい。







