온도 센서 기술

STM32 용 DS18B20 디지털 온도 센서 설계

DS18B20 온도 감지 와이어 스테인리스 스틸 프로브 키트

DS18B20은 단일 버스 타이밍을 사용하여 호스트와 통신하는 디지털 온도 센서입니다.. 오직 1 온도 데이터 판독 값을 완료하려면 와이어가 필요합니다;

DS18B20은 쉽게 식별 할 수 있도록 64 비트 제품 일련 번호가 내장되어 있습니다.. 다중 DS18B20 센서를 연결할 수 있습니다 1 철사, 그리고 64 비트 ID 인증을 통해, 다른 센서에서 수집 한 온도 정보는 별도로 읽을 수 있습니다..

DS18B20 온도 감지 와이어 스테인리스 스틸 프로브 키트

DS18B20 온도 감지 와이어 스테인리스 스틸 프로브 키트

DS18B20 온도 센서 프로브 TPE 오버 몰딩 키트

DS18B20 온도 센서 프로브 TPE 오버 몰딩 키트

1 와이어 DS18B20 온도 센서

1 와이어 DS18B20 온도 센서

DS18B20 소개
2.1 DS18B20의 주요 특징
1. 완전 디지털 온도 변환 및 출력.
2. 고급 단일 버스 데이터 통신.
3. 최대 12 비트 해상도, 섭씨 최대 ± 0.5 도의 정확도로.
4. 12 비트 해상도에서 최대 작업주기는 다음과 같습니다 750 밀리 초.
5. 기생 작업 모드를 선택할 수 있습니다.
6. 검출 온도 범위는 –55 ° C ~+125 ° C입니다 (–67 ° F ~+257 ° F).
7. 내장 EEPROM, 온도 제한 경보 기능.
8. 64-비트 포토 리소그래피 롬, 내장 제품 일련 번호, 멀티 머신 연결에 편리합니다.
9. 다양한 포장 양식, 다른 하드웨어 시스템에 적응하십시오.

DS18B20 칩 패키지 구조

DS18B20 칩 패키지 구조

2.2 DS18B20 핀 기능
GND 전압 접지;
DQ 싱글 데이터 버스;
VDD 전원 공급 장치 전압;
NC 빈 핀;

DS18B20 칩 RAM 및 EEPROM 구조 다이어그램

DS18B20 칩 RAM 및 EEPROM 구조 다이어그램

2.3 DS18B20 작업 원칙 및 응용 프로그램
DS18B20 온도 감지 및 디지털 데이터 출력은 하나의 칩에 완전히 통합됩니다., 따라서 반 간 회의 능력이 더 강합니다. 하나의 작업주기는 두 부분으로 나눌 수 있습니다., 즉 온도 감지 및 데이터 처리.

18B20에는 세 가지 형태의 메모리 자원이 있습니다. 그들은: ROM 읽기 전용 메모리, DS18B20ID 코드를 저장하는 데 사용됩니다; 첫 번째 8 비트는 단일 라인 시리즈 코드입니다 (DS18B20 코드는 19H입니다), 다음 48 비트는 칩의 고유 일련 번호입니다; 마지막 8 비트는 CRC 코드입니다 (중복 점검) 위의 56 비트. 데이터는 생산시 설정되며 사용자가 변경할 수 없습니다.. DS18B20은 총입니다 64 ROM의 비트.

