Busan IT/센서 제어2015. 9. 24. 12:07

==================================Outline====================================

적외선 센서 코딩

----------------------------------------------------------------------------

 

적외선 센서 코딩

 

적외선 센서를 동작시키기 위한 코딩을 해보자.

 

우선 하드웨어 설정을 한 후 데이터 시트를 보고 하나 하나 코딩을 한다.


우선 기본적으로 알아야 할 점들.

- 입력 전압은 3.3V이다. 물체의 표면을 500ms 이내에 정확하게 측정할 수 있다.

- DTS-L300-V2온도계산 프로세서를 내장하고 있어 따로 온도 계산이 필요 없다.

- DTS-L300-V2는 디지털 통신으로 온도 값을 출력한다. 때문에 통신의 연결이 필요하다.

- 주변 온도와 대상 온도를 동시에 측정한다.

 

VCCGND를 제외하고 사용하는 핀은 4개이다.

- SCK: 클럭 공급

- SCE: 적외선 센서 활성화

- SDI: 신호를 입력

- SDO: 신호를 출력

 

이러한 신호들은 SPI통신을 통해 이루어지기 때문에 SPI사용에 대한 숙지를 해야 한다.

 


 

SPI에 대한 학습이 되어 있지 않음으로 우선 I/O를 사용하여 코딩에 성공하면 SPI를 사용하여 코딩을 하도록 하자.

 

우선 데이터 시트에 나와 있는 코드를 주석을 사용하여 해석해보자.

 

unsigned char buffer_Lo, buffer_Hi, p02; //1byte선언


long CHECK(unsigned char datum) //2byte return 함수

{
  
    unsigned char i= 0;
    buffer Lo = 0//버퍼 비워주기
    buffer Hi = 0//버퍼 비워주기
 

    /*** 적외선 준비 설정 ***/
    EN_LOW; //enable low
    delay us(10); //10us 딜레이
    for(i=0; i<8; ++i)
    {
        if( ( (0x80 >> i ) & datum) == 0)
        {
            SDO_LOW; //SDO = 0;
        }
        else
        {
            SDO_HIGH; //SDO = 1;
        }

}

SDO_LOW; //SDO = 0;
delay_ms(10); //10ms 딜레이
/*** 하위 바이트 읽기 ***/
for(i=0; i<8; I++)
{
        buffer_Lo = buffer_Lo << 1//하위 버퍼 좌로 한비트 밀기
        SCK_LOW; //SCK = 0;
        delay_us(1); //1us 딜레이
        SCK_HIGH; //SCK = 1;
        dealy_us(1); //1us 딜레이
        p02 = FP02 //포트의 상태 읽기
        if(p02 == 1)
        {
            buffer_Lo = buffer_Lo|0x01;}
        }
        else
        {
            buffer_Lo = buffer_Lo&0xFE;
         }
}
SDO_LOW; //SDO = 0;
delay_ms(10); //10ms 딜레이

/*** 상위 바이트 읽기 ***/

for(i=0; i<8; i++)
{
     buffer_Hi = buffer_Hi << 1//상위 버퍼 좌로 한비트 밀기
     SCK_LOW; //SCK = 0;
     delay_us(1); //1us 딜레이
     SCK_HIGH; //SCK = 1;
     dealy_us(1); //1us 딜레이
     p02 = FP02 //포트의 상태를 변수에 담아서 판단
     if(p02 == 1)
     {
         buffer_Hi = buffer_Hi|0x01;}
     }
     else
     {
         buffer_Lo = buffer_Lo&0xFE;
     }
}
EN_HIGH; //enable = 1;
return (buffer_Hi*256 + buffer_Lo);

}

 

void main(void)
{
    while(1)
    {
        Target_Value = CHECK(0xa0); // 대상 온도
        delay_ms(50);
         Ambient_Value = CHECK(0xa0); // 주변 온도
        delay_ms(500);
        //LCD에 값 출력 코드 넣기
    }

}

대충 감이 잡히면 코딩을 해보도록 하자. 순서는 아래와 같다.

  

1. 각 핀의 포트설정

 

DDRJ = 0x07; //0~2번핀 출력, 3번핀 입력

 

2. 입력 값에 대한 high, low 값 정의

 

#define SCE_LOW PORTJ=PORTJ&(~0x01)

#define SCE_HIGH PORTJ=PORTJ|0x01

 

