온도 센서 분석(Ds18b20_ManualConvert)

김지성·2022년 8월 8일
1

Embedded

목록 보기
18/21


ROM Command : One-Wire를 이용하는 장치들이 공통적으로 사용하는 명령어
Function Command : 각 장치마다 가지고 있는 특색을 제어하는 명령어

1) StartAll(Skip ROM : 0xCC0)

모든 slave 장치에게 동시에 명령을 보낼 때 사용

"DS18B20_Start"는 *ROM을 통해 장치 한개만 명령을 보낼 수 있지만, "DS18B20_StartALL"은 "Skip ROM"을 통해 전체 장치에게 명령을 동시에 보낸다.

2) DS18B20_CMD_CONVERTTEMP : 0x44

  • 온도 변환 시작
  • 외부 전원일 경우 : 온도 변환 진행(0), 완료(1) 응답
  • 온도 변환 시간 : 93.75ms(9bit) ~ 750ms(120bit) ---> bit 높을 수록 정확도 상승

3) DS18B20_AllDone

  • AllDone은 OneWire_ReadBit을 통해 1bit를 읽어들이는데, 0이면 온도 변환을 진행중인거고 1이면 온도 변환을 끝낸것이다.
  • !DS18B20_AllDone → 0일 경우 not 연산때문에 1이 되므로 while문을 수행한다.
  • Ds18b20Timeout가 0이 아니라면 if문을 수행하지만(ture) 0이라면 else(false)문을 수행한다.
    (너무 오랫동안 기다려 반응이 없다면 false로 본다, Ds18b20Timeout==0이 반드시 수행되는건 아닌거같다.)

4) DS18B20_Read

DS18B20에는 ROM CODE에는 0x28값인 패밀리 코드가 포함되어 있다. 즉 0x28을 포함하지 않는다면 if문을 수행하고, 0x28을 포함한다면 if문을 통과한다. (이건 좀 추상적인거 같네 무슨 말일까)


1) OneWire_Reset(OneWire) --> 장치 작동 신호 준비
2) OneWire_SelectWithPointer --> DS18B20_Read(OneWire_t OneWire, uint8_t ROM, float *destination); 장치가 4개인 경우, i++를 수행하여 ROM의 주소를 돌아가면서 저장한다.
그리고 OneWire_SelectWithPointer안에는 MATCHROM(0X55)가 있고 주소를 내가 선택한 slave를 작동시킨다.
3) OneWire_WriteByte --> 온도 정보는 SCRATCHPAD에 존재하므로 그 정보를 읽어들이겠다는 뜻이다.


1) SCRATCHPAD에 저장된 온도 정보를 가져오는데 총 8번 수행해야 한다.


1) 오류가 있는지 없는지 검사하는 단계이다. (모드버스에 강의있음)


온도 계산 코드

uint16_t temperature;

temperature = data[0] | (data[1] << 8);

/* Get sensor resolution */
	resolution = ((data[4] & 0x60) >> 5) + 9;

	
	/* Store temperature integer digits and decimal digits */
	digit = temperature >> 4;
	digit |= ((temperature >> 8) & 0x7) << 4;
	
	/* Store decimal digits */
	switch (resolution) 
	{
		case 9:
			decimal = (temperature >> 3) & 0x01;
			decimal *= (float)DS18B20_DECIMAL_STEPS_9BIT;
		break;
		case 10:
			decimal = (temperature >> 2) & 0x03;
			decimal *= (float)DS18B20_DECIMAL_STEPS_10BIT;
		 break;
		case 11: 
			decimal = (temperature >> 1) & 0x07;
			decimal *= (float)DS18B20_DECIMAL_STEPS_11BIT;
		break;
		case 12: 
			decimal = temperature & 0x0F;
			decimal *= (float)DS18B20_DECIMAL_STEPS_12BIT;
		 break;
		default: 
			decimal = 0xFF;
			digit = 0;
	}
	
	/* Check for negative part */
	decimal = digit + decimal;
	if (minus) 
		decimal = 0 - decimal;
	
	
	/* Set to pointer */
	*destination = decimal;
	
	/* Return 1, temperature valid */
	return true;

Q : temperature를 왜 16bit로 지정해놨을까?
A : 만약 8bit로 지정하면 왼쪽으로 8bit로 밀경우 0이 되므로, 왼쪽으로 밀어도 영향이 없는 16bit로 지정한 것이다.

profile
1139일 남음

0개의 댓글