RAM 데이터 레지스터, 내부 계산 및 데이터 액세스에 사용됩니다, 정전 후 데이터가 손실됩니다, DS18B20은 총입니다 9 RAM의 바이트, 각 바이트는입니다 8 비트. 첫 번째 및 두 번째 바이트는 온도 변환 후 데이터 값 정보입니다.; 세 번째와 네 번째 바이트는 사용자의 eeprom의 거울 이미지입니다. (온도 경보 값 저장에 일반적으로 사용됩니다). 전원이 재설정되면 그 값이 새로 고침됩니다.. 다섯 번째 바이트는 사용자의 세 번째 eeprom의 거울 이미지입니다.. 6 일, 7th, 8 번째 바이트는 카운트 레지스터입니다, 사용자가 더 높은 온도 해상도를 얻을 수 있도록 설계되었습니다.. 또한 내부 온도 변환 및 계산을위한 임시 저장 장치입니다.. 9 번째 바이트는 첫 번째 CRC 코드입니다. 8 바이트. EEPROM은 오랫동안 저장 해야하는 데이터를 저장하는 데 사용되는 비 휘발성 메모리입니다., 상한 및 하위 온도 경보 값, 검증 데이터. DS18B20은 총입니다 3 eeprom의 비트, RAM에는 사용자 작동을 용이하게하는 미러 이미지가 있습니다..

DS18B20은 기본적으로 12 비트 해상도 모드에서 작동합니다. 변환 후 얻은 12 비트 데이터는 DS18B20의 8 비트 램에 저장됩니다. (처음 두 바이트). 첫 번째 5 이진의 비트는 부호입니다. 측정된 온도가 그 이상인 경우 0, 이것들 5 비트는 0. 측정된 값에 곱하기만 하면 됩니다. 0.0625 실제 온도를 얻으려면. 온도가 이하인 경우 0, 이것들 5 비트는 1. 측정 된 값은 반전되어야합니다, 추가 1, 그리고 나서 0.0625 실제 온도를 얻으려면. 또는 비트 작동을 사용하여 온도를 추출하십시오: 소수점 자리는 낮은 곳을 차지합니다 4 비트, 그리고 상단 비트는 정수 비트입니다 (음수는 고려되지 않습니다).

2.4 DS18B20 칩 ROM 명령 테이블
1. ROM을 읽으십시오 [33시간] (16 진 명령 단어는 정사각형 괄호 안에 있습니다).
이 명령은 버스 컨트롤러가 DS18B20의 64 비트 ROM을 읽을 수 있습니다.. 이 명령어는 버스에 DS18B20이 하나만있을 때만 사용할 수 있습니다.. 둘 이상이 연결되어있는 경우, 의사 소통 중에 데이터 충돌이 발생합니다.

2. Atch rom [55시간]
이 명령어는 컨트롤러가 발행 한 64 비트 일련 번호가 이어집니다.. 버스에 여러 DS18B20이있을 때, 컨트롤러가 발행 한 것과 동일한 일련 번호가있는 칩 만 응답 할 수 있습니다., 다른 칩은 다음 리셋을 기다립니다.. 이 명령어는 단일 칩 및 멀티 칩 연결에 적합합니다.

3. 배 [CCH]
이 명령어는 칩이 ROM 코드에 응답하지 않습니다.. 단일 버스의 경우, 이 명령어는 시간을 절약하는 데 사용될 수 있습니다. 이 명령어가 여러 칩이 연결될 때 사용되는 경우, 데이터 충돌이 발생합니다, 오류가 발생합니다.

4. ROM 검색 [f0h]
칩이 초기화 된 후, 검색 명령어를 통해 여러 칩이 버스에 연결될 때 모든 장치의 64 비트 ROM을 제거하여 식별 할 수 있습니다..

5. 알람 검색 [나]
여러 칩의 경우, 알람 칩 검색 명령어는 TL보다 높은 온도의 경보 상태를 충족하는 칩에만 응답합니다.. 칩이 꺼지지 않는 한, 경보 상태는 온도가 다시 측정되고 경보 조건에 도달하지 않을 때까지 유지됩니다..

6. 스크래치 패드를 작성하십시오 [4뭐라고]
이것은 RAM에 데이터를 작성하라는 지시입니다. 이후에 작성된 두 바이트의 데이터는 주소에 저장됩니다. 2 (알람 램) 그리고 주소 3 (알람 램의 TL). 쓰기 프로세스는 재설정 신호로 종료 될 수 있습니다..