#define SCK_LOW PORTJ=PORTJ&(~0x02)

#define SCK_HIGH PORTJ=PORTJ|0x02

 

#define SDO_LOW PORTJ=PORTJ&(~0x08)

#define SDO_HIGH PORTJ=PORTJ|0x08

 

 

 

3. SPI 함수 해석하여 작성

 

int SPI(unsigned char uiMode)

{

unsigned char ucCnt;

ucBuf_Low = ucBuf_High = 0;

SCE_LOW; //enable low

 

(진행 중)

}

 

 

4. main에서 적외선 센서 감지 값을 LCD에서 출력하도록 설정

5. main에서 적외선 센서 감지 값을 LCD로 출력





#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

// B0 : /SS, B1 : SCK, B2 : MOSI, B3 : MISO

#define SS_HIGH   PORTB=PORTB|0x01
#define SS_LOW     PORTB=PORTB&(~0x01)
#define SCK_HIGH   PORTB=PORTB|0x02
#define SCK_LOW   PORTB=PORTB&(~0x02)
#define MOSI_HIGH   PORTB=PORTB|0x04
#define MOSI_LOW   PORTB=PORTB&(~0x04)



// SPI 쓰기 함수 
void SPI_Write(void)
{
  unsigned int uiCnt;
  unsigned int uiData=0;

  SS_LOW;  // /CS = 0
  for(uiCnt=0; uiCnt<8; ++uiCnt)
  {
    if(0xA0 & uiCnt)
    {
      uiData = uiData | 0x01;
    }
    else
    {
      uiData = uiData & (~0x01);

    }
    uiData <<= 1
  
  }
  SDI  // Data 쓰기
  // Delay 10ms
  // Data 쓰기
  // Delay 10ms
  // Data 쓰기
  // /CS = 1
  // Delay 50ms
  // /CS = 0
  // Data 쓰기
  // Delay 10ms
  // Data 쓰기
  // Delay 10ms
  // Data 쓰기
  // /CS = 1
  // Delay
}

// SPI 읽기 함수
unsigned char SPI_Read(void)
{

  // Data 읽기

  // Data 반환
}

int main(void)
{


  // GPIO B 설정
  DDRB = 0xF7;  
  // B0 : /SS, B1 : SCK, B2 : MOSI, B3 : MISO
  
  // SPI
  SPCR = 0b11111101;
  SPSR  = 0b00000000;
  while(1)
  {
    SPI_Write();  // Data 쓰기 실행
    
    // 받은 데이터를 출력한다.
      
  }
  return 0;
}

 

 

 

반응형
Posted by newind2000
Busan IT/센서 제어2015. 9. 24. 09:09

==================================Outline====================================

서머 커플러

적외선 센서

----------------------------------------------------------------------------

서머 커플러

서머 커플러(Thermocoupler)의 처리도는 아래와 같다.

 

TC K-Type -> Driver IC(MAX6675) -> ATmega8A -> ULN2803A -> FND -> ECR(Error ??? Register)

 

일반적으로 센서의 사용 전압은 -10V ~ 10V, -5V ~ 5V

전류는 4mA ~ 20mA, 0mA ~ 20mA이다.

 

4mA ~ 20mA를 사용하는 이유는 단선 여부를 확인하기 위해서이다.

 

온도 센서는 2가지 틀(온도를 측정하는 방법)로 나뉜다.

1. 접촉: thermistor, Pt 100Ω, Pt 1000Ω, 열전대

2. 비접촉(적외선 센서): 열화상 카메라, 적외선 온도계

 

대부분의 온도계는 접촉식이지만 비접촉식도 있다. 비접촉 식은 흔히 적외선 센서라고 생각하면 된다. 열은 적외선을 방출하기 때문에 적외선으로 온도를 측정할 수 있다.

 

접속식은 저가이고 출력 값이 아날로그 값이다. 비접촉식은 고가이며 출력 값이 디지털 값이다.

 

//저가는 천원미만


적외선 센서 

적외선 센서에 대하여 살펴보자.

출력 값이 디지털이기 때문에 노이즈에 대한 신경을 쓰지 않아도 된다.


 

해당 센서는 사람의 체온을 재기에는 사치일 수 있다. 온도의 측정 구간이 크기 때문이다.

 

전압이 2.4v - 3.6v이기 때문에 ARM3.3v를 사용하는 것이 편하다.





