BASIC4MCU | 센서 | 비접촉온도센서 | DTS-L300-V2 (SPI - GPIO)
페이지 정보
작성자 키트 작성일2017-08-29 15:42 조회3,118회 댓글0건첨부파일
본문
회원님께서 비접촉 온도센서를 보내주셔서 예제를 올립니다.^^
SPI 통신인데 GPIO로 온도를 읽어보겠습니다.
//
데이터시트 첨부 파일에 올려둡니다.
//
3.3V로 구동 해야하며
센서 출력인 MISO 신호만 빼고 나머지 신호는 저항을 사용해서 3.3V로 레벨을 낮춰줬습니다.
//
AVR에서 0xA0를 보내고 타겟온도 두바이트를 센서로 부터 읽습니다.
AVR에서 0xA1를 보내고 주변온도 두바이트를 센서로 부터 읽습니다.
두바이트는 하위바이트가 먼저 나오고 상위 바이트가 나중에 나옵니다.
10 ms 딜레이와 50ms 딜레이가 있는 것에 주의하세요
데이터 읽기 쓰기는 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);
}
}//
//
#define ss_delay delay_us(15)
SS 신호를 low로 만들고서 10us를 주었는데 가끔 온도를 제대로 읽지 못하는 경우가 생겨서 15로 바꿨습니다.
#define ck_delay delay_us(5)
클럭 주기가 1us로 되어있지만 10us 정도는 되어야지 엉터리 온도가 나타나지 않습니다.//
이 센서 경우 위에 언급한 딜레이 때문에 전용 SPI포트로 읽을 필요가 없을 것 같습니다.
SPI 전용포트로 읽는 것은 다음에 다른 IC로 예제를 만들어 드리겠습니다.^^
댓글 0
조회수 3,118등록된 댓글이 없습니다.