7. 스크래치 패드를 읽습니다 (RAM의 데이터를 읽으십시오) [대통령]
이 명령어는 RAM의 데이터를 읽습니다, 주소에서 시작합니다 0 그리고 주소를 다루고 있습니다 9, 전체 RAM 데이터의 읽기 완료. 칩은 재설정 신호가 읽기 과정을 종료 할 수 있도록합니다., 그건, 후속 불필요한 바이트는 읽기 시간을 줄이기 위해 무시할 수 있습니다..

8. 스크래치 패드를 복사하십시오 (RAM 데이터를 EEPROM에 복사하십시오) [48시간]
이 명령어는 RAM의 데이터를 EEPROM에 저장하여 전원이 꺼질 때 데이터가 손실되지 않도록합니다.. 칩은 EEPROM 스토리지 처리로 바쁘기 때문에, 컨트롤러가 읽기 시간 슬롯을 보낼 때, 버스 출력 “0”, 스토리지 작업이 완료되면, 버스가 출력됩니다 “1”.
기생 작업 모드에서, 이 명령어가 발행되고 칩 작동을 유지하기 위해 최소 10ms에 대해 강력한 풀업을 사용해야합니다..

9. T. (온도 변환) [44시간]
이 지침을받은 후, 칩은 온도 변환을 수행하고 RAM의 첫 번째 및 2 차 주소에 변환 된 온도 값을 저장합니다.. 칩은 온도 변환 처리로 바쁘기 때문에, 컨트롤러가 읽기 시간 슬롯을 보낼 때, 버스 출력 “0”, 스토리지 작업이 완료되면, 버스가 출력됩니다 “1”. 기생 작업 모드에서, 이 명령어가 발행 된 직후에 강력한 풀업을 사용해야합니다..

10. eeprom을 기억하십시오 (EEPROM의 알람 값을 RAM에 복사하십시오) [B8H]
이 명령어는 EEPROM의 알람 값을 RAM의 3 번째 및 4 번째 바이트로 복사합니다.. 칩은 복사 처리로 바쁘기 때문에, 컨트롤러가 읽기 시간 슬롯을 보낼 때, 버스 출력 “0”, 스토리지 작업이 완료되면, 버스 출력 “1”. 게다가, 이 명령어는 칩에 전원이 켜지고 재설정되면 자동으로 실행됩니다.. 이런 식으로, RAM의 두 알람 바이트 비트는 항상 EEPROM의 데이터의 미러 이미지입니다..

11. 전원 공급 장치를 읽으십시오 (작업 모드 스위치) [B4H]
이 명령이 발행 된 후, 읽기 시간 간격이 발행됩니다, 칩은 전원 상태 단어를 반환합니다. “0” 기생성 전력 상태입니다 “1” 외부 전력 상태입니다.

2.5 DS18B20 타이밍 다이어그램
2.5.1 DS18B20 재설정 및 응답 관계 다이어그램
각 통신 전에 재설정을 수행해야합니다. 재설정 시간, 대기 시간, 응답 시간은 타이밍에 따라 엄격하게 프로그래밍해야합니다..
DS18B20 읽기 및 쓰기 시간 간격: DS18B20 데이터 읽기 및 쓰기는 시간 간격 처리 비트 및 교환 정보에 대한 명령으로 확인됩니다..

DS18B20 재설정 및 응답 관계 다이어그램

DS18B20 재설정 및 응답 관계 다이어그램