SDI에서 명령을 내리면 SDO에서 값을 측정하게 된다.

 

//데이터시트 4~5page를 보고 코딩을 하면 된다.

 


데이터 시트에 있는 참고용 소스를 활용하여 코딩을 해보자.









반응형

'Busan IT > 센서 제어' 카테고리의 다른 글

적외선 센서 코딩  (0) 2015.09.24
자동차 후진 경고 센서  (0) 2015.09.14
온도계 섭씨 화씨 변경, 초음파의 특성  (0) 2015.09.10
C#을 활용한 NTC 온도 센서  (0) 2015.09.04
NTC 온도계 저항값 변환  (0) 2015.09.04
Posted by newind2000
Busan IT/센서 제어2015. 9. 14. 13:51

초음파 센서를 사용하여 센서 앞 10cm 거리에 물체가 있을 경우 빨간불이 켜지도록 코딩해 보자.



20150914.zip


동영상 - https://www.youtube.com/watch?v=V0EqM1Y9PMs

반응형

'Busan IT > 센서 제어' 카테고리의 다른 글

적외선 센서 코딩  (0) 2015.09.24
서머 커플러, 적외선 센서  (0) 2015.09.24
온도계 섭씨 화씨 변경, 초음파의 특성  (0) 2015.09.10
C#을 활용한 NTC 온도 센서  (0) 2015.09.04
NTC 온도계 저항값 변환  (0) 2015.09.04
Posted by newind2000
Busan IT/센서 제어2015. 9. 10. 13:48

==================================Outline====================================

온도계 섭씨 화씨 변경

음파의 특성

----------------------------------------------------------------------------


온도계 섭씨 화씨 변경

외부인터럽트를 활용하여 버튼을 누를때마다 표시형식이 섭씨와 화씨를 오고가게 만들어보자.


인터럽트를 사용할 핀에 스위치를 연결해 주고 코드만 간단히 수정해주면 된다.

/*** 코드 ***/

void FND_Display(unsigned char ucTD, unsigned char ucUD, unsigned char ucDP)
{

  PORTA = cFND[ucDP];  
  PORTC = 0x06 ;
  _delay_ms(2);

  PORTA = cFND[ucUD] | cFND[10];  
  PORTC = 0x05;
  _delay_ms(2);

  PORTA = cFND[ucTD];  
  PORTC = 0x03;
  _delay_ms(2);

}

void F_Convert(int temp)
{
  temp = temp * 1.8 + 320;


  FND_Display(temp/100, (temp%100)/10, temp%10);
  
}

void __vector_5(void)
{
  iFlag ^= 0x01;
  if(iFlag == C)
    PORTJ = 0X02;
  else
    PORTJ = 0X01;
}

/*** 동영상 ***/


https://www.youtube.com/watch?v=3hx9BH189ec


음파의 특성


인간이 들을 수 있는 주파수(가청 주파수)의 영역은 20 - 20kHz이다. 20Hz의 주파수를 저주 파 20,000Hz 이상의 주파수를 초음파라고 부른다.

 



 

파동은 직진성과 회절성을 가진다. 회절성은 파동이 휘어지는 성질이다.

 

낮은 주파수 대역을 만드는 기계를 우퍼라고 한다.

 

주파수와 회절성은 반비례하고 직진성과 주파수는 비례한다.

 

회절성에 따라 통신 수신의 사각지대가 줄어든다.

 

진동은 사물을 만나면 투과, 반사 혹은 흡수 된다.

 

주파수는 붉은색계열이 주파수가 낮고 파란색 계열이 주파수가 높다. 때문에 높은 주파수 계열을 사용하면 분해능이 증가한다.

 

주파수의 소리와 흡수는 사물의 밀도에 따라 달라진다. 밀도가 높으면 반사율이 높고 밀도가 낮으면 흡수율이 높다.

반응형

'Busan IT > 센서 제어' 카테고리의 다른 글

서머 커플러, 적외선 센서  (0) 2015.09.24
자동차 후진 경고 센서  (0) 2015.09.14
C#을 활용한 NTC 온도 센서  (0) 2015.09.04
NTC 온도계 저항값 변환  (0) 2015.09.04
NTC 센서를 활용한 온도계  (0) 2015.09.02
Posted by newind2000
Busan IT/센서 제어2015. 9. 4. 17:28

==================================Outline====================================

C#을 활용한 NTC 온도 센서

---------------------------------------------------------------------------



