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