2.5.2 데이터 작성 0 그리고 데이터 1 DS18B20
쓰기 데이터 시간 간격의 첫 15US에서, 컨트롤러가 버스를 낮추어야합니다., 그런 다음 버스 데이터의 칩 샘플링 시간이 될 것입니다.. 샘플링 시간은 15 ~ 60us입니다. 샘플링 시간 동안 컨트롤러가 버스를 높이 끌어 올리는 경우, 그것은 글쓰기를 의미합니다 “1”, 컨트롤러가 버스를 낮추는 경우, 그것은 글쓰기를 의미합니다 “0”.
각 변속기의 각 변속기는 최소 15US 이상의 낮은 수준의 시작 비트를 가져야합니다., 그리고 후속 데이터 “0” 또는 “1” 45US 이내에 완료해야합니다.
전체 비트의 전송 시간은 60 ~ 120us로 유지해야합니다., 그렇지 않으면 정상적인 의사 소통을 보장 할 수 없습니다.
메모: DS18B20은 낮은 비트에서 데이터를 읽고 씁니다.

데이터 작성 0 그리고 데이터 1 DS18B20

데이터 작성 0 그리고 데이터 1 DS18B20

2.5.3 읽기 데이터 0 그리고 데이터 1 DS18B20에서
읽기 시간 간격 동안 제어의 샘플링 시간이 더 정확해야합니다.. 읽기 시간 간격 동안, 호스트는 또한 읽기 시간의 시작을 나타 내기 위해 최소 1US의 낮은 레벨을 생성해야합니다.. 그 다음에, 버스가 풀린 후 15US에서, DS18B20은 내부 데이터 비트를 보냅니다. 이때, 컨트롤이 버스가 높다는 것을 알게 된 경우, 그것은 독서를 의미합니다 “1”, 그리고 버스가 낮다면, 그것은 데이터를 읽는 것을 의미합니다 “0”. 각 비트를 읽기 전에, 컨트롤러는 시작 신호를 추가합니다.

데이터를 읽습니다 0 그리고 데이터 1 DS18B20에서

데이터를 읽습니다 0 그리고 데이터 1 DS18B20에서

메모: 데이터 비트는 올바른 통신을 보장하기 위해 읽기 간격 시작 후 15US 이내에 읽어야합니다..

의사 소통 중, 8 비트 “0” 또는 “1” 바이트로 사용됩니다, 바이트의 읽기 또는 쓰기는 낮은 비트에서 시작됩니다..

2.5.4 한 번 읽기 온도의 순서 (버스에 단일 DS18B20 만)

1. 재설정 신호를 보냅니다
2. 응답 신호를 감지합니다
3. 0xcc를 보내십시오
4. 0x44를 보내십시오
5. 재설정 신호를 보냅니다
6. 응답 신호를 감지합니다
7. 0xcc를 작성하십시오
8. 0xbe를 작성하십시오
9. 고리 8 온도의 낮은 바이트를 읽는 시간
10. 고리 8 온도의 높은 바이트를 읽는 시간
11. 16 비트 온도 데이터 및 프로세스를 합성합니다

3. 드라이버 코드

3.1 DS18B20.C
#포함하다 “DS18B20.H”
/*
기능: DS18B20 초기화
하드웨어 연결: PB15
*/
void ds18b20_init(무효의)
{
rcc->APB2ENR|= 1<<3; //PB
gpiob->CRH&= 0x0ffffff;
gpiob->CRH|= 0x30000000;
gpiob->ODR|= 1<<15; //풀업
}

/*
기능: DS18B20 장치가 있는지 확인하십시오
반환 값: 1 장치가 존재하지 않음을 의미합니다 0 장치가 정상임을 의미합니다
*/
U8 DS18B20_CHECKDEVICE(무효의) //재설정 펄스가 포함되어 있습니다, 감지 펄스
{
DS18B20_OUTPUT_MODE();//출력 모드로 초기화하십시오
DS18B20_OUT = 0; //재설정 펄스를 생성합니다
Delayus(750); //750us 낮은 레벨을 생성하십시오
DS18B20_OUT = 1; //릴리스 버스
Delayus(15); //DS18B20 응답을 기다리십시오
만약에(DS18B20_CRECKACK())//존재 펄스를 감지하십시오
{
반품 1;
}
반품 0;
}