/*** 소스 코드 ***/

Embeded C

#include "LCD.h"
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <math.h>
#include "smart.h"


#define BCOEFFICIENT 3950    // The beta coefficient of the thermistor (usually 3000-4000)
#define THERMISTORNOMINAL 10000  // resistance at 25 degrees C
#define TEMPERATURENOMINAL 25  // temp. for nominal resistance (almost always 25 C)
#define SERIESRESISTOR 10000  // the value of the 'other' resistor

float fCalcNtc(int wADCVal)  // from ADC

  double fRntc;

    fRntc = ((SERIESRESISTOR *  ( 1023.0  - (float) wADCVal) /(float) wADCVal));  // SERIESRESISTOR = pullup resistor
  return(fRntc);
}
// calculate temperature from resistorvalue
float fCalcTemp( float fRntc)
{
  float fTemp;

    fTemp = (1.0 / ( (log(fRntc/THERMISTORNOMINAL))/BCOEFFICIENT  + 1.0/298.0)) - 273.0//log = ln 
  return( fTemp);
}
/*const unsigned int ad_table[] = {
991,989,987,985,983,980,978,975,973,970, //-40'C ~-31'C
966,963,960,957,953,949,945,941,937,932, //-30'C ~-21'C
927,922,918,912,907,900,895,889,882,875, //-20'C ~-11'C
868,861,854,847,839,830,822,814,806,796, //-10'C ~ -1'C

786,778,769,759,749,737,728,718,707,696, //  0'C ~  9'C
684,674,663,652,640,627,617,606,595,582, // 10'C ~ 19'C
569,559,548,536,524,511,501,490,478,466, // 20'C ~ 29'C
454,444,434,423,411,400,390,381,370,360, // 30'C ~ 39'C
349,341,332,322,313,303,295,287,279,270, // 40'C ~ 49'C
262,254,247,240,232,225,219,212,206,199, // 50'C ~ 59'C
193,187,182,176,170,165,160,155,151,146, // 60'C ~ 69'C
141,137,133,129,124,120,117,113,110,106, // 70'C ~ 79'C
103,100, 97, 94, 91, 88, 85, 83, 80, 78, // 80'C ~ 89'C
 75, 73, 71, 69, 66, 64, 62, 61, 59, 57, // 90'C ~ 99'C
 55, 53, 50, 47, 44, 42, 41, 41, 41, 41, //100'C ~109'C
 41, 40, 39, 38, 36, 35, 34, 33, 32, 32, //110'C ~119'C
 31 };
*/

