센서 > DTS-L300-V2 (SPI - GPIO)

TODAY1,681 TOTAL2,426,068
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 센서 | 비접촉온도센서 | DTS-L300-V2 (SPI - GPIO)

페이지 정보

작성자 키트 작성일2017-08-29 15:42 조회2,306회 댓글0건

첨부파일

본문

​ 

회원님께서 비접촉 온도센서를 보내주셔서 예제를 올립니다.^^

SPI 통신인데 GPIO로 온도를 읽어보겠습니다.

//

데이터시트 첨부 파일에 올려둡니다.

//

2093095301_dDTJ7OSR_25C725C925BF25AC25B025E1.PNG3Ftype3Dw740

 

3.3V로 구동 해야하며

센서 출력인 MISO 신호만 빼고 나머지 신호는 저항을 사용해서 3.3V로 레벨을 낮춰줬습니다.

//

2093095301_w31ftMGZ_25C725C125B725CE25C525E425C425DD1.PNG3Ftype3Dw740
 

AVR에서 0xA0를 보내고 타겟온도 두바이트를 센서로 부터 읽습니다.

AVR에서 0xA1를 보내고 주변온도 두바이트를 센서로 부터 읽습니다.

두바이트는 하위바이트가 먼저 나오고 상위 바이트가 나중에 나옵니다.

10 ms 딜레이와 50ms 딜레이가 있는 것에 주의하세요

 


2093095301_WHkJoCRq_25C725C125B725CE25C525E425C425DD2.PNG3Ftype3Dw740

 

데이터 읽기 쓰기는 MSB(비트7) 부터 LSB(비트0) 순으로 처리합니다.

//

//DTS-L300-V2 GPIO interface
//------------------------------------------------------
#pragma opt-
//------------------------------------------------------
#include
#include
#include
//
#define U_C  unsigned char
#define U_I  unsigned int
#define U_L  unsigned long
//==============================================================================================
#define SS   PORTB.0
#define SCK  PORTB.1
#define MOSI PORTB.2
#define MISO PINB.3

#define ss_delay delay_us(15)
#define ck_delay delay_us(5)
//==============================================================================================
void SPI_WR(U_C d){
    U_C i;
    SS=0; ss_delay;
    for(i=0;i<8;i++){
        if(d&(0x80>>i))MOSI=1; else MOSI=0;
        SCK=0; ck_delay; SCK=1; ck_delay;
    }
    SS=1;
    delay_ms(10);
}
int SPI_RD(void){
    U_C i;
    int tp=0;
    SS=0; ss_delay;
    for(i=0;i<8;i++){
        SCK=0; ck_delay;
        if(MISO)tp|=0x80>>i;
        SCK=1; ck_delay;
    }
    SS=1;
    delay_ms(10);
    return tp;
}
//==============================================================================================
void TX1_CH(U_C ch){ while(!(UCSR1A&0x20)); UDR1=ch;     } // 송신 1바이트
void TX1_STR(U_C *str){ while(*str)TX1_CH(*str++); }  // 문자열 송신함수
//==============================================================================================
void main(void){
    char str[50];
    int Target, Ambient;
    float f_t,f_a;
    PORTB=3; DDRB=7; // SS & SCK 초기값 high
    UCSR1B=8; UBRR1L=103;
    while(1){
        SPI_WR(0xA0);
        Target=SPI_RD();  //low
        Target|=SPI_RD()<<8;  //high
        f_t=(float)Target;
        f_t/=100.0;
        delay_ms(50);
        //
        SPI_WR(0xA1);
        Ambient=SPI_RD();  //low
        Ambient|=SPI_RD()<<8;  //high
        f_a=(float)Ambient;
        f_a/=100.0;
        delay_ms(500);
        //sprintf(str,"Target=%6d, Ambient=%6d  \r",Target,Ambient);
        sprintf(str,"Target=%7.2f, Ambient=%7.2f  \r",f_t,f_a);
        TX1_STR(str);
    }
}

//

2093095301_9GS4HcT0_25C125A625B825F1_25BE25F825C025BD.PNG3Ftype3Dw740

//

#define ss_delay delay_us(15)

SS 신호를 low로 만들고서 10us를 주었는데 가끔 온도를 제대로 읽지 못하는 경우가 생겨서 15로 바꿨습니다.
#define ck_delay delay_us(5)
클럭 주기가 1us로 되어있지만 10us 정도는 되어야지 엉터리 온도가 나타나지 않습니다.

//

이 센서 경우 위에 언급한 딜레이 때문에 전용 SPI포트로 읽을 필요가 없을 것 같습니다.

SPI 전용포트로 읽는 것은 다음에 다른 IC로 예제를 만들어 드리겠습니다.^^

댓글 0

조회수 2,306

등록된 댓글이 없습니다.

센서HOME > 센서 > 비접촉온도센서 목록

게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기