/*
기능: DS18B20 장치의 존재 펄스 감지
반환 값: 1 오류를 나타냅니다 0 정상을 나타냅니다
*/
U8 DS18B20_CRECKACK(무효의)
{
U8 CNT = 0;
DS18B20_INPUT_MODE();//입력 모드로 초기화하십시오
~하는 동안(DS18B20_IN&&CNT<200) //DS18B20 응답 존재 펄스를 기다리십시오
{
Delayus(1);
CNT ++;
}
만약에(CNT>= 200)반품 1; //오류

CNT = 0;
~하는 동안((!DS18B20_IN)&&CNT<240) //DS18B20이 버스를 석방 할 때까지 기다리십시오
{
Delayus(1);
CNT ++;
}
만약에(CNT>= 240)반품 1; //오류
반품 0;
}

/*
기능: 바이트를 작성하십시오
먼저 조금 쓰는 방법을 배우십시오.
*/
void ds18b20_writebyte(U8 CMD)
{
U8 i;
DS18B20_OUTPUT_MODE(); //출력 모드로 초기화하십시오
~을 위한(i = 0;나<8;i ++)
{
DS18B20_OUT = 0; //쓰기 시간 간격을 생성합니다 (시작을 작성하십시오)
Delayus(2);
DS18B20_OUT = CMD&0x01; //실제 데이터 비트를 보냅니다
Delayus(60); //쓰기 완료를 기다리십시오
DS18B20_OUT = 1; //버스를 풀고 다음 변속기를 준비하십시오
CMD>>= 1; //다음 비트의 데이터를 계속 보냅니다
}
}

/*
기능: 바이트를 읽으십시오
먼저 조금 읽는 방법을 배우십시오.
*/
U8 DS18B20_READBYTE(무효의)
{
U8 i,데이터 = 0;
~을 위한(i = 0;나<8;i ++)
{
DS18B20_OUTPUT_MODE(); //출력 모드로 초기화하십시오
DS18B20_OUT = 0; //읽기 시간 간격을 생성합니다 (시작을 읽으십시오)
Delayus(2);
DS18B20_OUT = 1; //릴리스 버스
DS18B20_INPUT_MODE(); //입력 모드로 초기화하십시오
Delayus(8); //DS18B20 데이터 출력을 기다리십시오
데이터>>= 1; //높은 비트로 채우십시오 0, 기본값입니다 0
만약에(DS18B20_IN) 데이터|= 0x80;
Delayus(60);
DS18B20_OUT = 1; //릴리스 버스, 다음 데이터를 읽을 때까지 기다리십시오
}
반환 데이터;
}

/*
기능: DS18B20의 온도 데이터를 한 번 읽으십시오
반환 값: 온도 데이터가 읽습니다
상황을 고려합니다: 버스에 연결된 DS18B20은 하나뿐입니다
*/
U16 DS18B20_READTEMP(무효의)
{
u16 temp=0;
u8 temp_H,temp_L;
DS18B20_CheckDevice(); //Send reset pulse, detect pulse
DS18B20_WriteByte(0xCC); //Skip ROM sequence detection
DS18B20_WriteByte(0x44); //Start a temperature conversion

//Wait for temperature conversion to complete
~하는 동안(DS18B20_ReadByte()!=0xFF){}

DS18B20_CheckDevice(); //Send reset pulse, detect pulse
DS18B20_WriteByte(0xCC); //Skip ROM sequence detection
DS18B20_WriteByte(0xBE); //Read temperature

temp_L=DS18B20_ReadByte(); //Read low temperature data
temp_H=DS18B20_ReadByte(); //Read high temperature data
temp=temp_L|(temp_H<<8); //Synthesized temperature
return temp;
}

3.2 DS18B20.h

#ifndef DS18B20_H
#define DS18B20_H
#포함하다 “stm32f10x.h
#포함하다 “sys.h
#포함하다 “delay.h
#포함하다 “DS18B20.H”
#포함하다 “usart.h

/*Package interface*/

//Initialize DS18B20 to input mode
#define DS18B20_INPUT_MODE() {gpiob->CRH&= 0x0ffffff;gpiob->CRH|=0x80000000;}