volatile unsigned int uiCnt;
char cBuf[5= {0, };
char cFlag = 0;

void TC1_Init()
{
  /*  레지스터 설정 */

  // 16 BIT Timer/Counter //

  TCCR1A   = 0X00;//0B 0000 0000 -> NORMAL MODE, NO PWM MODE
  TCCR1B   = 0X83;//0B 1000 0011 -> FALLING EDGE, NORMAL MODE, 64 분주
  TCCR1C  = 0X00;//0B 0000 0000 -> BLOCK COMPARE MODE
  TCNT1H  = 0X00;//0B 0000 0000 -> START FROM 0
  TCNT1L  = 0X00;//0B 0000 0000 -> START FROM 0
  TIMSK1   = 0X01;//0B 0000 0001 -> OVERFLOW REGISTER ENABLE
  TIFR1  = 0X00;//0B 0000 0000 ->BIT CLEAR, FLACK BIT CLEAR
  SREG   |=0X80;//0B 1000 0000 -> GLOBAL INTERRUPT ENABLE
  

  TCNT1H = TCNT1L >> 8;
  SREG   |=0X80;// 0B 1000 0000 -> GLOBAL INTERRUPT ENABLE
}  


void ADC_Init()
{
  ADCSRA = 0x00;     // init
  ADCSRA = 0x85;     // Enable adc, 분주비 32
  ADCSRB = 0x00;    // free running mode
  ADMUX  = 0x40;     // select adc input 0
}

void MTW()
{
  char cBuffer[20]={0, };
  char cCS[3= {0, };
  int iCnt;
  char ucCS;

  cBuffer[0= '$';
  cBuffer[1= 'J';
  cBuffer[2= 'H';
  cBuffer[3= 'M';
  cBuffer[4= 'T';
  cBuffer[5= 'W';
  cBuffer[6= ',';
  cBuffer[7= '0';
  cBuffer[8= cBuf[0];
  cBuffer[9= cBuf[1];
  cBuffer[10= cBuf[2];
  cBuffer[11= cBuf[3];
  cBuffer[12= ',';
  cBuffer[13= 'C';
  cBuffer[14= '*';
  

  //checksum - from $ to * XOR
  for(iCnt = 1; iCnt < 14; ++iCnt)
  {
    ucCS ^= cBuffer[iCnt];
  }

  itoa(ucCS, cCS, 16);



  cBuffer[15= cCS[0];   
  cBuffer[16= cCS[1];     

  /*itoa( (ucCS & 0xF0), cBuffer[15], 16); 
  itoa( (ucCS & 0x0F), cBuffer[16], 16);*/


  
  cBuffer[17= 10;   
  cBuffer[18= 13;
  ucCS = 0;
  USART_PRINT(cBuffer);
}

int main(void)
{
  unsigned int uiSum=0;
  int iCnt;
  int uiTemp=0;  
  unsigned char i;
  double steinhart, Res, Temp;

  LCD_Init();
  ADC_Init();
  TC1_Init();
  USART0_INIT();


  LCD_Print("  Current Temp.");
  LCD_INST(0x0C);
  LCD_INST(0x40);
  LCD_Symbol();



  while(1)
  {  
    uiSum = 0;    
    ADCSRA = 0xD5;
    while((ADCSRA & 0x10) != 0x10);
    for(i=0; i<100; ++i)
    {
      ADCSRA = 0xD5;
      while((ADCSRA & 0x10) != 0x10);
      uiSum += (  (int)ADCL + ((int)ADCH<<8) ) ;
    }
    uiSum /= 100;  // uiSum = uiSum / 100, 아날로그 신호의 평균값을 내준다.
    Res = fCalcNtc(uiSum);      // calculate temperature from resistorvalue 
    Temp = fCalcTemp(Res);      // calculate temperature from resistorvalue
    Temp = Temp * 10;
    itoa(Temp, cBuf, 10);
    cBuf[3= cBuf[2]; 

    cBuf[2= '.';

    
    
    

    LCD_INST(0xC5);    
    LCD_Print(cBuf);
    LCD_Data(0x00);
    LCD_Data('C');
    _delay_ms(1000);
  }

  return 0;
}

void __vector_20(void)
{
  
  cFlag ^= 0x01;   
  
  if(cFlag == 0)  
    MTW();
      
    
}

C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace _20150904
{
    public partial class Form1 : Form
    {
        int iCnt = 0;
        public Form1()
        {
            InitializeComponent();
            bt_OFF.Enabled = false;
            string[] port_arr = SerialPort.GetPortNames();
            foreach (string portno in port_arr)
            {
                cb_PORT.Items.Add(portno);
            }                      
        }


        private void cb_PORT_SelectedIndexChanged(object sender, EventArgs e)
        {            
            serialPort1.PortName = cb_PORT.Text;
            serialPort1.BaudRate = 4800;
            serialPort1.Parity = 0;            
            serialPort1.DataBits = 8;            
            
        }

        private void bt_ON_Click(object sender, EventArgs e)
        {
            serialPort1.Open();
            serialPort1.Write(tb_Log.Text);
            bt_ON.Enabled = false;
            bt_OFF.Enabled = true;
        }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try { 
                string sText = tb_Log.Text = serialPort1.ReadLine();
                if(iCnt != 0)
                { 
                    string sCel = sText.Substring(94);
                    tb_C.Text = sCel;
                    var iF = Convert.ToDouble(sCel);

            
                    double dF = (iF * 1.8 + 32);
                    string sF = null;
                    sF = Convert.ToString(dF);

                    tb_F.Text = sF;
                }
                ++iCnt;
            }
            catch 
            {
                MessageBox.Show("Port Closed""Notice", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            
        }
        private void bt_OFF_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            bt_ON.Enabled = true;
            bt_OFF.Enabled = false;
        }
   
        
    }

}


반응형

'Busan IT > 센서 제어' 카테고리의 다른 글

자동차 후진 경고 센서  (0) 2015.09.14
온도계 섭씨 화씨 변경, 초음파의 특성  (0) 2015.09.10
NTC 온도계 저항값 변환  (0) 2015.09.04
NTC 센서를 활용한 온도계  (0) 2015.09.02
NTC 온도 센서  (0) 2015.09.01
Posted by newind2000
Busan IT/센서 제어2015. 9. 4. 08:57

==================================Outline====================================

NTC 온도계 저항값 변환

----------------------------------------------------------------------------

 

NTC의 저항 값을 온도로 변환시키는 공식에 대해서 알아보자.

 

우선 저항 값을 구하는 공식이다.

 

<<1>>

float fCalcNtc(short wADCVal) // from ADC
{
    float fRntc;
    fRntc = 10000 * (float) wADCVal / ( 1023.0 - (float) wADCVal); // 10000 = pullup resistor
    return(fRntc);
}

<<2>>

float fCalcNtc(int wADCVal) // from ADC
{

    double fRntc;
    fRntc = ((SERIESRESISTOR * ( 1023.0 - (float) wADCVal) /(float) wADCVal)); // SERIESRESISTOR = pullup resi    stor
    return(fRntc);

}

 

회로구성에 따라 NTCGND로 들어가는 경우는 <<1>>, NTC의 회로가 MCU에 직접적으로 들어가는 구성은 <<2>>이다.

 

저항 값이 나오면 이 값을 Steinhart-Hart equation에 넣어서 값을 구하면 된다.

float fCalcTemp( float fRntc)
{

    float fTemp;
    fTemp = (1.0 / ( (log(fRntc/THERMISTORNOMINAL))/BCOEFFICIENT + 1.0/298.0)) - 273.0//log = ln

    return( fTemp);
}

이것을 활용하여 온도 값을 통신으로 넘겨주는 프로그래밍을 해보자.


//'--'DC(Don't care) 영역

통신으로 받은 값은 UI를 활용하여 표시해 주어야 한다.

무조건 아스키코드로 전송된다.







 

 

 

 

 

 

반응형

'Busan IT > 센서 제어' 카테고리의 다른 글

자동차 후진 경고 센서  (0) 2015.09.14
온도계 섭씨 화씨 변경, 초음파의 특성  (0) 2015.09.10
C#을 활용한 NTC 온도 센서  (0) 2015.09.04
NTC 센서를 활용한 온도계  (0) 2015.09.02
NTC 온도 센서  (0) 2015.09.01
Posted by newind2000
Busan IT/센서 제어2015. 9. 2. 17:41

==================================Outline====================================

NTC 센서를 활용한 온도계

----------------------------------------------------------------------------

 





 


NTC(Negative Temperature Coefficient)에서 주변 온도에 따라 반환하는 저항 값을 실제 온도 값으로 고치기 위해서는 계산식이 필요하다.

 

선형식을 대입할 수 있으나 구간에 따라 비례식이 달라지기 때문에 정확한 값을 구하고자하면 SteinhartHart equation을 적용시켜야 한다.

 

//절대온도(k)에서 섭씨(c)로 변환하고자 할 때, c = k -273.15를 적용하면 된다.

//자연로그는 밑수를 e(2.718282)로 한다.

//C에서 <math.h> 헤더파일을 사용하면 'log'함수와 'exp'함수를 사용할 수 있다.

 

저항 값을 온도 값으로 변환해주기 전에 사용자의 편의를 위해 특수문자를 CGROM에 저장하여 온도 값(c)을 표시해주자.

 

 

 

아날로그 온도 센서로는 Thermistor, Pt 100, TC가 있다. Pt 100옴은 산업용으로 쓰인다.

//pt는 백금(platinum)의 원소기호이다.



반응형

'Busan IT > 센서 제어' 카테고리의 다른 글

자동차 후진 경고 센서  (0) 2015.09.14
온도계 섭씨 화씨 변경, 초음파의 특성  (0) 2015.09.10
C#을 활용한 NTC 온도 센서  (0) 2015.09.04
NTC 온도계 저항값 변환  (0) 2015.09.04
NTC 온도 센서  (0) 2015.09.01
Posted by newind2000
Busan IT/센서 제어2015. 9. 1. 17:37

==================================Outline====================================

NTC 온도 센서

 ----------------------------------------------------------------------------

 

서브모터는 주로 기동기계의 속도를 표시해주는데 사용된다.

 

센서는 생물체에 비유하자면 감각기관과 같은 것이다.

 

LM35, NTC(thermistor)는 많이 쓰이는 센서 중에 하나이다.

 

 

//절대온도(k) = C + 273

//표준온도 = 0C

//상온 = 섭시 25C

 

센서는 감지한 아날로그 값을 ADC를 거쳐 디지털로 프로세서에 전송하게 된다.

ADC는 주변 환경의 간섭을 많이 받게 된다. 때문에 감지 값을 통신신호(UART, TWI, SPI)로 변환하여 전송하는 방법도 있다.

 

//SPIAVRstudio에서 ATmega로 데이터를 전송할 때 사용된다.

//SPI stands for Serial Peripheral Interface Bus

SPI는 동기화 방식이며 Master에서 Slave쪽으로 클럭 신호를 기준으로 데이터를 전송하게 된다.

 

//MOSI(Master Out Slave In), MISO(Master In, Slave Out), /RESET, VCC, GND

 

센서시간에 온도센서, 초음파 센서, 일산화탄소 감지센서를 사용한 코딩을 해보겠다.

 

SPI통신은 4가닥의 선으로 구성된다. CLK, MISO, MOSI, CS.

 

CS는 슬레이브가 2개일 경우 경로를 지정해주는 역할을 한다. 슬레이브의 수가 늘어날 경우 CS선의 개수도 슬레이브의 객체 수를 2진수로 표현할 수 있는 선의 개수만큼 늘어나야 한다.

 

USARTSPI의 차이점 - USART1:1 통신, SPI1:통신

 

NTC 온도 센서

 

온도가 높으면 저항이 낮아진다. 이를 활용하여 온도계를 만들어보자.

 

ATmega2560ADC기능을 사용하여 thermistor로 받은 값을 LCD에 출력해주자.





#include "LCD.h"
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>


/*const unsigned int ad_table[] = {
991,989,987,985,983,980,978,975,973,970, //-40'C ~-31'C
966,963,960,957,953,949,945,941,937,932, //-30'C ~-21'C
927,922,918,912,907,900,895,889,882,875, //-20'C ~-11'C
868,861,854,847,839,830,822,814,806,796, //-10'C ~ -1'C

786,778,769,759,749,737,728,718,707,696, //  0'C ~  9'C
684,674,663,652,640,627,617,606,595,582, // 10'C ~ 19'C
569,559,548,536,524,511,501,490,478,466, // 20'C ~ 29'C
454,444,434,423,411,400,390,381,370,360, // 30'C ~ 39'C
349,341,332,322,313,303,295,287,279,270, // 40'C ~ 49'C
262,254,247,240,232,225,219,212,206,199, // 50'C ~ 59'C
193,187,182,176,170,165,160,155,151,146, // 60'C ~ 69'C
141,137,133,129,124,120,117,113,110,106, // 70'C ~ 79'C
103,100, 97, 94, 91, 88, 85, 83, 80, 78, // 80'C ~ 89'C
 75, 73, 71, 69, 66, 64, 62, 61, 59, 57, // 90'C ~ 99'C
 55, 53, 50, 47, 44, 42, 41, 41, 41, 41, //100'C ~109'C
 41, 40, 39, 38, 36, 35, 34, 33, 32, 32, //110'C ~119'C
 31 };
*/

volatile unsigned int uiCnt;

void ADC_Init()
{
  ADCSRA = 0x85;     // Enable adc, 분주비 32
  ADCSRB = 0x00;    // free running mode
  ADMUX  = 0x40;     // select adc input 0
}


int main(void)
{
  unsigned int uiSum=0;
  int iCnt;
  LCD_Init();
  ADC_Init();
  char cBuf[10];
  int uiTemp=0;
  int i;

  LCD_Print("  Current Temp.");


  while(1)
  {
  
    uiSum = 0;    
    _delay_ms(2000);
    ADCSRA = 0xD5;
    while((ADCSRA & 0x10) != 0x10);
    for(i=0; i<16; ++i)
    {
      ADCSRA = 0xD5;
      while((ADCSRA & 0x10) != 0x10);
      uiSum += (  (int)ADCL + ((int)ADCH<<8) ) ;
    }
    uiSum >>= 4;  // sum = sum / 16, 아날로그 신호의 평균값을 내준다.
    
    uiSum = (uiSum/6.4) - 55;
    
    


    itoa(uiSum, cBuf, 10);

    LCD_INST(0xC0);
    LCD_Print("      ");
    LCD_Print(cBuf);
    LCD_Data('C');
    _delay_ms(2000);

  }

  return 0;
}



 

 

반응형
Posted by newind2000