//Initialize DS18B20 to output mode
#define DS18B20_OUTPUT_MODE(){gpiob->CRH&= 0x0ffffff;gpiob->CRH|= 0x30000000;}

//DS18B20 IO port output
#define DS18B20_OUT PBout(15)

//DS18B20 IO port input
#define DS18B20_IN PBin(15)

//Function declaration
U8 DS18B20_CRECKACK(무효의);
U8 DS18B20_CHECKDEVICE(무효의);
void ds18b20_init(무효의);
U16 DS18B20_READTEMP(무효의);
U8 DS18B20_READBYTE(무효의);
void ds18b20_writebyte(U8 CMD);
#endif

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png
3.3 Delay function

/*
기능: Delay in us
*/
void DelayUs(int us)
{
#ifdef _SYSTICK_IRQ_
int i,j;
~을 위한(i = 0;iVAL=0; //CNT counter value
SysTick->LOAD=9*us; //9 means 1us
SysTick->CTRL|= 1<<0; //Start timer
do
{
tmp = systick->CTRL; //상태를 읽으십시오
}~하는 동안((!(TMP&1<<16))&&(TMP&1<<0));
SysTick->val = 0; //CNT counter value
SysTick->CTRL&= ~(1<<0); //타이머를 끄십시오
#endif
};i ++)>

3.4 Main.C DS18B20에 전화하여 온도를 읽고 직렬 포트에 인쇄하십시오.

#포함하다 “stm32f10x.h

#포함하다 “DS18B20.H”

U8 DS18B20_ROM[8]; //DS18B20의 64 비트 ROM 코드를 저장하십시오

int 메인(무효의)
{
U16 온도;
usartx_init(USART1,72,115200);//직렬 포트의 초기화 1
DS18B20_INIT(); //DS18B20 초기화

/*1. DS18B20*/의 64 비트 ROM 코드를 읽으십시오.
//Send reset pulse, 존재 펄스를 감지하십시오
~하는 동안(DS18B20_CheckDevice())
{
printf(“DS18B20 장치는 존재하지 않습니다!\N”);
지연(500);
}
//64 비트 ROM 코드를 읽으려면 명령을 보내십시오
DS18B20_WriteByte(0x33);

//루프는 64 비트 ROM 코드를 읽습니다
~을 위한(i = 0;나<8;i ++)
{
DS18B20_ROM[나]= DS18B20_READBYTE();
printf(“DS18B20_ROM[%디]=0x%X\n”,나,DS18B20_ROM[나]);
}

~하는 동안(1)
{
/*2. 동시에 버스에서 모든 DS18B20을 작동하여 온도를 전환하기 시작합니다*/
DS18B20_CheckDevice(); //Send reset pulse, detect pulse
DS18B20_WriteByte(0xCC); //Skip ROM sequence detection
DS18B20_WriteByte(0x44); //Start a temperature conversion (버스의 모든 DS18B20이 온도를 변환하십시오)
지연(500); //라인에서 모든 DS18B20 온도 전환이 완료 될 때까지 기다리십시오.

/*3. 각 ds18b20*/의 온도에 대한 단일 표적 판독 값
DS18B20_CheckDevice(); //Send reset pulse, detect pulse
DS18B20_WriteByte(0x55); //일치하는 명령을 보내십시오
~을 위한(i = 0;나<8;i ++) //64 비트 코드를 보내십시오
{
DS18B20_WriteByte(DS18B20_ROM[나]);
}
DS18B20_WriteByte(0xBE); //Read temperature
temp = ds18b20_readbyte(); //저차 온도 데이터를 읽으십시오
온도|= DS18B20_READBYTE()<<8; //고차 온도 데이터를 읽으십시오
printf(“temp1 =%d.%d n”,온도>>4,온도&0xf);
printf(“temp2 =%f n”,온도*0.0625);

지연(500);
}
}